旧版GitLab CI如何通过脚本触发下游流水线并等待执行完成?
用脚本触发下游流水线并等待执行完成(适配旧版GitLab)
完全可以用脚本实现,核心是调用GitLab的API触发下游流水线,再轮询查询状态直到任务结束,完美替代旧版不支持变量的trigger配置。
实现步骤与脚本示例
以下是可直接复用的bash脚本,适配GitLab CI环境:
#!/bin/bash # 拼接下游项目名称(使用你的变量) DOWNSTREAM_PROJECT="${my_downstream_project}_1" # 转义项目路径中的斜杠为URL编码(如果项目包含分组路径需要这一步) ENCODED_PROJECT=$(echo "$DOWNSTREAM_PROJECT" | sed 's/\//%2F/g') # GitLab API地址(直接用CI内置环境变量) GITLAB_TRIGGER_API="${CI_API_V4_URL}/projects/${ENCODED_PROJECT}/pipeline" # 1. 触发下游流水线 echo "正在触发下游流水线:$DOWNSTREAM_PROJECT" TRIGGER_RESPONSE=$(curl --silent --request POST \ --header "Authorization: Bearer $CI_JOB_TOKEN" \ --header "Content-Type: application/json" \ --data '{"ref": "main"}' \ "$GITLAB_TRIGGER_API") # 检查触发是否成功 if ! echo "$TRIGGER_RESPONSE" | jq -e '.id' > /dev/null; then echo "触发失败!响应内容:$TRIGGER_RESPONSE" exit 1 fi # 提取下游流水线ID PIPELINE_ID=$(echo "$TRIGGER_RESPONSE" | jq -r '.id') echo "下游流水线已启动,ID:$PIPELINE_ID" # 2. 轮询等待流水线完成 while true; do # 查询当前流水线状态 STATUS_RESPONSE=$(curl --silent --request GET \ --header "Authorization: Bearer $CI_JOB_TOKEN" \ "${CI_API_V4_URL}/projects/${ENCODED_PROJECT}/pipelines/${PIPELINE_ID}") CURRENT_STATUS=$(echo "$STATUS_RESPONSE" | jq -r '.status') echo "当前流水线状态:$CURRENT_STATUS" # 判断是否为终端状态(成功/失败/取消) case "$CURRENT_STATUS" in "success"|"failed"|"canceled") echo "下游流水线执行结束,状态:$CURRENT_STATUS" # 成功则返回0,失败/取消返回非0,上游流水线可据此判断结果 [ "$CURRENT_STATUS" = "success" ] && exit 0 || exit 1 ;; *) # 非终端状态,等待30秒后再次查询(可根据需求调整间隔) sleep 30 ;; esac done
注意事项
- 依赖工具:确保上游流水线的运行环境安装了
curl和jq(用于解析JSON),可在before_script中添加安装命令:# Ubuntu/Debian环境 apt-get update && apt-get install -y curl jq # Alpine环境 apk add --no-cache curl jq - 权限配置:上游流水线的
CI_JOB_TOKEN需要拥有下游项目的流水线触发权限,可在下游项目的「设置」→「CI/CD」→「流水线触发权限」中,允许上游项目的服务账号触发流水线,或直接给上游服务账号分配下游项目的「开发者」角色。 - 间隔调整:脚本中的
sleep 30可根据流水线时长调整,避免过于频繁查询导致API限流。
内容的提问来源于stack exchange,提问作者Rog Boy
相关产品推荐
相关产品推荐

