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

GitLab CI合并请求成功后如何在build作业中使用MR预定义变量

问题原因说明

GitLab 仅在合并请求事件触发的流水线中才会自动注入 CI_MERGE_REQUEST_* 系列预定义变量。你的 build 作业是 stage 分支的 push 事件触发的独立流水线,默认上下文不会携带 MR 相关信息,需要主动查询关联信息。


解决方案

方案1:通过GitLab API查询当前提交关联的MR信息(最稳定,适用于MR合并到stage后触发构建的场景)

你可以在build作业中调用GitLab开放接口,用当前流水线自带的CI_COMMIT_SHA变量查询该提交关联的合并请求,即可拿到所需参数。

  1. 先在项目「设置-访问令牌」中创建一个有read_api权限的项目访问令牌,存到项目CI/CD变量中,命名为PROJECT_API_TOKEN
  2. 修改build作业配置:
build:
  stage: build
  <<: *docker_image
  script:
    # 调用API查询当前提交关联的MR
    - MR_RESPONSE=$(curl --header "PRIVATE-TOKEN: $PROJECT_API_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/commits/$CI_COMMIT_SHA/merge_requests")
    # 解析MR信息,二选一即可:
    # 方式1:镜像预装jq时用
    - CI_MERGE_REQUEST_IID=$(echo $MR_RESPONSE | jq -r '.[0].iid')
    - CI_MERGE_REQUEST_SOURCE_BRANCH_NAME=$(echo $MR_RESPONSE | jq -r '.[0].source_branch')
    # 方式2:镜像有python3时用
    # - CI_MERGE_REQUEST_IID=$(echo $MR_RESPONSE | python3 -c "import json, sys; print(json.load(sys.stdin)[0]['iid'])")
    # - CI_MERGE_REQUEST_SOURCE_BRANCH_NAME=$(echo $MR_RESPONSE | python3 -c "import json, sys; print(json.load(sys.stdin)[0]['source_branch'])")
    # 后续你的原有构建逻辑
    - export
  only:
    - stage

方案2:调整触发规则,让build作业在MR流水线中运行(适用于MR合入前就需要执行构建的场景)

直接修改build的触发规则,让它在合并到stage的MR流水线中运行,天然就能读取MR相关变量:

build:
  stage: build
  <<: *docker_image
  script:
    - echo $CI_MERGE_REQUEST_IID
    - echo $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
    - export
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "stage"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:54:07