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

YAML发布流水线:阶段部署失败后自动重发上次成功版本方案

在YAML流水线中实现失败自动重新部署上次成功版本的方案

Classic Release Pipeline的Auto-redeploy Trigger没有直接的YAML等价功能,但可以通过记录成功版本+失败触发回滚阶段的组合方式复刻该能力,以下是最佳实践:

1. 记录各阶段的成功部署版本

首先需要在每个阶段部署成功后,把当前生效的Artifact版本(比如构建ID、包版本号)持久化存储,推荐用Azure DevOps的变量组来统一管理,方便跨流水线读取:

  • 在Azure DevOps中创建一个变量组(比如StageSuccessVersions),为每个环境添加对应的变量(如ProdLastSuccess、TestLastSuccess)。
  • 在部署阶段的末尾添加一个仅在阶段成功时执行的任务,更新变量组中的对应值。以PowerShell任务为例:
    # 需要确保流水线的服务账号拥有变量组的编辑权限
    az pipelines variable-group variable update `
      --group-id <你的变量组ID> `
      --name ProdLastSuccess `
      --value $(Build.BuildId) `
      --org $(System.CollectionUri) `
      --project $(System.TeamProject) `
      --token $(System.AccessToken)
    
    这里的$(Build.BuildId)可以替换为你的Artifact唯一标识(如NuGet包版本、容器镜像标签)。

2. 失败触发重新部署逻辑

在主部署阶段失败后,自动触发一个专门的回滚/重新部署阶段,读取之前记录的成功版本进行部署:

YAML示例片段

stages:
  # 主部署阶段
  - stage: Deploy_Production
    jobs:
      - job: Deploy
        steps:
          - task: AzureWebApp@1
            displayName: '部署生产环境Web应用'
            inputs:
              azureSubscription: 'Azure-Prod-Sub'
              appName: 'Prod-WebApp'
              package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
            continueOnError: false
          # 仅在部署成功时记录版本
          - task: PowerShell@2
            displayName: '更新生产环境成功版本记录'
            condition: succeeded()
            inputs:
              targetType: 'inline'
              script: |
                az pipelines variable-group variable update --group-id 123 --name ProdLastSuccess --value $(Build.BuildId) --org $(System.CollectionUri) --project $(System.TeamProject) --token $(System.AccessToken)

  # 失败自动触发的重新部署阶段
  - stage: Redeploy_Last_Successful
    dependsOn: Deploy_Production
    # 仅当主部署阶段失败时运行
    condition: failed('Deploy_Production')
    jobs:
      - job: Redeploy
        steps:
          - task: AzureWebApp@1
            displayName: '重新部署生产环境上次成功版本'
            inputs:
              azureSubscription: 'Azure-Prod-Sub'
              appName: 'Prod-WebApp'
              # 读取变量组中存储的上次成功版本
              package: '$(Pipeline.Workspace)/drop/$(ProdLastSuccess).zip'

3. 关键注意事项

  • Artifact保留策略:确保你的Artifact存储(Azure Artifacts、Blob存储等)保留了历史版本,否则无法拉取到上次成功的包。
  • 权限配置:流水线的服务账号需要具备变量组的编辑权限,以及Artifact存储的读取权限。
  • 避免无限循环:可以给重新部署阶段添加重试次数限制(比如maxAttempts: 2),防止因上次成功版本也部署失败导致的重复触发。
  • 多环境扩展:为每个环境单独设置成功版本变量,避免不同环境的版本记录互相干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:45:10