问题描述
我正在使用下面的两个gitlab存储库
我通过以下步骤调用父级的pipeline / child-project gitlab-ci.yml文件形式
父Gitlab存储库-gitlab-ci.yml文件
include:
- project: 'my-group/child-project'
ref: master
file: '/templates/.gitlab-ci-template.yml'
Child-project-gitlab-ci.yml文件
stages:
- test
- build
before_script:
- export PARENT_PROJECT_NAME = ?
- export PARENT_PROJECT_PIPELINE_ID = ?
- export PARENT_PROJECT_BRANCH_NAME = ?
job 1:
stage: test
script:
- echo "Runnig test for project ${PARENT_PROJECT_NAME}"
- node_modules/.bin/ng test
release_job:
stage: build
script: node_modules/.bin/ng build --prod
artifacts:
name: "project-$CI_COMMIT_REF_NAME"
paths:
- dist/
only:
- tags
如何在运行管道的子项目中获取父回购详细信息,例如父项目名称,pipeline-id和分支名称?
一种方法是在父项目中定义变量并在子项目中使用,但是还有其他方法可以直接访问子项目中的父项目详细信息吗?
解决方法
由于您是 including
子项目的配置而不是 triggering
它,因此两个管道定义文件在管道启动之前合并并成为一个文件,因此此方法和在父项目中包含子项目定义的内容。
因此,如果管道在父项目中运行,所有 predefined variables 都将基于父项目。例如,$CI_COMMIT_REF_NAME
、$CI_PROJECT_NAME
等变量将指向父项目和父项目的分支。
在您的示例中,include
与 trigger
不同。 Include 只是将所有文件合并到一个巨大的管道中,因此您应该能够从包含的文件中访问您想要的任何变量,只要变量的范围是正确的。
如果您实际上希望将详细信息从父管道传递到子管道,您可以添加一个作业,将您想要的变量和详细信息导出到 dotenv,然后让子管道访问该 dotenv。这将允许代码在变量中的硬编码中是动态的,并直接将它们传递给子管道
export-parent-details:
script:
- echo "PARENT_PROJECT_NAME=?" >> build.env
- echo "PARENT_PROJECT_PIPELINE_ID=?" >> build.env
- echo "PARENT_PROJECT_BRANCH_NAME=?" >> build.env
artifacts:
reports:
dotenv: build.env
trigger-child:
stage: docker_hub
trigger:
include:
- project: 'my-group/child-project'
ref: master
file: '/templates/.gitlab-ci-template.yml'
# use this variable in child pipeline to download artifacts from parent pipeline
variables:
PARENT_PIPELINE_ID: $CI_PIPELINE_ID
然后在子作业中,您应该能够从父作业访问父工件
child-job:
needs:
- pipeline: $PARENT_PIPELINE_ID
job: export-parent-details
script:
- echo $PARENT_PROJECT_NAME
见
- https://docs.gitlab.com/ee/ci/yaml/README.html#artifact-downloads-to-child-pipelines
- https://docs.gitlab.com/ee/ci/multi_project_pipelines.html#pass-cicd-variables-to-a-downstream-pipeline-by-using-variable-inheritance
另一种选择是调用 API 来获取父项目的详细信息,因为运行者在 $CI_JOB_TOKEN
下有一个只读令牌,此方法取决于 repo 访问权限和您想要的详细信息>
curl -H "JOB_TOKEN: $CI_JOB_TOKEN" "https://gitlab.com/api/v4/{whatever the api call is}"