如何测试 gitlab-ci. yml?

我最终设法让它工作,以便当你推到一个分支作业将启动,但我一直等待它启动大约3分钟,然后我有错误,我需要修复,然后再次提交,然后再次等待。我怎样才能只 ssh 到那个公共运行程序并在 bash 中测试 .gitlab-ci.yml“脚本”部分?

86839 次浏览

您可以使用 这是官方文件中描述的 gitlab-runner exec命令在本地运行构建(如果您控制运行程序的话)。

确保您也用这种方法检查测试作业的 局限性

声明一下: 你也可以把 gitlab-ci.yml复制粘贴到 gitlab 提供的 linter-form 中:

enter image description here

根据您使用的 IDE,您可能能够找到检查有效性的插件。例如,在 VS 代码中,您可以使用一个名为 Gitlab-vscode-扩展的插件,它可以验证您的 .gitlab-ci.yml文件。

如果你想通过编程验证你的 .gitlab-ci.yml,gitlab 提供空气污染指数允许你从 POST/ci/lint,例如:

curl --header "Content-Type: application/json" 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\"]}}"}'

正确的答案是,如果不将源代码提交到存储库,就无法测试构建管道。您只能使用 gitlab-runner exec 测试构建管道中的一个作业(很可能是第一个作业)。

由于不能运行多个作业,因此不能将任何准备或构建步骤与其他任何步骤链接起来。没有任何方法可以阻止 gitlab-runner 创建一个干净的签出,并破坏您的准备/构建步骤。

测试的最佳/唯一方法是创建一个分支,并将对. gitlab-ci. yml 的更改保持为强制。

如果你想超越单纯的 衬里实际上是逃跑你的 CI 脚本,你可以这样做使用 gitlab-runner。以下是如何做到这一点。

安装 gitlab-runner

OS=darwin
#OS=linux # Uncomment on linux
sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-${OS}-amd64
sudo chmod +x /usr/local/bin/gitlab-runner

官方 gitlab 运行文档 给你

创建一个命令

下面的 .gitlab-ci.yml文件定义了一个名为 build的任务:

build:
script:
- echo "Hello World"

在本地运行命令 限制-of-gitlab-runner-exec”rel = “ noReferrer”> (限制适用

gitlab-runner exec shell build

当我在本地运行以上代码时,会得到以下输出:

Running with gitlab-runner 11.3.1~beta.4.g0aa5179e (0aa5179e)
Using Shell executor...
Running on cory-klein.local...
Cloning repository...
Cloning into '/Users/coryklein/code/prometheus-redis-exporter/builds/0/project-0'...
done.
Checking out 66fff899 as master...
Skipping Git submodules setup
$ echo "Hello World"
Hello World
Job succeeded

看看 GitLab 13.3(2020年8月)能否有所帮助:

对于 .gitlab-ci.yml文件更好的 linting

在检查 CI 定义时,您现在可以使用我们的 CI 连环线深入管道处理,以验证 .gitlab-ci.yml的正确性。

CI 回环程序不仅为语法验证提供反馈,而且还通过模拟管道来验证其他类型的逻辑错误和无效配置,就像在 master 上运行一样(实际上没有运行任何东西)。

这可以帮助您更快地生成正确配置的管道,并帮助您避免管道通过连接器但仍然无法运行的情况。

参见 文件问题

而且,仍然与 GitLab 13.3(2020年8月)

现在 CI 线程除了可以提供错误之外还可以提供警告

CI 行程现在可以在验证 .gitlab-ci.yml文件时提供除错误消息之外的警告。

这使我们有机会在评估管道时提供更多的指导,从而更容易通过及早发现错误来避免更多类型的错误。

我们最初的迭代是在没有使用 workflow:rules的情况下使用 when:always规则时提供一个警告; 当创建 MR 时,这种情况会导致重复的管道,而且还会造成混淆。
除了在连接页面上显示这个新的警告消息之外,它还将出现在管道视图和运行管道页面上,以帮助您改进 CI 配置。

参见 文件问题


至于 GitLab 13.8(2021年1月) ,你可查阅其有效期:

管道编辑器中的 CI/CD 配置验证

以前,要验证 CI/CD 配置,必须导航到 CI lint 页面或提交更改并查找任何错误。

在这个版本中,我们已经在管道编辑器本身中添加了验证。

在编写 .gitlab-ci.yml文件之前,它会不断检查您的管道配置,并为您提供一个指示器,说明您的配置是有效的。
这样可以节省时间和精力,而这些时间和精力本来可以用于优化管道。

https://about.gitlab.com/images/13_8/config_val.png -- CI/CD configuration validation in Pipeline Editor

参见 文件问题


另见 GitLab 13.12(2021年5月)

管道编辑器中的管道状态小部件

以前,在使用管道编辑器提交更改之后,必须导航到不同的页面才能知道管道的实时状态。

在这个版本中,我们向管道编辑器添加了一个管道状态小部件,这样您就可以监视管道的状态,而不必离开编辑器。

https://about.gitlab.com/images/13_12/status.png -- Pipeline status widget in the pipeline editor

参见 文件问题

使用脚本和 gitlab 的 API

我的策略包含一个 Bash脚本,命令它通过 git 的 pre-commit挂钩运行。当然可以按需运行,这是一个脚本。

很难在本地模拟管道,特别是对于共享运行程序,但是不能对 yaml 配置文件使用 lint 以避免干扰。

它对 棉绒 .gitlab-ci.yml使用两个 Gitlab 的 API端点:

这两个 API 调用都依赖于 API_KEY,我在 ~/.gitlab.env$HOME中设置了 API_KEY。脚本来源于要在其环境上加载密钥的文件。

基于项目的端点还需要项目 ID。它可以从 git remote -v等提取出来,但是 为了简单只是在脚本中声明的,脚本是在项目的资源库中进行源代码控制的。

cat script/lint-ci
#!/usr/bin/env bash
# vim:sw=2:ts=2:et:ft=sh
# Written by lorenzogrv. Feel free to share and reuse.


set -Eeuo pipefail


cd "$(dirname "${BASH_SOURCE[0]}")/.."


fail () {
echo "$@" >&2
false
}


PROJECT_ID=XXXXXXXX


main () {
# shellcheck disable=SC1090
test -f ~/.gitlab.env && source ~/.gitlab.env


test -v API_KEY || fail "API_KEY not defined"
test -n "$API_KEY" || fail "API_KEY is empty"


local filename="${1:-".gitlab-ci.yml"}"
local response


response="$(
jq --null-input --arg yaml "$(<"$filename")" '{ content: $yaml }' \
| http --check-status \
POST https://gitlab.com/api/v4/ci/lint \
"PRIVATE-TOKEN: $API_KEY"
)"


if ! test "$(jq '.status' <<<"$response")" != "valid"
then
echo "$filename is invalid CI/CD config!"
jq <<<"$response"
false
else
echo "$filename is valid CI/CD config"
true
fi >&2


response="$(
jq --null-input --arg yaml "$(<"$filename")" '{ content: $yaml }' \
| http --check-status \
POST https://gitlab.com/api/v4/projects/$PROJECT_ID/ci/lint \
"PRIVATE-TOKEN: $API_KEY"
)"


if jq 'if .valid then empty else ("" | halt_error(1)) end' <<<"$response"
then
echo "Project's CI/CD config is valid"
true
else
echo "Project's CI/CD config is not valid"
jq <<<"$response" .errors
jq <<<"$response" .warnings
false
fi >&2
}


main "$@"

请注意脚本有一些依赖项:

可能的增强