如何在MR流水线的checking任务成功后触发master分支的uploading任务?
跨流水线实现checking成功后触发uploading的方案
因为两个任务分属MR流水线和master分支push流水线,无法直接用needs关联,你可以通过以下几种方式实现需求:
方法1:通过流水线工件传递验证状态
在MR的checking任务中生成验证通过的标记文件并上传为工件;当MR合并到master触发uploading任务时,通过GitLab API找到对应MR的流水线,验证checking任务的执行状态。
步骤1:修改checking任务配置,生成标记工件
checking: stage: check_if_MR_contains_some_text only: refs: - merge_requests script: - # 你的检查逻辑 - echo "passed" > check_result.txt # 检查通过后生成标记文件 artifacts: paths: - check_result.txt expire_in: 7d # 设置过期时间,避免占用存储
步骤2:修改uploading任务,验证MR的checking结果
uploading: stage: check_if_MR_contains_some_text rules: - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_REF_NAME == "master"' script: - # 1. 通过当前commit找到对应的MR ID - MR_ID=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests?state=merged&sha=$CI_COMMIT_SHA" | jq -r '.[0].iid') - if [ -z "$MR_ID" ]; then echo "未找到当前commit对应的MR,终止任务"; exit 1; fi - # 2. 获取该MR的最新流水线ID - PIPELINE_ID=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$MR_ID/pipelines" | jq -r '.[0].id') - if [ -z "$PIPELINE_ID" ]; then echo "该MR无关联流水线,终止任务"; exit 1; fi - # 3. 检查checking任务是否成功 - JOB_STATUS=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$PIPELINE_ID/jobs?name=checking" | jq -r '.[0].status') - if [ "$JOB_STATUS" != "success" ]; then echo "MR的checking任务未通过,终止uploading"; exit 1; fi - # 你的上传逻辑 - ... variables: GITLAB_TOKEN: $YOUR_PROJECT_ACCESS_TOKEN # 提前在项目设置中创建有权限的访问令牌
方法2:用项目CI/CD变量记录验证状态
在MR的checking任务成功后,通过API设置关联MR ID的变量;uploading任务触发时,检查对应变量是否存在且为成功状态。
步骤1:修改checking任务,设置验证通过变量
checking: stage: check_if_MR_contains_some_text only: refs: - merge_requests script: - # 你的检查逻辑 - # 设置关联MR ID的变量,避免冲突 - curl --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/variables" --form "key=MR_CHECK_PASSED_$CI_MERGE_REQUEST_IID" --form "value=true" --form "protected=false" --form "masked=false" variables: GITLAB_TOKEN: $YOUR_PROJECT_ACCESS_TOKEN
步骤2:修改uploading任务,检查变量并清理
uploading: stage: check_if_MR_contains_some_text rules: - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_REF_NAME == "master"' script: - # 找到当前commit对应的MR ID - MR_ID=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests?state=merged&sha=$CI_COMMIT_SHA" | jq -r '.[0].iid') - if [ -z "$MR_ID" ]; then exit 1; fi - # 检查对应变量是否存在且为true - CHECK_RESULT=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/variables/MR_CHECK_PASSED_$MR_ID" | jq -r '.value') - if [ "$CHECK_RESULT" != "true" ]; then echo "checking未通过,终止任务"; exit 1; fi - # 删除变量,避免积累 - curl --request DELETE --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/variables/MR_CHECK_PASSED_$MR_ID" - # 你的上传逻辑 - ... variables: GITLAB_TOKEN: $YOUR_PROJECT_ACCESS_TOKEN
方法3:标记MR的自定义状态
通过API给MR添加验证通过的自定义备注,uploading任务触发时检查该备注是否存在。
步骤1:checking任务添加MR状态标记
checking: stage: check_if_MR_contains_some_text only: refs: - merge_requests script: - # 你的检查逻辑 - # 给MR添加验证通过的备注 - curl --request POST --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes" --form "body=✅ checking任务验证通过" variables: GITLAB_TOKEN: $YOUR_PROJECT_ACCESS_TOKEN
步骤2:uploading任务检查MR状态
uploading: stage: check_if_MR_contains_some_text rules: - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_REF_NAME == "master"' script: - MR_ID=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests?state=merged&sha=$CI_COMMIT_SHA" | jq -r '.[0].iid') - if [ -z "$MR_ID" ]; then exit 1; fi - # 检查MR备注中是否有验证通过的标记 - NOTE_EXISTS=$(curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$MR_ID/notes" | jq '.[] | select(.body | contains("✅ checking任务验证通过"))' | wc -l) - if [ "$NOTE_EXISTS" -eq 0 ]; then echo "checking未通过,终止任务"; exit 1; fi - # 你的上传逻辑 - ... variables: GITLAB_TOKEN: $YOUR_PROJECT_ACCESS_TOKEN
注意事项
- 所有方法都需要提前创建项目访问令牌,权限至少包含
api和read_repository,并添加到项目CI/CD变量中。 - 方法2的变量会积累,记得在uploading后删除,GitLab 15.4+也支持设置变量过期时间。
- 方法3的备注标记可被手动修改,适合对验证严谨性要求不高的场景。
内容的提问来源于stack exchange,提问作者Evgeniy Pozdnyakov
相关产品推荐
相关产品推荐

