首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置动态gitlab-ci文件

如何设置动态gitlab-ci文件
EN

Stack Overflow用户
提问于 2019-07-02 12:32:14
回答 3查看 4.4K关注 0票数 2

我正在尝试建立一个动态的gitlab文件,其中包括基于一个项目变量的所需的gitlab文件。

不幸的是,我似乎无法做到这一点,我已经阅读了文档和搜索论坛,但不幸的是,我找不到任何解决方案。

如何实现动态gitlab文件?

本质上,我想做一些类似下面的片段,但我注意到在file方法中不能使用变量(返回“无效的config: File不存在”)。)。

代码语言:javascript
运行
复制
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方法中使用变量,所以我尝试了下面的配置,但不幸的是,它总是加载最后一个文件,而忽略了惟一的关键字。

代码语言:javascript
运行
复制
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文件。

希望有人能帮助我或者指出正确的方向。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-02 20:38:58

你为什么不把条件逻辑放在这些单独的gitlab-ci文件中,然后把它们都包括进去。

就像这样-在你的主文件里:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
job:
  script:
    - echo Do something
  only:
    variables:
      - $GITLABFILE == "legacy"

见更多信息:https://docs.gitlab.com/ee/ci/yaml/#onlyvariablesexceptvariables

票数 1
EN

Stack Overflow用户

发布于 2019-08-22 09:07:17

多亏了Ivan,我找到了完美的解决方案,我所做的就是创建一个gitlab-ci,它包含所有其他的内容,在每个特定的文件中,我使用了唯一的关键字,就像Ivan建议的那样。

现在我的文件看起来是这样的:

在项目级别上存在的gitlab-ci (在每个项目中):

代码语言:javascript
运行
复制
include:
  - project: 'tools/gitlab-ci'
    file: '/selector.yml'

然后,我的selector.yml文件如下所示:

代码语言:javascript
运行
复制
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声明,因此我为此创建了一个模板/锚:

代码语言:javascript
运行
复制
.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

还请注意,每个阶段必须有一个唯一的标识符/作业名称!

票数 2
EN

Stack Overflow用户

发布于 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关键字,如changesexists

代码语言:javascript
运行
复制
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 with exists。现在,您可以根据存储库中存在某些文件的时间来决定何时包含外部CI/CD配置。

文档问题

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56852576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档