Gitlab并将隐藏的关键脚本放入包含文件中

Posted

技术标签:

【中文标题】Gitlab并将隐藏的关键脚本放入包含文件中【英文标题】:Gitlab and placing hidden key scripts into include files 【发布时间】:2019-08-13 17:55:18 【问题描述】:

我有几个不同的脚本,我想在多个项目的不同阶段运行这些脚本。目前它们的形式是:

.hidden_key:  &hidden_key |
  do_something
  do_something_else

real_job:
  script:
    - *hidden_key

实际上.hidden_key 是我在整个.gitlab-ci.yml 文件中以及以这种方式跨多个项目使用的函数。但是当我将.hidden_key 移动到文件中并像这样包含它时,我似乎无法让包含工作:

include:
   - remote: https://gitlab/project/master/raw/hidden_key.yml

real_job:
  script:
    - *hidden_key

当我这样做时,gitlab 抱怨:

Error: Unknown alias: hidden_key

我做错了什么,或者这是包含的实际限制(因此不受支持)?

有什么替代方法可以清理我的.gitlab-ci.yml 文件?

【问题讨论】:

【参考方案1】:

他们添加了!references 标签

https://docs.gitlab.com/ee/ci/yaml/README.html#reference-tags

本质上,这就是您可以完成对别名的引用的方法

    include:
       - remote: https://gitlab/project/master/raw/hidden_key.yml
    
    real_job:
      script:
        - !reference [.hidden_key]

【讨论】:

【参考方案2】:

这几乎可以肯定是包含的限制(使用标记显式实现会更好)。

标准 YAML 加载包括 parse, a compose and a construction phase. 别名在撰写阶段得到解析,并且锚点例如不要结转到多文档 YAML 文件中的下一个文档。

尽管include 键可能被解释为构建阶段的早期(但这也可能在完成该阶段之后发生,解释生成的数据结构),然后包含 YAML 中的别名将已经需要在它的撰写阶段。

使用一些模板系统 jinja2 会更幸运,当然您也可以使用常见阶段填充要从 YAML 文件中替换的变量。

【讨论】:

您是否建议我可以在 .gitlab-ci.yml 文件中使用 jinja2 模板?或者我应该以某种方式通过脚本使用 jinja2 模板创建该文件?如果是后者,gitlab 可以通过提交触发器或其他方式自动执行此操作吗?如果是这样,将非常欢迎指向解释这一点的文档的指针!感谢您的回复,顺便说一句,非常感谢! 我不知道这是否可以在 gitlab 中完成。我通过实现一个新命令来完成类似于 docker-compose 的操作(提供不可用的功能),该命令生成 docker-compose 期望的 YAML 文件,然后调用 docker-compose。并通过在文档的后端运行预处理器来支持 readthedocs.org 上基于 YAML 的文档文件格式。后者是可能的,因为它们允许 python 代码在沙箱中运行,gitlab 需要提供类似的东西,但我不知道它是否提供。【参考方案3】:

您是否尝试过使用extends? Documentation

例子:

include:
   - remote: https://gitlab/project/master/raw/hidden_key.yml

real_job:
  extends: .hidden_key

【讨论】:

以上是关于Gitlab并将隐藏的关键脚本放入包含文件中的主要内容,如果未能解决你的问题,请参考以下文章

将脚本移动到 gitlab-ci.yml 中的单独文件中以避免代码重复并将其包含在多个文件中

在 C# 的代码隐藏中创建具有值的表脚本

在 python 脚本中隐藏密码(仅限不安全的混淆)

在 HTML 页面中包含隐藏数据以供 javascript 处理

如何隐藏 C++ 头文件中的函数

从 dvb-t 中提取隐藏式字幕