Azure DevOps Pipelines如何仅在上次运行成功时触发YAML流水线
可行的3种无额外权限配置方案
方案1:直接使用流水线内置的批量触发+独占锁配置(无需额外任务)
- 首先在你的YAML流水线头部添加
batch: true配置,该配置会自动检测同一定义下是否有正在运行的实例,有则不触发新的定时运行 - 若需要更严格的「上一次必须成功才允许下次运行」规则,可以在流水线关联一个空环境,给环境配置独占锁:
- 到ADO项目的「环境」页面新建一个空环境,命名随意比如
nightly-build-lock - 给该环境添加「独占锁」检查规则
- 在你的YAML流水线的第一阶段添加对该环境的引用:
独占锁会确保同一时间只有一个流水线实例能拿到锁运行,且如果上一次运行失败锁不会自动释放,需要手动驳回/批准,刚好符合不允许失败后自动触发新运行的需求。stages: - stage: PreCheck jobs: - deployment: LockCheck environment: nightly-build-lock strategy: runOnce: deploy: steps: - script: echo "锁检查通过" - 到ADO项目的「环境」页面新建一个空环境,命名随意比如
方案2:用可写入变量组做运行状态标记(仅需流水线权限)
- 新建一个变量组,命名比如
build-status-tracker,添加一个变量lastBuildSucceeded,默认值设为true,勾选「允许在流水线运行时覆盖此值」 - 流水线首步加一个短任务读取该变量,如果值为
false直接终止当前运行:steps: - task: PowerShell@2 condition: eq(variables['lastBuildSucceeded'], 'false') inputs: targetType: 'inline' script: | Write-Host "上一次构建未成功,终止本次定时运行" exit 1 - 流水线最后一步添加更新变量组的任务,成功运行就把
lastBuildSucceeded设为true,失败则设为false,该操作仅用到流水线本身对变量组的编辑权限,不需要额外配置ADO CLI或者服务主体权限。
方案3:用内置REST API + 流水线自带的系统访问令牌调用(无需额外权限配置)
- 不需要单独装ADO CLI,直接用流水线内置的
System.AccessToken调用ADO的REST API获取前次运行状态,只需要给流水线勾选「允许脚本访问OAuth令牌」的权限即可,不需要给服务主体额外加权限:
该方法不需要任何额外的权限配置,内置的系统访问令牌默认就有读取同流水线运行记录的权限。steps: - task: PowerShell@2 inputs: targetType: 'inline' script: | $header = @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" } $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/builds?definitions=$env:SYSTEM_DEFINITIONID&`$top=1&queryOrder=finishTimeDescending&api-version=7.1-preview.7" $lastBuild = Invoke-RestMethod -Uri $url -Headers $header -Method Get if ($lastBuild.value[0].result -ne "succeeded") { Write-Host "上一次构建未成功,终止本次运行" exit 1 } env: SYSTEM_ACCESSTOKEN: $(System.AccessToken)
内容的提问来源于stack exchange,提问作者silent
相关产品推荐
相关产品推荐

