如何配置Azure DevOps定时流水线并排除含[skip ci]的提交?
Azure DevOps计划流水线按需触发(仅当有有效提交时运行)
核心问题说明
你当前的配置里,计划触发(schedules)默认不受[skip ci]标记影响——[skip ci]仅对代码推送、PR触发生效,定时计划会无视这个标记,只要到点就触发。哪怕分支里只有带[skip ci]的提交,流水线还是会跑。
解决方案:先检查再执行
保留原计划配置,但新增一个前置检查作业,先判断分支在上次计划运行后是否存在不含[skip ci]的提交,没有就直接终止流水线,有则继续执行后续构建。
完整YAML配置示例
trigger: none schedules: - cron: "0 0 * * *" displayName: 'Nightly Build' branches: include: - mybranch always: false # 开启后,分支无任何新提交时直接不触发计划(可选,但能减少无效触发) jobs: - job: CheckValidCommits displayName: 检查有效提交 steps: # 拉取完整提交历史,否则无法查询上次运行后的提交 - checkout: self fetchDepth: 0 - script: | # 用Azure DevOps CLI获取该流水线上次计划触发的时间 LAST_RUN_DATE=$(az pipelines run list --pipeline-name "$(Build.DefinitionName)" --branch mybranch --query "[?triggerInfo.scheduleName=='Nightly Build'] | [0].createdDate" -o tsv) # 转换为Git可识别的UTC日期格式 LAST_RUN_DATE_FORMATTED=$(date -d "$LAST_RUN_DATE" +"%Y-%m-%dT%H:%M:%SZ") # 查询上次运行以来的提交,排除所有带[skip ci]标记的提交 VALID_COMMITS=$(git log --since="$LAST_RUN_DATE_FORMATTED" --grep="^\[skip ci\]" --invert-match --oneline mybranch) if [ -z "$VALID_COMMITS" ]; then echo "❌ 上次计划运行后无有效提交(所有提交都带[skip ci]),终止流水线" exit 1 else echo "✅ 找到有效提交,继续执行构建" echo "有效提交列表:" echo "$VALID_COMMITS" fi displayName: 校验提交是否符合要求 env: AZURE_DEVOPS_EXT_PAT: $(System.AccessToken) # 用系统令牌授权CLI操作 # 实际构建作业,仅当检查通过时执行 - job: BuildAndDeploy displayName: 构建与部署 dependsOn: CheckValidCommits condition: succeeded() steps: # 这里替换成你的实际构建、部署步骤 - script: echo "执行构建任务..."
关键配置说明
always: false:
默认值为true,改为false后,如果分支在两次计划之间没有任何提交,Azure DevOps会直接跳过本次计划触发,减少不必要的流水线启动。但如果有提交但全是[skip ci]的,还是会触发,所以必须配合后续检查步骤。提交检查逻辑:
- 用Azure DevOps CLI获取上次计划运行的时间,精准锁定需要检查的提交范围。
git log的--grep="^\[skip ci\]" --invert-match会排除所有以[skip ci]开头的提交;如果你的标记是在注释中间,可以把^\[skip ci\]改成\[skip ci\]来匹配任意位置的标记。- 如果没有有效提交,脚本返回
exit 1让检查作业失败,后续构建作业会因condition: succeeded()而跳过。
权限注意事项:
确保流水线的服务账号(Project Collection Build Service)拥有读取流水线运行记录的权限,否则CLI无法获取上次运行时间。可在流水线的「设置」→「权限」中配置。
替代方案(无需CLI)
如果不想用Azure DevOps CLI,也可以通过对比上次运行的提交ID来判断:
- 每次流水线成功运行后,把当前分支的最新提交ID存入变量组。
- 下次计划触发时,用
git log 上次提交ID..mybranch来查询新提交,再过滤[skip ci]标记。
但这种方式需要额外维护变量组,相对繁琐,推荐优先用CLI方案。
内容的提问来源于stack exchange,提问作者martinz
相关产品推荐
相关产品推荐

