问题描述
在将应用程序从 Azure DevOps (ADO) 的经典流水线迁移到 YAML 流水线时,遇到了一个问题。他们的应用程序由多个较小的子应用程序组成,这些子应用程序将被单独部署到多个环境中。由于项目的启动和完成会导致环境的添加和删除,所以环境列表是不固定的。问题是,每次环境列表发生变化时,他们需要更新 20 到 30 个 YAML 文件。
他们已经在代码中广泛使用模板来重用代码。问题是,是否可以有一个主环境和参数列表,在部署时可以读取到每个部署中?
以下是他们使用的流水线代码示例片段 – 对每个环境/阶段调用我们的部署 YAML:
extends:
template: pipelines/main.yml@templates
deployStages:
- template: stages/deploy.yml@templates
parameters:
dependsOn: buildContainer
deploySteps:
- template: ./app-deploy.yml
parameters:
serviceConnection: test
environment: test
poolName: 'Azure Pipelines'
runIfNotMainOrMaster: ${{ eq(parameters.action, 'Deploy') }}
variableGroup: 'test'
- template: stages/deploy.yml@templates
parameters:
dependsOn: deploy_test
deploySteps:
- template: ./app-deploy.yml
parameters:
serviceConnection: staging
environment: stage
poolName: 'Azure Pipelines'
variableGroup: 'staging'
- template: stages/deploy.yml@templates
parameters:
dependsOn: deploy_stage
deploySteps:
- template: ./app-deploy.yml
parameters:
serviceConnection: production
environment: prd1
poolName: 'Azure Pipelines'
variableGroup: 'prd1'
# 其他环境...
解决方案
请注意以下操作可能因工具版本或配置而有所差异,请在执行之前做好备份。
为了在多个 YAML 文件中重用部署阶段,您可以使用 Azure DevOps 提供的一些技术和功能,以及 YAML 的灵活性。以下是解决方案的一些步骤:
-
使用 YAML TEMPLATES: 您已经在代码中使用了模板来重用部分代码。您可以将部署阶段的模板抽取出来,然后在每个环境的 YAML 文件中重用它。这样,当部署阶段发生变化时,您只需要更新一个模板,而不是多个 YAML 文件。
-
使用参数化的模板: 在部署阶段的模板中,您可以使用参数来定义不同的环境和变量。通过传递不同的参数,您可以在每个环境中自定义部署步骤。这样,您可以在不同的环境中重用相同的模板,只需传递不同的参数。
以下是一个简化的示例,演示如何将部署阶段的模板参数化:
# stages/deploy.yml@templates
parameters:
environment: ''
serviceConnection: ''
# 其他参数...
jobs:
- job: Deploy
pool:
name: 'Azure Pipelines'
steps:
- template: ./app-deploy.yml
parameters:
serviceConnection: ${{ parameters.serviceConnection }}
# 其他步骤...
在这个示例中,stages/deploy.yml
是部署阶段的模板,通过参数化,您可以在每个环境中传递不同的环境名称和服务连接。
- 定义主列表文件: 您可以创建一个主列表文件,用于存储环境和参数的主列表。这可以是一个 JSON 文件或 YAML 文件,其中列出了所有环境以及每个环境的参数。然后,在每个环境的 YAML 文件中,您可以读取主列表文件中的信息,以实现动态的环境配置。
以下是一个示例主列表文件的 YAML 结构:
# environments.yaml
environments:
- name: test
serviceConnection: test
# 其他参数...
- name: staging
serviceConnection: staging
# 其他参数...
# 其他环境...
- 在每个环境中读取主列表: 在每个环境的 YAML 文件中,您可以使用 DevOps 的变量和表达式功能来读取主列表文件中的环境和参数信息。通过这种方式,您可以将主列表中的信息注入到每个环境的部署步骤中。
以下是一个示例演示如何在每个环境中读取主列表文件并传递参数:
# azure-pipelines-test.yml
variables:
- name: environments
value: $(System.DefaultWorkingDirectory)/environments.yaml
trigger:
# 触发条件...
pr
jobs:
- job: Deploy
pool:
name: 'Azure Pipelines'
steps:
- script: |
echo "##vso[task.setvariable variable=environment;isOutput=true]$(environments)"
name: SetEnvironment
- template: stages/deploy.yml@templates
parameters:
environment: $[dependencies.SetEnvironment.outputs['SetEnvironment.environment'].name]
serviceConnection: $[dependencies.SetEnvironment.outputs['SetEnvironment.environment'].serviceConnection]
# 其他步骤...
在这个示例中,我们首先定义一个变量 environments
,指向主列表文件的路径。然后,我们使用一个步骤来读取主列表文件的内容,并将环境和参数信息设置为输出变量。最后,在部署阶段的模板中,我们使用表达式来获取输出变量中的环境和参数信息。
通过上述步骤,您可以在每个环境中重用部署阶段的模板,同时根据主列表文件动态配置环境和参数。
结论
通过使用 Azure DevOps 提供的 YAML TEMPLATES 和参数化功能,以及