合并请求合并后CI_MERGE_REQUEST_LABELS变量是否仍可使用?
问题解答:合并请求完成后
CI_MERGE_REQUEST_LABELS是否可用? 不行,合并请求(MR)完成合并后,CI_MERGE_REQUEST_LABELS变量会失效,无法正常使用。
原因
CI_MERGE_REQUEST_LABELS是GitLab CI专为合并请求相关流水线(比如MR分支的流水线、MR的预合并校验流水线)注入的专属变量。当MR合并到目标分支(比如master)后,触发的是目标分支的常规流水线,此时原MR已经处于合并完成状态,GitLab不会再注入任何MR相关的专属变量,所以你在master分支的流水线中无法获取到这个变量的值。
你的当前配置问题
你当前的规则是当分支为master时执行脚本,但此时CI_MERGE_REQUEST_LABELS为空,导致判断[[ "$CI_MERGE_REQUEST_LABELS" == *"rollback"* ]]永远不会成立,逻辑无法生效。
可行解决方案
方案1:将MR标签同步到合并commit的消息中
在MR合并时,手动或者通过GitLab自动化工具(比如CI脚本、Webhook)把MR的标签添加到合并commit的消息里,比如在commit消息末尾加上[labels: rollback]这类标识。之后在master流水线中解析commit消息来判断:
rules: - if: '$CI_COMMIT_REF_NAME == "master"' script: | #!/bin/bash # 从当前commit的消息中匹配标签标识 if git log --format=%B -n 1 "$CI_COMMIT_SHA" | grep -q "\[labels: rollback\]"; then # 这里写你的回滚逻辑 echo "执行回滚操作..." fi
方案2:通过GitLab API查询当前commit关联的MR标签
在master流水线中,使用GitLab API查询合并当前commit的MR记录,从中提取标签。需要提前给CI流水线配置一个有项目API访问权限的私有令牌(比如设置为环境变量GITLAB_API_TOKEN):
rules: - if: '$CI_COMMIT_REF_NAME == "master"' script: | #!/bin/bash # 查询关联当前commit的已合并MR MR_DATA=$(curl --silent --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests?state=merged&commit_sha=$CI_COMMIT_SHA") # 提取MR的标签列表(需要安装jq工具) MR_LABELS=$(echo "$MR_DATA" | jq -r '.[0].labels | join(",")') # 判断是否包含目标标签 if [[ "$MR_LABELS" == *"rollback"* ]]; then # 执行回滚逻辑 echo "执行回滚操作..." fi
注意:确保流水线运行环境中安装了jq工具,用于解析API返回的JSON数据。
内容的提问来源于stack exchange,提问作者joe1531
相关产品推荐
相关产品推荐

