如何使用GitLab API处理GitHub合并选项并限制非近期流水线的合并请求
解决方案
问题1:使用GitLab API处理GitHub平台的合并选项
GitLab API仅能操作GitLab内部资源,无法直接管控GitHub的合并设置。根据需求场景分两种情况处理:
场景A:在GitLab中配置对标GitHub的合并选项
如果是想在GitLab项目里设置类似GitHub的合并规则(比如合并方式、分支清理),用GitLab API的/projects/:id/merge_requests/settings端点修改:
示例请求(PUT方法):
curl --request PUT --header "PRIVATE-TOKEN: <你的GitLab访问令牌>" \ "https://gitlab.example.com/api/v4/projects/<项目ID>/merge_requests/settings" \ --form "merge_method=ff" \ --form "delete_source_branch_after_merge=true"
关键参数说明:
merge_method:可选ff(快进合并)、merge(创建合并提交)、squash(压缩合并),对应GitHub的合并方式选项delete_source_branch_after_merge:布尔值,合并后自动删除源分支,和GitHub的同名功能一致
场景B:通过GitLab流水线间接处理GitHub合并请求
如果要在GitLab CI/CD里操作GitHub的合并选项,需要在流水线中调用GitHub API(而非GitLab API),GitLab仅作为执行环境。比如用GitHub个人访问令牌调用GitHub的合并请求API来设置合并方式、完成合并等。
问题2:配置规则阻止10小时内未运行流水线的合并请求
GitLab没有直接的“按流水线运行时间限制合并”的内置规则,需要结合CI检查作业和合并必填要求实现,用API完成配置:
步骤1:开启基础的流水线成功要求
先确保项目只有成功流水线才能合并,用API设置:
curl --request PUT --header "PRIVATE-TOKEN: <你的GitLab访问令牌>" \ "https://gitlab.example.com/api/v4/projects/<项目ID>" \ --form "only_allow_merge_if_pipeline_succeeds=true"
步骤2:编写检查流水线运行时间的CI作业
在项目的.gitlab-ci.yml中添加自定义作业,验证最新成功流水线是否在10小时内:
check_pipeline_age: stage: pre-merge script: - | # 获取当前分支最新成功流水线的创建时间 LAST_PIPELINE_TIME=$(curl --header "PRIVATE-TOKEN: <项目级访问令牌>" "https://gitlab.example.com/api/v4/projects/$CI_PROJECT_ID/pipelines?ref=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME&status=success&per_page=1" | jq -r '.[0].created_at') # 无成功流水线则直接失败 if [ -z "$LAST_PIPELINE_TIME" ]; then echo "当前分支无成功流水线记录,无法合并" exit 1 fi # 计算时间差(秒) LAST_PIPELINE_TIMESTAMP=$(date -d "$LAST_PIPELINE_TIME" +%s) CURRENT_TIMESTAMP=$(date +%s) TIME_DIFF=$((CURRENT_TIMESTAMP - LAST_PIPELINE_TIMESTAMP)) MAX_ALLOWED_SECONDS=$((10 * 3600)) # 超过10小时则失败 if [ $TIME_DIFF -gt $MAX_ALLOWED_SECONDS ]; then echo "最近一次成功流水线已超过10小时,请重新运行流水线" exit 1 fi rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
步骤3:用API将该作业设为合并必填项
先通过/projects/:id/jobs端点查询check_pipeline_age作业的ID,再调用API将其设为合并必须通过的作业:
curl --request PUT --header "PRIVATE-TOKEN: <你的GitLab访问令牌>" \ "https://gitlab.example.com/api/v4/projects/<项目ID>/merge_requests/settings" \ --form "require_pipelines_to_succeed=true" \ --form "required_job_ids[]=<check_pipeline_age作业ID>"
或者用审批规则的方式绑定该作业:
curl --request POST --header "PRIVATE-TOKEN: <你的GitLab访问令牌>" \ "https://gitlab.example.com/api/v4/projects/<项目ID>/approval_rules" \ --form "name=流水线时效性检查" \ --form "approvals_required=1" \ --form "external_when_pipeline_succeeds=true" \ --form "report_type=ci_job" \ --form "job_name=check_pipeline_age"
内容的提问来源于stack exchange,提问作者Prasanth Vardhi
相关产品推荐
相关产品推荐

