如何检测GitLab仓库近60分钟内是否有Merge Request被合并?
实现GitLab流水线基于合并MR的条件触发
我希望基于特定条件触发流水线,仅当仓库在过去60分钟内有一个或多个Merge Request被合并时才创建该流水线。请问是否有办法实现这一检测?我已查阅Merge Requests API,但未找到相关特定内容。
当然可以实现,核心思路是在流水线启动前通过GitLab API检测过去60分钟内的合并MR记录,具体方案如下:
1. 用API检测合并MR的脚本实现
你可以在流水线的前置检查步骤里调用Merge Requests API,过滤出过去60分钟内已合并的MR。关键是给API传入这几个参数:
state=merged:只返回已合并的MRupdated_after:设置为当前时间往前推60分钟的UTC时间戳(避免时区误差)per_page=1:只要能查到至少1条结果就够,不用返回所有数据,节省请求资源
示例脚本(可放在.gitlab-ci.yml的检查job中):
# 生成60分钟前的UTC格式时间 START_TIME=$(date -d "-60 minutes" --utc +%Y-%m-%dT%H:%M:%SZ) # 调用API查询符合条件的MR数量 MERGED_MRS_COUNT=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ "https://gitlab.example.com/api/v4/projects/$CI_PROJECT_ID/merge_requests?state=merged&updated_after=$START_TIME&per_page=1" | jq '. | length') # 无符合条件的MR则终止流水线 if [ "$MERGED_MRS_COUNT" -eq 0 ]; then echo "过去60分钟内没有合并的MR,终止流水线" exit 1 fi
注意:需要在项目的变量中配置GITLAB_TOKEN(令牌要有读取MR的权限,比如read_api权限),同时确保runner环境安装了curl和jq工具。
2. 结合GitLab CI规则实现条件触发
把上面的检查逻辑做成一个前置job,后续需要执行的任务通过needs依赖这个检查job,只有检查通过才会继续执行。如果是定时触发的场景(比如每小时跑一次),这种方式尤其适用:
stages: - pre_check - execute_task check_recent_merged_mrs: stage: pre_check script: - START_TIME=$(date -d "-60 minutes" --utc +%Y-%m-%dT%H:%M:%SZ) - MERGED_MRS_COUNT=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "https://gitlab.example.com/api/v4/projects/$CI_PROJECT_ID/merge_requests?state=merged&updated_after=$START_TIME&per_page=1" | jq '. | length') - if [ "$MERGED_MRS_COUNT" -eq 0 ]; then exit 1; fi tags: - your-runner-tag # 替换成你的runner标签 run_target_task: stage: execute_task script: - echo "执行目标任务..." needs: [check_recent_merged_mrs] rules: - if: '$CI_PIPELINE_SOURCE == "schedule"' # 仅定时触发时执行 when: on_success
3. 关键注意点
- 必须用UTC时间戳,否则时区差异可能导致检测结果不准确
- 令牌权限要足够,避免API请求返回403错误
- 如果不需要定时触发,也可以结合webhook等触发方式,在触发前执行相同的检查逻辑
内容的提问来源于stack exchange,提问作者Satish Lokhande
相关产品推荐
相关产品推荐

