在Azure YAML流水线中设置多环境发布流程的正确方法

99次阅读
没有评论

问题描述

在从TFS 2018迁移到Azure DevOps Services后,尝试使用新的Azure YAML流水线,但在设置多环境发布流程时遇到了困难。
用户的需求如下:
1. 在将PR推送到develop分支时运行构建/测试流水线。
2. 在将提交推送到develop分支时,运行完整的CI/CD流水线,包括构建、测试和部署到DEV和QA环境。
3. 在将提交推送到master分支时,部署到生产预备环境(production-staging环境)。

用户希望遵循”build once, deploy many”的模式,即构建一次,部署到多个环境。

解决方案

步骤1:使用YAML模板和参数

为了避免在每个流水线中重复的任务,可以将部署到DEV、QA和Staging-Production环境的步骤封装成一个YAML模板。利用参数,可以为每个环境传递不同的设置。

步骤2:创建不同的阶段

在流水线中,为每个环境创建一个阶段(stage),并在阶段内部引用上述的YAML模板。利用条件,可以控制代码何时部署到特定的环境。

以下是一个示例的流水线YAML代码的伪代码:

trigger:
  batch: true
  branches:
    include:
      - master
      - develop

stages:
- stage: DevStage
  jobs:
    - template: '../DeploymentTemplate.yaml'
      parameters:
        EnvironmentName: Dev
        ServerName: MyDevServer

- stage: QaStage
  jobs:
    - template: '../DeploymentTemplate.yaml'
      parameters:
        EnvironmentName: QA
        ServerName: MyQAServer

- stage: ProdStage
  condition: and(
    succeeded('DevStage', 'QaStage'),
    eq(variables['Build.SourceBranch'], 'refs/heads/master')
  )
  jobs:
    - template: '../DeploymentTemplate.yaml'
      parameters:
        EnvironmentName: Staging-Production
        ServerName: MyStagingProdServer

在上述示例中,我们首先设置了触发器,只有当提交到masterdevelop分支时才会触发流水线。然后,我们创建了三个不同的阶段:DevStageQaStageProdStage,每个阶段内部使用了同一个部署模板。利用条件,我们确保只有当DevStageQaStage都成功完成,并且提交是在master分支时,才会触发ProdStage

步骤3:编写部署模板

创建一个YAML模板,将部署到不同环境的任务封装在其中。在模板中使用参数,以适应不同的环境设置。例如:

parameters:
- name: EnvironmentName
  type: string
- name: ServerName
  type: string

jobs:
- job: DeployJob
  steps:
    - script: echo Deploying to ${{ parameters.EnvironmentName }} environment on server ${{ parameters.ServerName }}

在上述模板中,我们使用了两个参数EnvironmentNameServerName,分别表示环境名称和服务器名称。根据这些参数,我们可以在每个环境上执行相应的部署任务。

总结

通过使用YAML模板和参数,以及设置不同条件的阶段,您可以实现”build once, deploy many”的部署流程,避免了在多个流水线中重复编写相同的任务。这将使您的流水线更加清晰、简洁,并且易于维护。

请注意,上述代码示例可能需要根据您的实际情况进行调整,以适应您的项目结构和要求。

在实际操作时,请务必仔细测试流水线和部署流程,以确保一切正常运行。

正文完