【问题标题】:Get gitlab parent project details in child project在子项目中获取gitlab父项目详情
【发布时间】:2021-01-23 16:40:13
【问题描述】:

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

  1. 父 Gitlab 存储库 - 应用程序代码,例如 - Angular 应用程序
  2. 子 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 到下游管道。
  • 为什么不能把子管道(实际的管道)放在父管道中?
  • 因为架构设计,我们让所有项目的流水线配置通用。使事情保持一致。

标签: gitlab gitlab-ci gitlab-api


【解决方案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    
    


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-02
      • 2022-01-20
      • 2018-06-25
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 2011-02-15
      相关资源
      最近更新 更多