我正在尝试建立一个动态的gitlab文件,其中包括基于一个项目变量的所需的gitlab文件。
不幸的是,我似乎无法做到这一点,我已经阅读了文档和搜索论坛,但不幸的是,我找不到任何解决方案。
如何实现动态gitlab文件?
本质上,我想做一些类似下面的片段,但我注意到在file方法中不能使用变量(返回“无效的config: 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文件可以基于变量检索其他gitlab文件。
希望有人能帮助我或者指出正确的方向。
发布于 2019-07-02 20:38:58
你为什么不把条件逻辑放在这些单独的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
发布于 2019-08-22 09:07:17
多亏了Ivan,我找到了完美的解决方案,我所做的就是创建一个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
还请注意,每个阶段必须有一个唯一的标识符/作业名称!
发布于 2021-09-26 20:28:43
一个可能的解决方案:见GitLab 14.3 (2021年9月)
包括基于条件的GitLab CI/CD配置 在编写完整的CI/CD管道时,
include
是最流行的关键字之一。 如果要构建更大的管道,则可能使用include
关键字将外部YAML配置引入管道。 在这个版本中,我们扩展了关键字的功能,以便您可以在include
条件下使用rules
。 现在,您可以决定何时包含外部CI/CD配置。这将帮助您编写一个标准化的管道,能够根据您所选择的条件动态地修改自己。
示例:
您只能在
if
中使用include
规则,也只能在某些变量中使用。 不支持rules
关键字,如changes
和exists
。
include:
- local: builds.yml
rules:
- if: '$INCLUDE_BUILDS == "true"'
test:
stage: test
script: exit 0
见GitLab 14.5 (2021年11月)
条件包含和存在关键字
include
关键字是编写完整CI/CD管道时最常用的关键字之一。如果要构建更大的管道,则可能使用include
关键字将外部YAML配置引入管道。 在这个版本中,我们扩展了关键字的功能,以便您可以在规则条件下使用include withexists
。现在,您可以根据存储库中存在某些文件的时间来决定何时包含外部CI/CD配置。
https://stackoverflow.com/questions/56852576
复制相似问题