如何多次触发另一GitLab仓库流水线并传入不同变量?
触发GitLab外部流水线多次并传入不同变量的解决方案
你当前的配置只是在本地定义了三个job并输出日志,但并没有实际触发aap/gitlab-ci仓库的流水线——include关键字是把外部流水线的任务引入到当前流水线中执行,而非触发目标仓库的独立流水线,所以无法实现三次执行外部流水线的需求。
方案一:使用GitLab原生trigger关键字(推荐)
利用GitCI的trigger关键字直接触发目标仓库的流水线,每个trigger job会生成一个独立的外部流水线实例,并传入对应变量:
--- # 定义触发外部流水线的模板job,复用公共配置 .trigger-external: trigger: project: "aap/gitlab-ci" ref: "go-pipeline" strategy: depend # 可选,若需等待外部流水线完成再继续当前流水线,保留此配置 variables: GO_TEST: "true" # 第一次触发:对应ice-gitops变量组 ice-gitops: extends: .trigger-external variables: IMAGE_NAME: "ice-gitops" DOCKERFILE_PATH: "${CI_PROJECT_DIR}/build/Dockerfile" # 第二次触发:对应ice-gitops-ci变量组 ice-gitops-ci: extends: .trigger-external variables: IMAGE_NAME: "ice-gitops-ci" DOCKERFILE_PATH: "${CI_PROJECT_DIR}/build/Dockerfile.ci" # 第三次触发:对应ice-gitops-ci-local变量组 ice-gitops-ci-local: extends: .trigger-external variables: IMAGE_NAME: "ice-gitops-ci-local" DOCKERFILE_PATH: "${CI_PROJECT_DIR}/build/Dockerfile.local"
方案二:通过GitLab API触发(灵活定制场景)
如果需要更灵活的触发逻辑,可以在script中调用GitLab API手动触发外部流水线:
trigger-multiple-pipelines: script: # 触发第一组变量的流水线 - | curl --request POST \ --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" \ --form "variables[IMAGE_NAME]=ice-gitops" \ --form "variables[GO_TEST]=true" \ --form "variables[DOCKERFILE_PATH]=${CI_PROJECT_DIR}/build/Dockerfile" \ "${CI_API_V4_URL}/projects/$(echo aap/gitlab-ci | sed 's/\//%2F/g')/trigger/pipeline?ref=go-pipeline" # 触发第二组变量的流水线 - | curl --request POST \ --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" \ --form "variables[IMAGE_NAME]=ice-gitops-ci" \ --form "variables[GO_TEST]=true" \ --form "variables[DOCKERFILE_PATH]=${CI_PROJECT_DIR}/build/Dockerfile.ci" \ "${CI_API_V4_URL}/projects/$(echo aap/gitlab-ci | sed 's/\//%2F/g')/trigger/pipeline?ref=go-pipeline" # 触发第三组变量的流水线 - | curl --request POST \ --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" \ --form "variables[IMAGE_NAME]=ice-gitops-ci-local" \ --form "variables[GO_TEST]=true" \ --form "variables[DOCKERFILE_PATH]=${CI_PROJECT_DIR}/build/Dockerfile.local" \ "${CI_API_V4_URL}/projects/$(echo aap/gitlab-ci | sed 's/\//%2F/g')/trigger/pipeline?ref=go-pipeline" variables: # 需在当前项目的CI/CD变量中配置此token,确保拥有触发目标流水线的权限 GITLAB_API_TOKEN: "${GITLAB_API_TOKEN}"
注意事项
- 方案一中的
strategy: depend会让当前流水线等待外部流水线执行完成,若无需等待可移除该配置。 - 方案二中的
GITLAB_API_TOKEN需要具备目标仓库的流水线触发权限,建议通过项目CI/CD变量管理,避免硬编码。 - 目标仓库
aap/gitlab-ci需允许外部触发,可在仓库的「Settings -> CI/CD -> Pipeline triggers」中配置触发源,或确保API token拥有足够权限。
内容的提问来源于stack exchange,提问作者bjornvandijkman
相关产品推荐
相关产品推荐

