用于语法问题的 Lint GitLab 管道模板

Lint GitLab pipeline templates for syntax issues

我有一个项目,其中包含其他项目可以用于其工作的各种管道模板,让我的 CI 保持干燥。这些不在 .gitlab-ci.yml 文件中,而是在单独的 ./templates/language.yml 文件中。

我已经在使用 yaml lint 来确保它是有效的 yaml,但我想确保我也在使用有效的 GitLab CI 语法。

我想在合并时检查我的 CI 模板。我拒绝了 运行 gitlab-runner exec shell 因为我不知道如何触发特定副本。看起来 API 中可能有一些东西,但我还没能确定秘诀。

你是怎么做到的?

我们使用两种不同的方法来实现这一目标。

  1. 通过API - https://docs.gitlab.com/ee/api/lint.html
  2. 在我的模板中设置了一个假项目
  3. 使用 gitlab-ci-local

通过API

第一种方法是通过 API 使用来自 gitlab 的 linter:

curl --header "Content-Type: application/json" --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/ci/lint" --data '{"content": "{ \"image\": \"ruby:2.6\", \"services\": [\"postgres\"], \"before_script\": [\"bundle install\", \"bundle exec rake db:create\"], \"variables\": {\"DB_NAME\": \"postgres\"}, \"types\": [\"test\", \"deploy\", \"notify\"], \"rspec\": { \"script\": \"rake spec\", \"tags\": [\"ruby\", \"postgres\"], \"only\": [\"branches\"]}}"}'

这里的问题是你不能利用 JOB_TOKEN 来做到这一点,因此你需要注入一个秘密并生成一个令牌来实现这一点。甚至还有可用的 linting 库 - https://github.com/BuBuaBu/gitlab-ci-lint

假项目

第二种方法模仿设置,使用自己的 .gitlab-ci.yml,其中包含模板并执行它。就像普通的合并请求管道一样。通过这种方式,我们确保脚本没有任何故障并且可以保存以供使用。我们为 docker 图像以及 gradle 构建模板等执行此操作。

例如。对于 docker 图像,我们构建图像,包括模板,并将作业的 image 属性 覆盖到临时 docker 图像。

gitlab-ci-local

第三种方法不够ci,并且根据功能,缺乏功能。有工具 gitlab-ci-local https://github.com/firecow/gitlab-ci-local 可用于验证 gitlab ci 构建并执行它们。但它不是官方的ci正式实施,并非所有功能都存在。最后你还需要一些项目设置。

如果我可以选择,我会选择第一种方法。在我们的案例中,它已被证明是有用的。为了长期保存解决方案,伪造项目的初始努力并不多。