一尘不染

在项目之间共享gitlab-ci.yml

jenkins

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

我想知道gitlab ci是否也可以做到?据我发现,无法在存储库外部定义gitlab-
ci.yml。还有另一种定义管道并与几个项目共享此配置以简化维护的方法吗?


阅读 885

收藏
2020-07-25

共1个答案

一尘不染

首先让我开始说:谢谢您提出这个问题!在经常想知道自己是否有可能之后,它再次激发了我寻找解决方案的机会。我们也有20-30个项目,它们完全相同,并且包含.gitlab- ci.yml大约400-500个loc文件,如果一件事情发生变化,则每个文件都必须更改。

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

受Gitlab自身创建的Auto DevOps .gitlab-ci.yml模板的启发,它们在其中使用一个模板作业来定义所使用的所有函数调用每个函数before_script来加载它们,我提出了以下设置。

档案

因此,使用共享的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的映像用于sh默认情况下基于CLI工具的作业)
  • 使用基于项目的CI / CD机密变量来个性化项目的构建作业。像环境网址等。
2020-07-25