我正在尝试设置一个动态gitlab-ci文件,其中包含基于项目变量的所需gitlab-ci文件。
不幸的是,我似乎无法使它正常工作,我已经阅读了文档并搜索了论坛,但不幸的是,我找不到任何解决方案。
如何实现动态gitlab-ci文件?
本质上,我想做类似下面的代码片段,但是我注意到我无法在file方法中使用变量(返回“无效的配置:文件不存在”。)。
include:
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-$GITLABFILE.yml'
only:
- $GITLABFILE
include:
- project: 'tools/gitlab-ci'
file: '/gitlab-ci.yml'
only:
- $GITLABFILE == null
由于我无法在file方法中使用变量,因此尝试了以下配置,但不幸的是,它始终加载最后一个文件,而忽略了唯一关键字。
include:
- project: 'tools/gitlab-ci'
file: '/gitlab-ci.yml'
except:
variables:
- $GITLABFILE
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-legacy.yml'
only:
variables:
- $GITLABFILE == 'legacy'
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-legacy-nobuild.yml'
only:
variables:
- $GITLABFILE == 'legacy-nobuild'
我希望有一个gitlab-ci文件,它可以基于变量检索其他gitlab-ci文件。
希望有人可以帮助我或为我指明正确的方向。
答案 0 :(得分:1)
为什么不将条件逻辑放在这些单独的gitlab-ci文件中,然后将它们全部包含在内。
类似的事情-在您的主文件中:
variables:
GITLABFILE: legacy
include:
- project: 'tools/gitlab-ci'
file: '/gitlab-ci.yml'
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-legacy.yml'
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-legacy-nobuild.yml'
然后在每个子文件中-例如在gitlab-ci-legacy.yml
中:
job:
script:
- echo Do something
only:
variables:
- $GITLABFILE == "legacy"
查看更多:https://docs.gitlab.com/ee/ci/yaml/#onlyvariablesexceptvariables
答案 1 :(得分:1)
多亏了Ivan,我找到了一个完美的解决方案,我要做的就是创建1个gitlab-ci,其中包括所有其他文件,并且在每个特定文件中,我都使用了像Ivan建议的唯一关键字。
现在我的文件如下:
在项目级别(在每个项目中)存在的gitlab-ci:
include:
- project: 'tools/gitlab-ci'
file: '/selector.yml'
然后我的selector.yml文件如下:
include:
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-global.yml'
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-nobuild.yml'
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-legacy.yml'
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-multitheme.yml'
- project: 'tools/gitlab-ci'
file: '/gitlab-ci-default.yml'
由于读取了所有文件,因此我不得不将我的before_script任务移到每个阶段,否则gitlab只读取最后一个before_script声明,因此我为此创建了一个模板/锚点:
.before_script_template: &before-script-legacy
before_script:
- apt-get update -y && apt-get install -yqqf openssh-client git unzip sshpass rsync --fix-missing
# Is probably already present but just to be sure.
- npm install -g gulp
- npm install -g bower
- echo "You've set the GITLABFILE var to legacy and therefore get this file"
compile_legacy:
stage: build
<<: *before-script-legacy
script:
- #Some stuff here....
only:
variables:
- $GITLABFILE == "legacy" && $SKIP_COMPILE == null
还请注意,每个阶段都必须具有唯一的标识符/职位名称!