在子项目中获取gitlab父项目详情
Posted
技术标签:
【中文标题】在子项目中获取gitlab父项目详情【英文标题】:Get gitlab parent project details in child project 【发布时间】:2021-01-23 16:40:13 【问题描述】:我正在使用以下两个gitlab存储库
-
父 Gitlab 存储库 - 应用程序代码,例如 - Angular 应用程序
子 Gitlab 存储库 - 对于 Gitlab 管道,只有 gitlab-ci.yml 文件,其中包含运行管道的脚本
我正在使用以下步骤从父级调用管道/子项目 gitlab-ci.yml 文件
父 Gitlab 存储库 - 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 和分支名称等父项目详细信息?
一种方法是在父项目中定义变量并在子项目中使用,但还有其他方法可以直接访问子项目中的父项目详细信息吗?
【问题讨论】:
如果您可以使用真正的“父子”管道 gitlab 功能(这里不是这种情况),您可以 pass variables 到下游管道。 为什么不能把子管道(实际的管道)放在父管道中? 因为架构设计,我们让所有项目的流水线配置通用。使事情保持一致。 【参考方案1】:由于你是including
子项目的配置而不是triggering
它,所以两个流水线定义文件在流水线启动前合并为一个,所以这种方法和有内容没有实际区别父项目中子项目的定义。
因此,如果管道在那里运行,所有predefined variables 将基于父项目。例如,$CI_COMMIT_REF_NAME
、$CI_PROJECT_NAME
等变量将指向父项目和父项目的分支。
【讨论】:
【参考方案2】:在您的示例中,include
与 trigger
不同。包含只是将所有文件合并到一个巨大的管道中,因此您应该能够从包含的文件中访问您想要的任何变量,只要变量的范围是正确的。
如果您确实希望将详细信息从父管道传递到子管道,您可以添加一个作业,将您想要的变量和详细信息导出到 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"
【讨论】:
以上是关于在子项目中获取gitlab父项目详情的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Gitlab webhook 事件负载中获取项目名称
如何从 .net 项目文件中获取 gitlab-ci.yml 文件中的项目版本?
有没有办法使用 gitlab python api 从 gitlab 项目中获取当前和旧用户名?