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

Gitlab CI如何在一个阶段触发所有指定前缀的下游项目?

解决方案:在GitLab CI中批量触发下游Pipeline

方案一:通过并行Trigger批量触发(推荐)

直接利用GitLab CI的parallel:matrix特性,在单个阶段内批量生成触发任务,所有下游Pipeline会并行执行,且上游会等待所有下游完成后再继续。

修改后的.gitlab-ci.yml配置如下:

run-all-projects:
  stage: build
  parallel:
    matrix:
      - DOWNSTREAM_PROJECT:
          - My_Project/test/1
          - My_Project/test/2
          - My_Project/test/3
          - My_Project/test/4
  trigger:
    project: $DOWNSTREAM_PROJECT
    branch: main
    strategy: depend

说明:

  • parallel:matrix会为每个DOWNSTREAM_PROJECT项生成独立子任务,所有任务同属build阶段
  • strategy: depend确保上游Pipeline等待每个下游Pipeline执行完成,若任意下游失败,上游也会标记为失败
  • 该方式完全依赖GitLab CI原生能力,无需额外脚本,维护成本低

方案二:通过GitLab API循环触发并等待

如果需要更灵活的控制逻辑(比如自定义等待间隔、失败重试等),可以在script中用curl调用GitLab API批量触发,并轮询等待每个Pipeline完成。

配置示例:

trigger-via-api:
  stage: build
  variables:
    GITLAB_API_URL: "${CI_API_V4_URL}/projects"
    # 空格分隔的下游项目列表
    DOWNSTREAM_PROJECTS: "My_Project/test/1 My_Project/test/2 My_Project/test/3 My_Project/test/4"
    TARGET_BRANCH: "main"
  script:
    - |
      for PROJECT in $DOWNSTREAM_PROJECTS; do
        # URL编码项目路径(GitLab API要求替换/为%2F)
        ENCODED_PROJECT=$(echo "$PROJECT" | sed 's/\//%2F/g')
        
        # 触发下游Pipeline
        echo "触发项目:$PROJECT 的Pipeline"
        PIPELINE_RESPONSE=$(curl --silent --request POST \
          --header "Authorization: Bearer ${CI_JOB_TOKEN}" \
          "${GITLAB_API_URL}/${ENCODED_PROJECT}/pipeline?ref=${TARGET_BRANCH}")
        
        # 提取Pipeline ID
        PIPELINE_ID=$(echo "$PIPELINE_RESPONSE" | jq -r '.id')
        if [ "$PIPELINE_ID" = "null" ]; then
          echo "触发 $PROJECT 失败,响应:$PIPELINE_RESPONSE"
          exit 1
        fi
        echo "已触发Pipeline ID:$PIPELINE_ID"

        # 轮询等待Pipeline完成
        while true; do
          PIPELINE_STATUS=$(curl --silent --request GET \
            --header "Authorization: Bearer ${CI_JOB_TOKEN}" \
            "${GITLAB_API_URL}/${ENCODED_PROJECT}/pipelines/${PIPELINE_ID}" | jq -r '.status')
          
          echo "Pipeline $PIPELINE_ID 当前状态:$PIPELINE_STATUS"
          case $PIPELINE_STATUS in
            "success")
              echo "Pipeline $PIPELINE_ID 执行成功"
              break
              ;;
            "failed"|"canceled")
              echo "Pipeline $PIPELINE_ID 执行失败或已取消"
              exit 1
              ;;
          esac
          # 每10秒查询一次状态
          sleep 10
        done
      done
  before_script:
    # 若使用Debian/Ubuntu镜像,安装依赖工具
    - apt-get update && apt-get install -y curl jq
  needs: []

注意事项:

  1. 权限配置:下游项目需在设置 > CI/CD > Pipeline触发器中,开启"允许使用CI_JOB_TOKEN触发流水线"
  2. 依赖工具:脚本使用jq解析JSON响应,需确保Runner镜像已安装该工具(可通过before_script安装)
  3. CI_JOB_TOKEN权限:该令牌仅拥有当前项目的权限,若下游项目与上游不在同一群组,可能需要使用含api权限的个人访问令牌替代

内容的提问来源于stack exchange,提问作者Syed Daniyal Asif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:10:38