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

如何在GitLab Pipeline中检查API调用的JSON响应并执行后续操作

在GitLab Pipeline中基于API响应触发后续操作

需求:在create_merge_request阶段检查创建合并请求的API响应,获取合并请求ID后执行合并操作,无需依赖外部工具,直接在GitLab Pipeline内完成。

优化后的多阶段CI配置

stages:
  - create_branch
  - create_merge_request
  - merge_merge_request

create_branch:
  stage: create_branch
  script:
    - git checkout -b new-feature-branch
    - git push origin new-feature-branch
  only:
    - master

create_merge_request:
  stage: create_merge_request
  script:
    - |
      # 调用API创建合并请求并捕获响应
      MR_RESPONSE=$(curl --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
      --data "source_branch=new-feature-branch&target_branch=master&title=New Feature" \
      "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/merge_requests")
      # 从响应中提取MR ID并写入文件
      echo "$MR_RESPONSE" | jq '.id' > mr_id.txt
      # 验证合并请求是否创建成功
      if [ -z "$(cat mr_id.txt)" ]; then
        echo "合并请求创建失败"
        exit 1
      fi
  artifacts:
    paths:
      - mr_id.txt
    expire_in: 1 hour
  only:
    - master
  needs:
    - create_branch

merge_merge_request:
  stage: merge_merge_request
  script:
    - |
      # 从传递的工件中读取MR ID
      MR_ID=$(cat mr_id.txt)
      # 调用API触发合并,设置流水线成功后自动合并
      curl --request PUT --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
      --data "merge_when_pipeline_succeeds=true" \
      "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/merge_requests/$MR_ID/merge"
  only:
    - master
  needs:
    - create_merge_request

关键改进点

  • 直接捕获MR ID:在创建合并请求的阶段直接从API响应提取ID,通过GitLab的artifacts机制传递给后续阶段,避免重复查询API,更高效且可靠。
  • 增加有效性校验:检查提取的MR ID是否为空,若为空则终止流水线,防止后续阶段执行无效操作。
  • 简化合并阶段逻辑:直接读取传递的MR ID,无需再次调用查询接口。

可选:单阶段完成创建与合并

如果不需要拆分阶段,也可以在同一个步骤内完成创建和合并操作:

stages:
  - create_branch
  - create_and_merge_mr

create_branch:
  stage: create_branch
  script:
    - git checkout -b new-feature-branch
    - git push origin new-feature-branch
  only:
    - master

create_and_merge_mr:
  stage: create_and_merge_mr
  script:
    - |
      # 创建合并请求并获取响应
      MR_RESPONSE=$(curl --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
      --data "source_branch=new-feature-branch&target_branch=master&title=New Feature" \
      "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/merge_requests")
      MR_ID=$(echo "$MR_RESPONSE" | jq '.id')
      
      # 验证合并请求创建成功
      if [ -z "$MR_ID" ]; then
        echo "合并请求创建失败"
        exit 1
      fi
      
      # 触发合并操作
      curl --request PUT --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
      --data "merge_when_pipeline_succeeds=true" \
      "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/merge_requests/$MR_ID/merge"
  only:
    - master
  needs:
    - create_branch

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:21:06