代码之家  ›  专栏  ›  技术社区  ›  pyriand3r

共享gitlab ci。项目之间的yml

  •  31
  • pyriand3r  · 技术社区  · 7 年前

    我们正在考虑将ci从jenkins转移到gitlab。我们有几个具有相同构建工作流的项目。现在,我们使用一个共享库来定义管道,项目中的jenkinsfile只调用在定义实际管道的共享库中定义的方法。因此,只需在影响多个项目的单个点上进行更改。

    我想知道gitlab ci是否也可以这样做?据我所知,无法定义gitlab ci。存储库外的yml。是否有其他方法定义管道并与多个项目共享此配置以简化维护?

    7 回复  |  直到 7 年前
        1
  •  29
  •   Murli Prajapati    5 年前

    首先,我要说:谢谢你提出这个问题!这促使我(再次)寻找解决方案,因为我经常想知道这是否可能。我们还有大约20-30个完全相同的项目 .gitlab-ci.yml 约400-500 loc的文件,如果有一件事发生变化,则必须对每个文件进行更改。

    所以我找到了一个可行的解决方案:

    灵感来自 Auto DevOps .gitlab-ci.yml template Gitlab本身创建了一个模板作业 define all functions used call 每一个 before_script 为了加载它们,我提出了以下设置。

    文件夹

    所以使用 shared ci jobs scipt :

    #!/bin/bash
    
    function list_files {
      ls -lah
    }
    
    function current_job_info {
      echo "Running job $CI_JOB_ID on runner $CI_RUNNER_ID ($CI_RUNNER_DESCRIPTION) for pipeline $CI_PIPELINE_ID"
    }
    

    常见和通用 .gitlab ci。yml公司 :

    image: ubuntu:latest
    
    before_script:
      # Install curl
      - apt-get update -qqq && apt-get install -qqqy curl
      # Get shared functions script
      - curl -s -o functions.sh https://gitlab.com/giix/demo-shared-ci-functions/raw/master/functions.sh
      # Set permissions
      - chmod +x functions.sh
      # Run script and load functions
      - . ./functions.sh
    
    job1:
      script:
        - current_job_info
        - list_files
    

    您可以从中复制粘贴文件 project-1 project-2 它将使用相同的共享Gitlab CI函数。

    这些示例非常冗长。出于示例目的,请以任何方式对其进行优化。

    吸取的教训

    因此,在大规模(40多个项目)应用上述结构后,我想分享一些经验教训,这样您就不必找出困难的方法:

    • 版本(标记/发布)共享ci函数脚本。现在,改变一件事可能会导致所有管道故障。
    • 使用不同的Docker映像可能会导致bash加载函数的要求出现问题(例如,我将一些基于Alpine的映像用于基于CLI工具的作业,这些作业具有 sh 默认情况下)
    • 使用基于项目的CI/CD机密变量来个性化项目的生成作业。如环境URL等。
        2
  •  25
  •   miq    5 年前

    GitLab公司 11.7 引入新功能 include 方法,例如 include:file : https://docs.gitlab.com/ee/ci/yaml/#includefile

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

    这将允许您在包含共享 .gitlab-ci.yml .

        3
  •  10
  •   Joao Vitorino    4 年前

    自gitlab以来 version 12.6 ,可以定义外部 .gitlab-cy.yml 文件

    要自定义路径,请执行以下操作:

    1. 转到项目的设置(>);CI/CD。
    2. 展开“常规管道”部分。
    3. 在自定义CI配置路径字段中提供值。
    4. 单击保存更改。 ...

    如果CI配置将托管在外部站点上,则URL链接必须以结尾。yml:

    http://example.com/generate/ci/config.yml

    如果CI配置将托管在 GitLab,路径必须相对于另一个 项目,并在末尾添加组和项目名称:

    .gitlab ci。yml@mygroup/另一个项目

    我的/路径/。我的自定义文件。yml@mygroup/另一个项目

        4
  •  6
  •   Yevhen Lebid    6 年前

    使用 include 功能(可从GitLab 10.6获得): https://docs.gitlab.com/ee/ci/yaml/#include

        5
  •  6
  •   pyriand3r    5 年前

    所以,我一直想发布我现在想到的内容:

    目前,我们使用了@stefan van gastel的共享ci库思想和相对较新的 include gitlab 11.7的特性。我们对这种方法非常满意,因为我们现在可以在单个存储库中管理40多个存储库的构建管道。

    我创建了一个名为 ci_shared_library 包含

    1. 每个构建作业的shell脚本,包含步骤的执行逻辑。
    2. pipeline.yml 包含整个管道配置的文件。在before脚本中,我们加载 ci\U共享库 /tmp/shared 能够执行脚本。
    stages:
      - test
      - build
      - deploy
      - validate
    
    services:
      - docker:dind
    
    before_script:
      # Clear existing shared library
      - rm -rf /tmp/shared
      # Get shared library
      - git clone https://oauth2:${GITLAB_TOKEN}@${SHARED_LIBRARY} /tmp/shared
      - cd /tmp/shared && git checkout master && cd $CI_PROJECT_DIR
      # Set permissions
      - chmod -R +x /tmp/shared
      # open access to registry
      - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    
    test:
      stage: test
      script:
        - /tmp/shared/test.sh
    
    build:
      stage: build
      script:
        - /tmp/shared/build.sh
      artifacts:
        paths:
          - $CI_PROJECT_DIR/target/RPMS/x86_64/*.rpm
        expire_in: 3h
      only:
        - develop
        - /release/.*/
    
    deploy:
      stage: deploy
      script:
        - /tmp/shared/deploy.sh
      artifacts:
        paths:
          - $CI_PROJECT_DIR/tmp/*
        expire_in: 12h
      only:
        - develop
        - /release/.*/
    
    validate:
      stage: validate
      script:
        - /tmp/shared/validate.sh
      only:
        - develop
        - /release\/.*/
    

    每个想要使用此管道配置的项目都必须具有 .gitlab-ci.yml . 在这个文件中,唯一要做的就是导入共享 管道yml公司 来自的文件 ci\U共享库 回购。

    # .gitlab-ci.yml
    
    include:
      - project: 'ci_shared_library'
        ref: master
        file: 'pipeline.yml'
    

    使用这种方法,与管道相关的所有内容实际上都位于一个存储库中,并且是可重用的。我们将整个管道模板放在一个文件中,但我认为甚至可以将其拆分为一个yml文件中的每个作业。这样会更加灵活,可以创建默认作业,对于具有类似作业但并非每个项目都需要所有作业的项目,可以以不同方式合并在一起。。。

        6
  •  4
  •   VonC    4 年前

    具有 GitLab 13.5 (2020年10月) include 功能更有用:

    使用API验证扩展的GitLab CI/CD配置

    编写和调试复杂的管道不是一项简单的任务。您可以使用 include 关键字来帮助减少管道配置文件的长度。

    然而,如果您想在之前通过API验证整个管道,则必须分别验证每个包含的配置文件,这既复杂又耗时。

    现在,您可以通过API验证管道配置的完全扩展版本,并且 包括 包括配置。
    调试大型配置现在更容易、更高效。

    看见 Documentation Issue .

    以及:

    看见 GitLab 13.6 (2020年11月)

    包括多个CI/CD配置文件作为列表

    以前,在使用将多个文件添加到CI/CD配置时 include:file 语法,您必须为每个文件指定项目和引用。在这个版本中,您现在可以一次指定项目、引用并提供文件列表。这可以防止您重复自己的操作,并减少管道配置的冗长。

    https://about.gitlab.com/images/13_6/list.png -- Include multiple CI/CD configuration files as a list

    看见 Documentation )以及 Issue .

        7
  •  0
  •   VonC    4 年前

    你可以研究一下 Dynamic Child pipeline .

    它是随着 GitLab 13.2 (July 2020) :

    使用Jsonnet动态生成子管道配置

    我们发布了 Dynamic Child Pipelines back in GitLab 12.9 ,它允许您生成整个 .gitlab-ci.yml 运行时的文件。
    例如,当您希望运行时行为更加动态时,这是monorepos的一个很好的解决方案。

    现在,通过包含一个项目模板来演示如何使用Jsonnet生成YAML,我们使得在运行时创建CI/CD YAML变得更加容易。
    Jsonnet是一种数据模板语言,它提供函数、变量、循环和条件,允许完全参数化的YAML配置。

    https://about.gitlab.com/images/13_2/jsonnet-template.png

    看见 documentation issue .