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

Gitlab CI:仅当main分支有新提交时触发每日定时流水线

GitLab CE 13.2.1 定时构建仅在main分支有新提交时触发的解决方案

在GitLab CE 13.2.1版本中,仅通过workflow配置无法直接实现该需求——因为workflow的规则判断仅能依赖预定义变量或静态条件,无法在流水线初始化阶段动态执行Git提交对比逻辑。不过可以结合workflow与轻量检查逻辑,或者采用外部触发的方式,尽可能避免无效流水线污染列表。

方案一:结合workflow与前置检查(减少无效流水线干扰)

通过添加前置检查job,在定时触发的流水线中先判断是否有新提交,无新提交则终止后续任务,流水线标记为“已完成”而非失败,降低列表污染。

配置示例

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "main"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_PIPELINE_SOURCE == "tag_push"'
    - if: '$CI_PIPELINE_SOURCE == "schedule"'

stages:
  - check
  - build

# 定时流水线专属检查任务
check_new_commits:
  stage: check
  script:
    # 获取最近一次成功的定时流水线提交ID
    - LAST_SCHEDULED_COMMIT=$(curl --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines?source=schedule&status=success&per_page=1" | jq -r '.[0].sha')
    # 获取main分支最新提交ID
    - CURRENT_MAIN_COMMIT=$(git rev-parse origin/main)
    # 无新提交则终止流水线
    - if [ "$LAST_SCHEDULED_COMMIT" == "$CURRENT_MAIN_COMMIT" ]; then echo "No new commits on main, aborting"; exit 0; fi
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
  tags:
    - shell-runner # 指定你的shell executor runner标签

# 构建任务仅在非定时触发,或定时触发且检查通过时执行
build_job:
  stage: build
  script:
    # 替换为你的实际构建逻辑
    - echo "Running main branch build..."
  rules:
    - if: '$CI_PIPELINE_SOURCE != "schedule"'
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      needs: [check_new_commits]
      allow_failure: false

配置说明

  1. 需提前创建一个拥有项目读取流水线权限的个人访问令牌,添加为项目CI/CD变量GITLAB_API_TOKEN。
  2. 检查job无新提交时会正常退出,后续构建任务不会执行,流水线仅保留一个无实际操作的记录,不会产生无效构建步骤。

方案二:外部cron触发(完全避免无效流水线)

如果允许使用外部脚本,可在服务器上设置cron任务,定时执行提交对比逻辑,仅当main分支有新提交时才调用GitLab API触发流水线,从根源上避免无效流水线。

脚本逻辑示例(伪代码)

#!/bin/bash
# 获取main分支最新提交ID
CURRENT_COMMIT=$(git ls-remote https://gitlab.example.com/your/project.git refs/heads/main | cut -f1)
# 获取最近一次成功构建的提交ID(通过GitLab API)
LAST_BUILT_COMMIT=$(curl --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://gitlab.example.com/api/v4/projects/123/pipelines?source=schedule&status=success&per_page=1" | jq -r '.[0].sha')

if [ "$CURRENT_COMMIT" != "$LAST_BUILT_COMMIT" ]; then
  # 触发main分支流水线
  curl --request POST --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://gitlab.example.com/api/v4/projects/123/pipeline?ref=main"
fi

说明

将该脚本设置为每日午夜定时执行,仅在检测到新提交时触发流水线,不会产生任何无效流水线记录,是最优雅的解决方案。

注:GitLab 13.2.1的workflow功能较为基础,后续版本(14.0+)增强了动态判断能力,但在当前版本下,上述方案是最贴合需求的实现方式。

内容的提问来源于stack exchange,提问作者A.G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:48:21