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

合并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获取标签。

  1. 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
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:17:45