作者:手机用户2502931713 | 来源:互联网 | 2023-01-05 11:59
我们正在考虑将我们的ci从jenkins转移到gitlab.我们有几个项目具有相同的构建工作流程.现在我们使用一个共享库来定义管道,项目中的jenkinsfile只调用定义实际管道的共享库中定义的方法.因此,只需要在影响多个项目的单个点上进行更改.
我想知道gitlab ci是否可以实现相同的功能?据我所知,无法在存储库外定义gitlab-ci.yml.是否有另一种方法来定义管道并与多个项目共享此配置以简化维护?
1> Stefan van G..:
首先让我先说:谢谢你提出这个问题!它引发了我在经常想知道自己是否有可能之后再次寻找解决方案.我们还有20到30个完全相同的项目,并且有.gitlab-ci.yml
大约400到500个loc的文件,如果一件事发生变化,每个文件都必须更改.
所以我找到了一个有效的方案:
灵感来自Auto DevOps .gitlab-ci.yml模板 Gitlab本身创建,并且他们使用一个模板作业定义所有使用的函数并调用每个before_script
加载它们,我想出了以下设置.
需要一组共享的CI作业/功能的多个项目仓库(项目-1,项目-2)
函数脚本包含单独repo中的所有共享函数
档
所以使用共享的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秘密变量来个性化项目的构建作业.像环境URL等.
2> miq..:
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实例上创建一个新项目.gitlab-ci.yml
。