在子项目中获取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】:

在您的示例中,includetrigger 不同。包含只是将所有文件合并到一个巨大的管道中,因此您应该能够从包含的文件中访问您想要的任何变量,只要变量的范围是正确的。


如果您确实希望将详细信息从父管道传递到子管道,您可以添加一个作业,将您想要的变量和详细信息导出到 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 项目中获取当前和旧用户名?

如何从 Gitlab API 获取用户所有已加星标的项目

在项目上运行Gitlab-CI以获取两个不同的Docker镜像

关于项目组件中的值得传递。