合并GitLab Merge Request后如何获取CI_MERGE_REQUEST_LABELS?
解决方案:MR合并后获取标签并实现多EB环境部署
方案一:将MR标签注入合并提交信息
在MR的流水线中添加步骤,把CI_MERGE_REQUEST_LABELS写入合并提交的备注,合并后在master分支流水线里解析提交信息即可拿到标签。
示例代码(MR流水线的job中执行):
# 仅在MR流水线中执行 if [[ -n "$CI_MERGE_REQUEST_LABELS" ]]; then # 获取原始提交信息 original_commit_msg=$(git log --format=%B -n1) # 追加标签信息到提交内容 git commit --amend -m "$original_commit_msg [MR_LABELS: $CI_MERGE_REQUEST_LABELS]" # 推送修改后的提交(需确保job拥有Git推送权限) git push origin HEAD:$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME fi
合并后,master流水线解析提交信息提取标签并部署:
MR_LABELS=$(git log --format=%B -n1 | grep -oP '(?<=\[MR_LABELS: ).*(?=\])') # 按逗号分割标签,遍历部署到对应EB环境 IFS=',' read -ra LABELS <<< "$MR_LABELS" for LABEL in "${LABELS[@]}"; do echo "部署到EB环境: $LABEL" eb deploy "$LABEL" done
方案二:通过GitLab API利用提交SHA关联MR
合并后的提交SHA会绑定对应的MR,可通过API查找该SHA对应的已合并MR,直接获取标签信息。
示例代码(master流水线中执行):
# 获取当前提交关联的已合并MR信息 MR_INFO=$(curl --silent --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests?state=merged&sha=$CI_COMMIT_SHA") # 提取MR标签(默认取第一个关联MR的标签) MR_LABELS=$(echo "$MR_INFO" | jq -r '.[0].labels | join(",")') # 遍历标签执行部署 IFS=',' read -ra LABELS <<< "$MR_LABELS" for LABEL in "${LABELS[@]}"; do eb deploy "$LABEL" done
注意:需确保GITLAB_API_TOKEN拥有项目MR的读取权限。
方案三:用CI Artifacts传递标签信息
在MR流水线中将标签写入文件并上传为artifacts,合并后的流水线通过API下载该artifacts获取标签。
- MR流水线的job配置:
save_mr_labels: stage: prepare only: - merge_requests script: - echo "$CI_MERGE_REQUEST_LABELS" > mr_labels.txt artifacts: paths: - mr_labels.txt expire_in: 7d
- master流水线中下载artifacts并读取标签:
# 获取当前提交关联MR的流水线ID MR_PIPELINE_ID=$(curl --silent --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests?state=merged&sha=$CI_COMMIT_SHA" | jq -r '.[0].pipeline.id') # 下载对应流水线的artifacts curl --silent --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$MR_PIPELINE_ID/artifacts" -o artifacts.zip unzip artifacts.zip MR_LABELS=$(cat mr_labels.txt) # 执行部署逻辑 IFS=',' read -ra LABELS <<< "$MR_LABELS" for LABEL in "${LABELS[@]}"; do eb deploy "$LABEL" done
方案四:换用非标签驱动的部署触发方式
如果依赖MR标签的方式受限,可考虑以下替代方案:
- 手动触发部署: 在master分支设置手动触发的部署流水线,运行时输入目标EB环境列表。
- 预设环境规则: 定义分支与环境的映射(如master默认部署到所有生产环境,或根据提交信息中的关键字判断)。
- GitLab环境部署: 在MR阶段直接配置要部署的环境,合并后自动触发对应环境的部署任务(利用GitLab的环境与部署规则)。
内容的提问来源于stack exchange,提问作者Mohammad Humayun Khan
相关产品推荐
相关产品推荐

