如何在 devops Azure 管道中设置 process.env.var

Ill*_*lia 8 azure-devops asp.net-core create-react-app

我的任务是将 aspnet 核心 React 应用程序部署到 2 个不同的环境:开发环境和生产环境。每个环境都应单独配置。

我将 Azure DevOps 用于 CI/CD

AspNet 项目包含以下用于构建应用程序的命令

    <Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
    <Exec WorkingDirectory="$(SpaRoot)" Command="npm run build" />
Run Code Online (Sandbox Code Playgroud)

我使用 adal 进行授权,这就是为什么我必须传递一些对于 Dev 和 Prod 不同的秘密变量

const adalConfig = {
    tenant: process.env.REACT_APP_TENANT,
    clientId: process.env.REACT_APP_CLIENT_ID,
    redirectUri: process.env.REACT_APP_REDIRECT_URI,
Run Code Online (Sandbox Code Playgroud)

在 Azure devops 中,我使用以下命令设置参数:

echo ##vso[task.setvariable variable=REACT_APP_TENANT;isOutput=true]c00000-00ce-000-0f00-0000000004000
Run Code Online (Sandbox Code Playgroud)

在 azure devops 中,我有下一个用于 aspnet 核心构建应用程序的标准命令

  • .Net 核心安装程序
  • 资源
  • 运行命令(设置环境变量)
  • 建造
  • 发布

问题:

  1. 未设置环境变量。
  2. 我什至不知道如何为生产而不是为开发构建另一个人工制品。

也许您已经有将核心反应应用程序部署到 2 个不同环境的任务?或者,如果我需要更改部署策略,请提供建议。

我发现的唯一解决方案是使用 .env 文件,但我必须将此文件提交给 git - 从 master 部署它。而且我仍然不知道如何为 dev 和 prod 使用不同的文件。

qbi*_*bik 1

太长了;

  1. 你有isOutput=true你的task.setvariable指挥。这仅在 Pipelines 引擎中设置一个变量,以供其他步骤使用,但实际上并不映射到环境变量。删除isOutput后您将看到REACT_APP_TENANTenv 变量。
  2. 但仅限于以下步骤 - env 变量在同一管道步骤中无法立即访问。
  3. 如果您预先知道变量的值,则可以在管道级别定义变量- 这应该会简化事情。task.setvariable对于动态变量更有用。
  4. 如果您需要针对不同环境的不同流程(或不同的变量集),我建议使用多阶段 YAML 管道经典 Releases。它们都允许设置不同的阶段,每个阶段都有自己的变量集。

很长的故事

我们需要区分两个独立的过程:

  1. 在 CI 代理上执行的部署管道
  2. 可以通过多种不同方式托管的 Web 应用程序 - Azure Web Apps、自托管、docker/k8s 等。

在管道中设置echo ##vso[task.setvariable ...]变量 (1.)。

读取变量的地方(如tenant: process.env.REACT_APP_TENANT)并不那么明显。如果它是nodejs服务器端代码,它将在2中执行。如果它是某个构建脚本的一部分,它将在1中读取。

React 很棘手,因为:

  • 在开发和发布模式下的反应行为不同。在发布模式下,在构建阶段,整个客户端代码被编译为静态 JS 文件。因此,您在管道中设置的环境变量应该可以工作。
  • 它不能简单地访问任何环境变量(以防止您意外地在客户端浏览器上暴露服务器环境变量)。如果使用create-react-app(这是 ASP.NET React 应用程序默认执行的操作),则必须在env 变量前加上前缀REACT_APP_才能使用它们。如果直接使用 Webpack,您将需要一些插件。