You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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 "执行构建任务..."

关键配置说明

  1. always: false:
    默认值为true,改为false后,如果分支在两次计划之间没有任何提交,Azure DevOps会直接跳过本次计划触发,减少不必要的流水线启动。但如果有提交但全是[skip ci]的,还是会触发,所以必须配合后续检查步骤。

  2. 提交检查逻辑:

    • 用Azure DevOps CLI获取上次计划运行的时间,精准锁定需要检查的提交范围。
    • git log的--grep="^\[skip ci\]" --invert-match会排除所有以[skip ci]开头的提交;如果你的标记是在注释中间,可以把^\[skip ci\]改成\[skip ci\]来匹配任意位置的标记。
    • 如果没有有效提交,脚本返回exit 1让检查作业失败,后续构建作业会因condition: succeeded()而跳过。
  3. 权限注意事项:
    确保流水线的服务账号(Project Collection Build Service)拥有读取流水线运行记录的权限,否则CLI无法获取上次运行时间。可在流水线的「设置」→「权限」中配置。

替代方案(无需CLI)

如果不想用Azure DevOps CLI,也可以通过对比上次运行的提交ID来判断:

  • 每次流水线成功运行后,把当前分支的最新提交ID存入变量组。
  • 下次计划触发时,用git log 上次提交ID..mybranch来查询新提交,再过滤[skip ci]标记。
    但这种方式需要额外维护变量组,相对繁琐,推荐优先用CLI方案。

内容的提问来源于stack exchange,提问作者martinz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:18:20