GitLab CI合并请求成功后如何在build作业中使用MR预定义变量
问题原因说明
GitLab 仅在合并请求事件触发的流水线中才会自动注入 CI_MERGE_REQUEST_* 系列预定义变量。你的 build 作业是 stage 分支的 push 事件触发的独立流水线,默认上下文不会携带 MR 相关信息,需要主动查询关联信息。
解决方案
方案1:通过GitLab API查询当前提交关联的MR信息(最稳定,适用于MR合并到stage后触发构建的场景)
你可以在build作业中调用GitLab开放接口,用当前流水线自带的CI_COMMIT_SHA变量查询该提交关联的合并请求,即可拿到所需参数。
- 先在项目「设置-访问令牌」中创建一个有
read_api权限的项目访问令牌,存到项目CI/CD变量中,命名为PROJECT_API_TOKEN - 修改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
相关产品推荐
相关产品推荐

