向staging分支新推送时,如何取消旧的暂存流水线?
解决Azure DevOps多条待审批流水线的问题
针对你遇到的staging分支推送修复后,多条流水线等待Production审批的问题,这里有几个直接可行的解决办法:
方案一:通过环境配置自动取消旧待审批部署(最简便)
直接在Production环境的审批设置里开启「自动取消旧待审批请求」:
- 打开Azure DevOps项目的环境面板,找到
production环境 - 点击环境右上角的「...」选择「编辑」
- 切换到「部署审批」标签,找到「当有新的部署请求时」,选择取消当前正在等待的部署
- 保存设置
之后新流水线触发时,所有之前处于待审批状态的旧Production部署会被自动取消,只保留最新的一条等待审批。
你也可以直接在流水线YAML里配置这个规则,把Production阶段的环境配置改成这样:
environment: name: production approval: autoCancelPreviousPendingDeployments: true
方案二:在流水线中添加脚本自动清理旧流水线
如果需要更灵活的控制,可以在Build阶段完成后,添加一个脚本步骤,自动取消同一分支下所有待审批的旧流水线:
在Build job的末尾添加以下步骤:
- script: | # 登录Azure DevOps CLI az devops login --organization "$(System.TeamFoundationCollectionUri)" # 获取当前流水线ID CURRENT_BUILD=$(Build.BuildId) # 查询staging分支下,状态为待审批(notStarted)且ID小于当前的流水线 OLD_BUILDS=$(az pipelines build list \ --project "$(System.TeamProject)" \ --branch staging \ --status notStarted \ --query "[?id < $CURRENT_BUILD].id" \ -o tsv) # 逐个取消旧流水线 for BUILD_ID in $OLD_BUILDS; do echo "Canceling old pending build: $BUILD_ID" az pipelines build cancel --id $BUILD_ID --project "$(System.TeamProject)" done displayName: "Cancel old pending production deployments" env: AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
注意:需要在流水线的「设置」里勾选「允许脚本访问OAuth令牌」,并且确保流水线的服务账号拥有「编辑构建流水线」的权限。
方案三:限制Production阶段仅触发最新构建
你可以修改Production阶段的触发条件,只有当当前构建是staging分支的最新构建时,才进入待审批状态。不过这个方案需要调用API查询最新构建ID,相对复杂一些,前两个方案已经能解决大部分场景。
内容的提问来源于stack exchange,提问作者FatalPaperCut
相关产品推荐
相关产品推荐

