You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:01:07