CI Lint API
验证命名空间的 CI/CD 配置
Validate sample CI/CD configuration
检查 CI/CD YAML 配置是否有效。此端点具有特定于命名空间的上下文。包括:
- 使用项目的 CI/CD 变量。
- 搜索项目文件中的
include:local
条目。
POST /projects/:id/ci/lint
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
content |
string | yes | CI/CD 配置内容 |
dry_run |
boolean | no | 运行流水线创建模拟,或仅进行静态检查。默认为 false
|
include_jobs |
boolean | no | 如果静态检查或流水线模拟中存在的作业列表应该包含在响应中,则默认为 false
|
ref |
string | no | 当 dry_run 为 true ,设置要用的分支或标签。如果未设置,则默认为项目的默认分支 |
请求示例:
curl --header "Content-Type: application/json" "https://gitlab.example.com/api/v4/projects/:id/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\"]}}"}'
响应示例:
-
有效配置:
{ "valid": true, "merged_yaml": "---\n:test_job:\n :script: echo 1\n", "errors": [], "warnings": [] }
-
无效配置:
{ "valid": false, "merged_yaml": "---\n:test_job:\n :script: echo 1\n", "errors": [ "jobs config should contain at least one visible job" ], "warnings": [] }
验证项目的 CI 配置
sha
属性引入于 16.5。- 在极狐GitLab 16.10 中
sha
和ref
被重命名为content_ref
和dry_run_ref
检查项目的最新(项目默认分支的 HEAD
).gitlab-ci.yml
配置是否有效。此端点使用所有可用的命名空间特定数据,包括变量和本地包含:
- 使用项目的 CI/CD 变量。
- 搜索项目文件中的
include:local
条目。
GET /projects/:id/ci/lint
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
dry_run |
boolean | no | 运行流水线创建模拟,或仅进行静态检查 |
include_jobs |
boolean | no | 如果静态检查或流水线模拟中存在的作业列表应该包含在响应中,则默认为 false
|
content_ref |
string | No | CI/CD配置内容取自此提交的SHA,分支或标签。如未设置,则默认为项目的默认分支的SHA。 |
dry_run_ref |
string | No | 当 dry_run 设为 true ,设置分支或标签文本使用有效的 CI/CD YAML 配置。当未设置时,默认为项目的默认分支。 |
ref |
string | No | (弃用)当 dry_run 设为 true ,设置分支或标签文本使用有效的 CI/CD YAML 配置。当未设置时,默认为项目的默认分支。使用 dry_run_ref 取而代之。 |
sha |
string | No | (弃用)CI/CD配置内容取自此提交的SHA,分支或标签。如未设置,则默认为项目的默认分支的SHA。使用 content_ref 代替。 |
请求示例:
curl "https://gitlab.example.com/api/v4/projects/:id/ci/lint"
响应示例:
- 有效配置:
{
"valid": true,
"merged_yaml": "---\n:test_job:\n :script: echo 1\n",
"errors": [],
"warnings": []
}
- 无效配置:
{
"valid": false,
"merged_yaml": "---\n:test_job:\n :script: echo 1\n",
"errors": [
"jobs config should contain at least one visible job"
],
"warnings": []
}
使用 jq 创建并处理 YAML & JSON 负载
要将 YAML 配置 POST
到 CI Lint 端点,必须对其进行正确转义和 JSON 编码。您可以使用 jq
和 curl
转义 YAML 并将其上传到极狐GitLab API。
为 JSON 编码进行转义
转义引号并在 JSON 负载中以适合嵌入的格式对 YAML 进行编码,您可以使用 jq
。例如,创建一个名为 example-gitlab-ci.yml
的文件:
.api_test:
rules:
- if: $CI_PIPELINE_SOURCE=="merge_request_event"
changes:
- src/api/*
deploy:
extends:
- .api_test
rules:
- when: manual
allow_failure: true
script:
- echo "hello world"
使用 jq
进行转义并将 YAML 文件编码为 JSON:
jq --raw-input --slurp < example-gitlab-ci.yml
要转义和编码输入 YAML 文件(example-gitlab-ci.yml
),并在单行命令中使用 curl
和 jq
将其 POST
到极狐GitLab API:
jq --null-input --arg yaml "$(<example-gitlab-ci.yml)" '.content=$yaml' \
| curl "https://gitlab.com/api/v4/ci/lint?include_merged_yaml=true" \
--header 'Content-Type: application/json' \
--data @-
解析 CI Lint 响应
要重定 CI Lint 响应的格式,您可以使用 jq
。您可以将 CI Lint 响应通过管道传输到 jq
,或将 API 响应存储为文本文件并将其作为参数提供:
jq --raw-output '.merged_yaml | fromjson' <your_input_here>
输入示例:
{"status":"valid","errors":[],"merged_yaml":"---\n:.api_test:\n :rules:\n - :if: $CI_PIPELINE_SOURCE==\"merge_request_event\"\n :changes:\n - src/api/*\n:deploy:\n :rules:\n - :when: manual\n :allow_failure: true\n :extends:\n - \".api_test\"\n :script:\n - echo \"hello world\"\n"}
变成:
:.api_test:
:rules:
- :if: $CI_PIPELINE_SOURCE=="merge_request_event"
:changes:
- src/api/*
:deploy:
:rules:
- :when: manual
:allow_failure: true
:extends:
- ".api_test"
:script:
- echo "hello world"
您可以使用单行命令:
- 转义 YAML
- 用 JSON 编码
- 使用 curl 将其 POST 为 API
- 设定响应的格式
jq --null-input --arg yaml "$(<example-gitlab-ci.yml)" '.content=$yaml' \
| curl "https://gitlab.com/api/v4/ci/lint?include_merged_yaml=true" \
--header 'Content-Type: application/json' --data @- \
| jq --raw-output '.merged_yaml | fromjson'