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

时间:2020-10-08 15:28:36

标签: gitlab gitlab-ci gitlab-api

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

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

我通过以下步骤调用父级的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和分支名称?

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

2 个答案:

答案 0 :(得分:0)

由于您是 including 子项目的配置而不是 triggering 它,因此两个管道定义文件在管道启动之前合并并成为一个文件,因此此方法和在父项目中包含子项目定义的内容。

因此,如果管道在父项目中运行,所有 predefined variables 都将基于父项目。例如,$CI_COMMIT_REF_NAME$CI_PROJECT_NAME 等变量将指向父项目和父项目的分支。

答案 1 :(得分:0)

在您的示例中,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    


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

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