首先让我开始说:谢谢您提出这个问题!在经常想知道自己是否有可能之后,它再次激发了我寻找解决方案的机会。我们也有20-30个项目,它们完全相同,并且包含
.gitlab-ci.yml大约400-500个loc文件,如果一件事情发生变化,则每个文件都必须更改。
所以我找到了一个可行的解决方案:
受Gitlab自身创建的Auto DevOps .gitlab-ci.yml模板的启发,它们在其中使用一个模板作业来定义所使用的所有函数并调用每个函数
before_script来加载它们,我提出了以下设置。
- 多个项目仓库(project-1,project-2)需要一组共享的CI作业/功能
- 功能脚本包含单独回购中的所有共享功能
档案
因此,使用共享的ci jobs scipt:
#!/bin/bashfunction 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:latestbefore_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.shjob1: script: - current_job_info - list_files
您可以将文件从project-1复制粘贴到project-2,并且使用相同的共享Gitlab CI函数。
这些示例出于示例目的而非常冗长,可以按照自己喜欢的任何方式对其进行优化。
得到教训
因此,在将上述构造大规模应用(超过40个项目)之后,我想分享一些经验教训,因此您不必找出困难的方法:
- 版本(标记/发布)您共享的ci函数脚本。现在,更改一件事可能会使所有管道失败。
- 使用不同的Docker映像可能会导致要求bash加载功能的问题(例如,我将一些基于Alpine的映像用于
sh
默认情况下基于CLI工具的作业) - 使用基于项目的CI / CD机密变量来个性化项目的构建作业。像环境网址等。



