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

如何在Azure DevOps YAML流水线部署已跳过环境的现有版本?

解决Azure DevOps YAML流水线跳过Prod后无法单独部署的问题

以下是几个实用的解决方案,适配你的场景:

方案1:拆分构建与发布流水线(推荐,贴近经典流水线体验)

把构建和部署阶段拆成两个独立流水线:

  • 构建流水线:仅负责编译代码、生成工件,并将工件发布到Azure DevOps的工件库(或流水线工件)。
  • 发布流水线:以构建流水线的输出为工件源,定义Dev、UAT、Prod三个部署阶段,各阶段可设置依赖关系或手动审批。

你可以随时在发布流水线中选择任意已完成的构建版本,直接部署到Prod环境,无需重新运行构建流程。

方案2:在同一YAML中使用运行时参数+条件控制

修改原YAML流水线,添加参数控制Prod阶段的触发,并支持指定历史构建版本的工件:

  1. 在YAML顶部添加运行时参数:
parameters:
  - name: targetStage
    type: string
    default: 'UAT'
    values:
      - 'Build'
      - 'Dev'
      - 'UAT'
      - 'Prod'
  - name: useExistingArtifact
    type: boolean
    default: false
  - name: artifactVersion
    type: string
    default: ''
  1. 给每个阶段添加条件,仅运行目标阶段及前置依赖(如果使用新工件):
stages:
  - stage: Build
    condition: or(eq(parameters.targetStage, 'Build'), eq(parameters.targetStage, 'Dev'), eq(parameters.targetStage, 'UAT'), eq(parameters.targetStage, 'Prod'), not(parameters.useExistingArtifact))
    jobs:
      - job: BuildJob
        steps:
          # 构建步骤
          - publish: $(Build.ArtifactStagingDirectory)
            artifact: drop

  - stage: Dev
    dependsOn: Build
    condition: or(eq(parameters.targetStage, 'Dev'), eq(parameters.targetStage, 'UAT'), eq(parameters.targetStage, 'Prod'))
    jobs:
      - job: DeployDev
        steps:
          # Dev部署步骤

  - stage: UAT
    dependsOn: Dev
    condition: or(eq(parameters.targetStage, 'UAT'), eq(parameters.targetStage, 'Prod'))
    jobs:
      - job: DeployUAT
        steps:
          # UAT部署步骤

  - stage: Prod
    dependsOn: UAT
    condition: eq(parameters.targetStage, 'Prod')
    jobs:
      - job: DeployProd
        steps:
          # 拉取指定版本工件
          - download: builds
            artifact: drop
            specificVersion: true
            version: ${{ parameters.artifactVersion }}
            condition: ${{ parameters.useExistingArtifact }}
          # Prod部署步骤

当UAT完成后需要部署Prod时:

  • 手动触发流水线,选择targetStage为Prod
  • 勾选useExistingArtifact,并填写之前构建的版本号(可从构建历史中获取)
  • 流水线会直接跳过Build、Dev、UAT阶段,仅运行Prod并拉取指定版本的工件

方案3:通过环境变量触发Prod阶段

修改Prod阶段的条件,使其可通过手动设置变量触发:

  1. 修改Prod阶段的YAML:
- stage: Prod
  dependsOn: UAT
  condition: and(succeeded('UAT'), eq(variables['DeployProd'], 'true'))
  jobs:
    - job: DeployProd
      steps:
        # Prod部署步骤
  1. 首次运行流水线时,不设置DeployProd变量,Prod阶段会因条件不满足而未执行(非跳过)
  2. 当UAT完成后,找到该次流水线运行记录,点击「重新运行」,在变量设置中添加DeployProd=true,选择仅运行Prod阶段即可

关键注意点

  • 不要直接跳过Prod阶段,而是用条件让其处于「未执行」状态,这样才能重新触发
  • 确保构建工件保留足够长的时间,避免部署时工件已被清理

内容的提问来源于stack exchange,提问作者rdhaundiyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:35:34