在Azure DevOps的构建验证管道中修改文件会持续触发重新执行
我有一个仓库,实现了使用 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_ID 和 PR_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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。