如何通过单条Azure DevOps YAML流水线部署至不同环境与地区
解决方案:动态加载变量实现单阶段多环境多地区部署
1. 拆分变量文件
按环境+地区的维度拆分变量文件,采用统一命名规则以便动态引用:
vars-test-A.yml(测试环境A地区)vars-test-B.yml(测试环境B地区)vars-prod-A.yml(生产环境A地区)vars-prod-B.yml(生产环境B地区)
每个文件定义对应环境/地区的专属参数,例如vars-test-A.yml:
variables: stageDescription: "部署至测试环境A地区" cosmosDbContainer: "test-container-a" webAppName: "webapp-test-a" azureServiceConnection: "Azure-Test-A"
2. 主流水线YAML实现
根据需求提供两种常用实现方式:
方式一:自动遍历所有环境+地区组合(并行部署)
通过作业矩阵自动生成所有环境和地区的部署实例,保持单阶段结构:
stages: - stage: Deploy_App displayName: "部署Web应用" jobs: - job: Deploy displayName: "部署至${{ matrix.environment }}-${{ matrix.region }}" # 定义环境和地区的矩阵组合 strategy: matrix: Test-A: targetEnv: test targetRegion: A Test-B: targetEnv: test targetRegion: B Prod-A: targetEnv: prod targetRegion: A Prod-B: targetEnv: prod targetRegion: B variables: # 动态加载对应环境+地区的变量文件 - template: vars-${{ matrix.targetEnv }}-${{ matrix.targetRegion }}.yml # 引用关联Azure Key Vault的变量组 - group: AzureKeyVault-VariableGroup steps: # 复用的部署步骤,所有参数通过变量引用 - script: echo "开始执行:${{ variables.stageDescription }}" - task: AzureWebApp@1 inputs: azureSubscription: "${{ variables.azureServiceConnection }}" appName: "${{ variables.webAppName }}" package: "$(Build.ArtifactStagingDirectory)/**/*.zip" - task: AzureCosmosDB@4 inputs: azureSubscription: "${{ variables.azureServiceConnection }}" databaseName: "${{ variables.cosmosDbDatabase }}" containerName: "${{ variables.cosmosDbContainer }}"
方式二:手动选择目标环境和地区(单次部署)
通过流水线参数让用户手动选择部署目标,适合按需部署场景:
# 定义流水线参数,供用户选择目标环境和地区 parameters: - name: targetEnv type: string values: - test - prod default: test - name: targetRegion type: string values: - A - B default: A stages: - stage: Deploy_App displayName: "部署至${{ parameters.targetEnv }}-${{ parameters.targetRegion }}" variables: # 根据参数动态加载变量文件 - template: vars-${{ parameters.targetEnv }}-${{ parameters.targetRegion }}.yml - group: AzureKeyVault-VariableGroup jobs: - job: Deploy steps: # 复用的部署步骤,与方式一完全一致 - script: echo "开始执行:${{ variables.stageDescription }}" - task: AzureWebApp@1 inputs: azureSubscription: "${{ variables.azureServiceConnection }}" appName: "${{ variables.webAppName }}" package: "$(Build.ArtifactStagingDirectory)/**/*.zip" - task: AzureCosmosDB@4 inputs: azureSubscription: "${{ variables.azureServiceConnection }}" databaseName: "${{ variables.cosmosDbDatabase }}" containerName: "${{ variables.cosmosDbContainer }}"
3. 进阶优化:环境依赖控制
如果需要测试环境部署成功后才能触发生产部署,可拆分阶段并添加依赖条件:
stages: - stage: Deploy_Test displayName: "部署测试环境" jobs: - job: Deploy_Test_Jobs strategy: matrix: Test-A: { targetEnv: test, targetRegion: A } Test-B: { targetEnv: test, targetRegion: B } variables: - template: vars-${{ matrix.targetEnv }}-${{ matrix.targetRegion }}.yml - group: AzureKeyVault-VariableGroup steps: - script: echo "测试环境部署:${{ variables.stageDescription }}" # ...其他部署任务 - stage: Deploy_Prod displayName: "部署生产环境" dependsOn: Deploy_Test condition: succeeded('Deploy_Test') jobs: - job: Deploy_Prod_Jobs strategy: matrix: Prod-A: { targetEnv: prod, targetRegion: A } Prod-B: { targetEnv: prod, targetRegion: B } variables: - template: vars-${{ matrix.targetEnv }}-${{ matrix.targetRegion }}.yml - group: AzureKeyVault-VariableGroup steps: - script: echo "生产环境部署:${{ variables.stageDescription }}" # ...其他部署任务
核心逻辑说明
- 所有环境/地区的差异通过变量文件隔离,部署步骤完全复用,避免重复代码
- 通过表达式
vars-${{ ... }}.yml动态加载对应变量文件,实现参数自动切换 - 关联Azure Key Vault的变量组可全局或阶段级引用,敏感变量无需硬编码
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

