在多个YAML中重用部署阶段

86次阅读
没有评论

问题描述

在将应用程序从 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 的灵活性。以下是解决方案的一些步骤:

  1. 使用 YAML TEMPLATES: 您已经在代码中使用了模板来重用部分代码。您可以将部署阶段的模板抽取出来,然后在每个环境的 YAML 文件中重用它。这样,当部署阶段发生变化时,您只需要更新一个模板,而不是多个 YAML 文件。

  2. 使用参数化的模板: 在部署阶段的模板中,您可以使用参数来定义不同的环境和变量。通过传递不同的参数,您可以在每个环境中自定义部署步骤。这样,您可以在不同的环境中重用相同的模板,只需传递不同的参数。

以下是一个简化的示例,演示如何将部署阶段的模板参数化:

# 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 是部署阶段的模板,通过参数化,您可以在每个环境中传递不同的环境名称和服务连接。

  1. 定义主列表文件: 您可以创建一个主列表文件,用于存储环境和参数的主列表。这可以是一个 JSON 文件或 YAML 文件,其中列出了所有环境以及每个环境的参数。然后,在每个环境的 YAML 文件中,您可以读取主列表文件中的信息,以实现动态的环境配置。

以下是一个示例主列表文件的 YAML 结构:

# environments.yaml
environments:
  - name: test
    serviceConnection: test
    # 其他参数...
  - name: staging
    serviceConnection: staging
    # 其他参数...
# 其他环境...
  1. 在每个环境中读取主列表: 在每个环境的 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 和参数化功能,以及

正文完