如何在 Azure DevOps 中设置 CI 以让它使用不同的环境应用程序设置?

How to setup CI in Azure DevOps to let it used different environment app settings?

我有一个 API,它被包装成 Docker 图片并且有 3 个不同的应用程序设置文件,它们是 appsettings.Development.jsonappsettings.QA.jsonappsettings.Production.json,它们每个都包含用于不同环境需求的连接字符串。以及用于其他常用凭证的主要 appsettings.json

我已经使用 CI 中的环境变量来替换以下行:

ENV ASPNETCORE_ENVIRONMENT #{environment-profile}#
...
ENTRYPOINT ["dotnet", "Api.dll", "--environment=#{environment-profile}#"]

environment-profile = 我目前的发展 CI.

不过,我想让它像environment-profile那样可以变通吗?比如当我想部署到另一个环境时,比如 QA。 environment-profile 可以切换到 QA 而无需在 CI 管道中手动更改它?

有没有办法做我想做的事?或者人们在 CI/CD 管道中调整不同环境应用程序设置的正常方式是什么?

如有帮助,不胜感激!

如果 ASPNETCORE_ENVIRONMENT 环境变量在您的 docker 文件中定义如下。 ENTRYPOINT 中的 --environment=#{environment-profile}# 不是指 ASPNETCORE_ENVIRONMENT 环境变量。您刚刚将 --environment 分配给值 #{environment-profile}#.

ENV ASPNETCORE_ENVIRONMENT #{environment-profile}#
...
ENTRYPOINT ["dotnet", "Api.dll", "--environment=#{environment-profile}#"]

我想您在 CI 管道中正确使用了替换令牌任务,用管道中定义的变量替换了 docker 文件中的 #{environment-profile}#

为了使 environment-profile 变得灵活,如果您不想更改 docker 文件。您可以继续使用上述方式使用替换令牌任务替换 environment-profile。您需要做的就是使您在管道中定义的变量 Settabe at queue time。见下文:勾选Settabe at queue time使其可设置

然后当您 运行 再次通过管道部署到 QA 环境。您只需单击变量即可将变量 environment-profile 更新为 QA

但我建议使用 ARG 而不是 ENV 并将 ARG 设置为 docker 构建任务中的 Pipeline 变量:见下文:

首先,更改您的 docker 文件,如下所示:

ARG ASPNETCORE_ENVIRONMENT 
...
ENTRYPOINT ["dotnet", "Api.dll", "--environment=$ASPNETCORE_ENVIRONMENT"]

然后添加 Build Arguments 如下所示,将管道变量 environment-profile 分配给 ARG ASPNETCORE_ENVIRONMENT.

当您 运行 管道部署到不同的环境时。您需要在 Run Pipeline page.

处相应地更新变量的值

如果您使用的是 yaml 管道。您可以使用 runtime parameters,这将使您能够在 运行 管道时 select 环境。

parameters:
- name: Environment-Profile
  type: string
  values:
  - Development 
  - QA
  - Product

....

steps:
- task: Docker@0
  displayName: 'Build an image'
  inputs:
    containerregistrytype: 'Container Registry'
    dockerRegistryConnection: MyDoccker
    dockerFile: '**/dockerfile'
    buildArguments: 'ASPNETCORE_ENVIRONMENT="${{parameters.Environment-Profile}}"'
    defaultContext: false
    context: .

然后当你运行管道。您可以在UI页面select部署哪个环境: