GitLab CI需求:启动第一个作业时触发第二个作业
GitLab CI 跨阶段作业触发方案
方案一:通过子管道直接触发健康检查作业
在apply-dev作业中配置trigger关键字,启动时直接拉起包含healthcheck-dev的独立子管道。这种方式无需等待apply-dev执行完成、不受其结果影响,同时两个作业仍分属不同阶段。
示例配置:
stages: - deploy - health apply-dev: stage: deploy script: - echo "执行Terraform Apply操作..." - terraform apply -auto-approve # 替换为你的实际Terraform命令 when: manual trigger: include: - local: .gitlab/ci/healthcheck.yml # 将healthcheck-dev单独拆分到该文件 strategy: none # 不等待子管道完成,直接继续当前作业流程 # .gitlab/ci/healthcheck.yml 内容 healthcheck-dev: stage: health script: - echo "执行健康检查..." # 替换为你的实际健康检查命令 when: manual # 保留手动触发能力,被trigger拉起时会自动执行
说明:
trigger会在apply-dev启动后立刻触发子管道,完全不干扰原作业的执行节奏。- 子管道的
healthcheck-dev仍处于health阶段,与父管道的deploy阶段彻底分离,不会出现同阶段并行的问题。
方案二:用GitLab API在脚本内触发健康检查
如果不想使用子管道,可以在apply-dev的脚本开头直接调用GitLab API触发healthcheck-dev,实现启动后立即触发健康检查、后续继续执行Terraform任务的效果。
示例配置:
stages: - deploy - health apply-dev: stage: deploy script: # 优先触发healthcheck-dev,忽略API调用结果 - | curl --request POST --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" \ "https://你的GitLab域名/api/v4/projects/$CI_PROJECT_ID/pipeline/$CI_PIPELINE_ID/jobs/$(curl --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://你的GitLab域名/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs" | jq -r '.[] | select(.name == "healthcheck-dev") | .id')/play" || true # 执行Terraform操作 - echo "执行Terraform Apply操作..." - terraform apply -auto-approve when: manual variables: GITLAB_API_TOKEN: $GITLAB_API_TOKEN # 需在项目CI/CD变量中配置具备api权限的token healthcheck-dev: stage: health script: - echo "执行健康检查..." when: manual
说明:
- 先通过API查询当前管道中
healthcheck-dev的作业ID,再调用play接口触发它;|| true确保即使API调用失败,也不会中断后续Terraform任务。 - 两个作业仍分属不同阶段,触发后
healthcheck-dev会立即运行,与apply-dev并行但阶段分离。 - 注意
GITLAB_API_TOKEN需要拥有api权限,提前在项目的CI/CD变量中完成配置。
方案选型建议
优先选择方案一的子管道方式,无需额外配置API权限,GitLab原生支持,后续维护成本更低。
内容的提问来源于stack exchange,提问作者Theo Sweeny
相关产品推荐
相关产品推荐

