在Azure DevOps的构建验证管道中修改文件会持续触发重新执行

编程语言 2026-07-12

我有一个仓库,实现了使用 commitizen 的自动版本控制。合并到main之后处理版本升级很简单,我有一个简单的流水线来执行 cz bump,然后把该提交和标签推送回仓库。

我想使用一个在拉取请求期间运行的构建验证流水线——需要在创建拉取请求时以及每次更新时都运行测试。我还需要它有正确的版本控制,这样我就能把“release candidate”文件推送到一个供测试的人使用的仓库。

问题在于,对源分支所做的任何变更,即使在提交信息中设置 [skip ci],也会导致流水线再次立即运行,从而产生无限的流水线运行循环。

trigger: none

pool:
  vmImage: ubuntu-latest

steps:
- checkout: self
  displayName: 'Checkout code'
  fetchDepth: 0
  fetchTags: true
  persistCredentials: true

- task: Bash@3
  displayName: 'Prepare RC version'
  inputs:
    targetType: 'inline'
    script: |
      git status

      # Switch to the PR branch (e.g. /refs/heads/my-feature-branch)
      BRANCH_NAME=$(echo $SYSTEM_PULLREQUEST_SOURCEBRANCH | sed 's|refs/heads/||')
      echo "Switching to branch: $BRANCH_NAME"
      git checkout $BRANCH_NAME

      # Bump the version with a prerelease tag, and a commit template that includes [skip ci]
      cz bump --yes --prerelease rc

      git push --follow-tags

如果真的必须,我可以跳过使用“正确的”版本号(例如 v2.3.4-rc5),并跳过把提交和标签推回去,只使用 PR_IDPR_ITERATION 来创建一个唯一的版本。问题在于,这样做不会被保留在仓库中,因此我就无法把测试结果与背后的源代码进行对比。

解决方案

[skip-ci] 或它的任何其他变体从设计上就不适用于Build Validation的运行:https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/azure-repos-git?view=azure-devops&tabs=yaml#pr-triggers
你需要自己实现它,可能像这样:

LAST_COMMIT_MSG=$(git log -1 --pretty=%B)

if echo "$LAST_COMMIT_MSG" | grep -q "\[skip ci\]"; then
  echo "##vso[task.logissue type=warning]skip-checks: true detected, cancelling pipeline."
  echo "##vso[task.complete result=Skipped;]SKIPPED"
  exit 0
fi

如果最后一次提交信息中包含 [skip ci] 短语,它将把该任务标记为跳过,并且你可以基于该任务的状态来对剩余的流水线进行条件控制。这让流水线历史保持某种一致性,因为这些任务/作业/阶段在历史中会显示为已跳过。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章