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_runtrue,设置要用的分支或标签。如果未设置,则默认为项目的默认分支

请求示例:

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 中 sharef 被重命名为 content_refdry_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 编码。您可以使用 jqcurl 转义 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),并在单行命令中使用 curljq 将其 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"

您可以使用单行命令:

  1. 转义 YAML
  2. 用 JSON 编码
  3. 使用 curl 将其 POST 为 API
  4. 设定响应的格式
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'