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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:50:28