如何设置动态gitlab-ci文件

时间:2019-07-02 12:32:14

标签: gitlab yaml gitlab-ci

我正在尝试设置一个动态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文件。

希望有人可以帮助我或为我指明正确的方向。

2 个答案:

答案 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

还请注意,每个阶段都必须具有唯一的标识符/职位名称!