Azure YAML流水线同一commit多次触发 如何配置使其仅执行一次
Azure DevOps 多标签触发重复运行解决方案
该重复触发属于Azure DevOps流水线默认行为:单次推送操作同时匹配到分支触发规则和多个标签触发规则时,每个匹配到的规则都会独立触发一次流水线运行。
以下是三种可落地的配置方案,可根据实际业务场景选择:
方案1:仅保留标签触发(实现成本最低)
如果master分支仅在打标签时需要运行流水线,可直接关闭分支触发规则,仅保留标签触发:
trigger: branches: include: - none # 关闭所有分支触发逻辑 tags: include: - refs/tags/*
适用场景:master分支普通提交不需要跑流水线,仅打标签的提交需要执行发布流程。
方案2:同Commit去重判断(兼容性最高)
如果需要同时支持master分支普通提交触发、打标签提交触发,可添加重复运行检测逻辑,同一个Commit ID仅执行一次核心流程:
# 原有触发规则保持不变 trigger: branches: include: - master tags: include: - refs/tags/* variables: currentCommitId: $(Build.SourceVersion) jobs: - job: CheckDuplicate steps: - task: PowerShell@2 name: CheckDupStep inputs: targetType: 'inline' script: | $header = @{Authorization = "Bearer $(System.AccessToken)"} $queryUrl = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/builds?definitions=$(System.DefinitionId)&sourceVersion=$(currentCommitId)&statusFilter=inProgress,completed&api-version=7.1-preview.7" $runResult = Invoke-RestMethod -Uri $queryUrl -Headers $header -Method Get $existValidRuns = $runResult.value | Where-Object {$_.id -ne $(Build.BuildId)} if ($existValidRuns.Count -gt 0) { Write-Host "##vso[task.setvariable variable=skipMain;isOutput=true]true" } else { Write-Host "##vso[task.setvariable variable=skipMain;isOutput=true]false" } env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) - job: MainBuildAndPublish dependsOn: CheckDuplicate condition: eq(dependencies.CheckDuplicate.outputs['CheckDupStep.skipMain'], 'false') steps: # 原有所有构建、测试、发布步骤放在该Job下 - script: echo "执行核心流水线逻辑"
适用场景:需要兼容所有触发规则,无论单次推送触发多少次流水线,最终仅执行一次核心流程。使用该方案前需要给流水线服务账号开放对应项目的构建读取权限。
方案3:限制标签触发规则(适配多标签场景)
如果单次推送的多个标签中,仅有特定格式的标签需要触发流水线,可调整标签匹配规则,仅匹配符合要求的标签:
trigger: branches: include: - master tags: include: - refs/tags/release-* # 仅匹配前缀为release-的标签,其余标签不会触发流水线
适用场景:多标签中仅单个标签符合触发规则,直接从触发层面避免重复运行。
内容的提问来源于stack exchange,提问作者Natalia Pokrovskaya
相关产品推荐
相关产品推荐

