在子项目中获取gitlab父项目的详细信息



我正在使用下面两个gitlab存储库

  1. 父Gitlab repo-应用程序代码,例如-Angular应用程序
  2. 子Gitlab repo-对于Gitlab管道,只有Gitlab-ci.yml文件,其中包含运行管道的脚本

我正在使用以下步骤从父级调用管道/子项目gitlab-ci.yml文件

父Gitlab repo-Gitlab-ci.yml文件

include:
- project: 'my-group/child-project'
ref: master
file: '/templates/.gitlab-ci-template.yml'

子项目-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

如何获取父回购详细信息,如父项目名称、管道id和;正在运行管道的子项目中的分支名称?

一种方法是在父项目中定义变量并在子项目中使用,但有没有其他方法可以直接访问子项目中的父项目详细信息?

在您的示例中,includetrigger不同。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-下载到子管道
  • https://docs.gitlab.com/ee/ci/multi_project_pipelines.html#pass-cicd-变量-通过单变量遗传

另一个选项可以是调用API以获取父项目的详细信息,因为运行者在$CI_JOB_TOKEN下有一个只读令牌,此方法取决于回购访问权限和您想要的详细信息

curl -H "JOB_TOKEN: $CI_JOB_TOKEN" "https://gitlab.com/api/v4/{whatever the api call is}"

由于您是including子项目的配置,而不是triggering,因此在管道启动之前,两个管道定义文件会合并并成为一个文件,因此这种方法与将子项目定义的内容放在父项目中没有实际区别。

因此,如果管道在父项目中运行,则所有预定义的变量都将基于父项目。例如,像$CI_COMMIT_REF_NAME$CI_PROJECT_NAME这样的变量将指向父项目和父项目的分支。

相关内容

最新更新