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
配置说明
- 需提前创建一个拥有项目读取流水线权限的个人访问令牌,添加为项目CI/CD变量
GITLAB_API_TOKEN。 - 检查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.
相关产品推荐
相关产品推荐

