CI Lint API

Tier: Free, Premium, Ultimate

Offering: GitLab.com, Self-managed, GitLab Dedicated

샘플 CI/CD 구성 유효성 검사

샘플 CI/CD YAML 구성이 유효한지 확인합니다. 이 엔드포인트는 프로젝트의 CI/CD 변수를 사용하고, include:local 항목에 대해 프로젝트의 파일을 검색하여 CI/CD 구성을 검증합니다.

POST /projects/:id/ci/lint
속성 유형 필수 설명
content 문자열 CI/CD 구성 내용입니다.
dry_run 불린 아니오 파이프라인 생성 시뮬레이션을 실행하거나 정적 검토만 수행합니다. 기본값: false.
include_jobs 불린 아니오 정적 검사 또는 파이프라인 시뮬레이션에서 존재할 작업 목록을 응답에 포함해야 하는지 여부입니다. 기본값: false.
ref 문자열 아니오 dry_runtrue일 때 CI/CD YAML 구성을 검증하는 데 사용할 브랜치 또는 태그 컨텍스트를 설정합니다. 설정하지 않으면 프로젝트의 기본 브랜치로 기본값이 설정됩니다.

예시 요청:

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\"}, \"stages\": [\"test\", \"deploy\", \"notify\"], \"rspec\": { \"script\": \"rake spec\", \"tags\": [\"ruby\", \"postgres\"], \"only\": [\"branches\"]}}"}'

예시 응답:

  • 유효한 구성:

    {
      "valid": true,
      "merged_yaml": "---\ntest_job:\n  script: echo 1\n",
      "errors": [],
      "warnings": []
    }
    
  • 유효하지 않은 구성:

    {
      "valid": false,
      "merged_yaml": "---\ntest_job:\n  script: echo 1\n",
      "errors": [
        "jobs config should contain at least one visible job"
      ],
      "warnings": []
    }
    

프로젝트의 CI/CD 구성 유효성 검사

주어진 ref(content_ref 매개변수, 기본값은 프로젝트의 기본 브랜치의 HEAD)에서 프로젝트의 .gitlab-ci.yml 구성이 유효한지 확인합니다. 이 엔드포인트는 CI/CD 구성을 검증하며, 프로젝트의 CI/CD 변수를 사용하고, include:local 항목에 대해 프로젝트의 파일을 검색합니다.

GET /projects/:id/ci/lint
속성 유형 필수 설명
content_ref 문자열 아니오 이 커밋 SHA, 브랜치 또는 태그에서 CI/CD 구성 내용이 가져옵니다. 설정하지 않으면 프로젝트의 기본 브랜치의 HEAD의 SHA로 기본값이 설정됩니다.
dry_run_ref 문자열 아니오 dry_runtrue일 때 CI/CD YAML 구성을 검증하는 데 사용할 브랜치 또는 태그 컨텍스트를 설정합니다. 설정하지 않으면 프로젝트의 기본 브랜치로 기본값이 설정됩니다.
dry_run 불린 아니오 파이프라인 생성 시뮬레이션을 실행하거나 정적 검사만 수행합니다.
include_jobs 불린 아니오 정적 검사 또는 파이프라인 시뮬레이션에서 존재할 작업 목록을 응답에 포함해야 하는지 여부입니다. 기본값: false.
ref 문자열 아니오 (사용 중단) dry_runtrue일 때 CI/CD YAML 구성을 검증하는 데 사용할 브랜치 또는 태그 컨텍스트를 설정합니다. 기본값은 설정하지 않으면 프로젝트의 기본 브랜치입니다. 대신 dry_run_ref를 사용하십시오.
sha 문자열 아니오 (사용 중단) 이 커밋 SHA, 브랜치 또는 태그에서 CI/CD 구성 내용이 가져옵니다. 설정하지 않으면 프로젝트의 기본 브랜치의 HEAD의 SHA로 기본값이 설정됩니다. 대신 content_ref를 사용하십시오.

예시 요청:

curl "https://gitlab.example.com/api/v4/projects/:id/ci/lint"

예시 응답:

  • 유효한 구성:
{
  "valid": true,
  "merged_yaml": "---\ntest_job:\n  script: echo 1\n",
  "errors": [],
  "warnings": []
}
  • 유효하지 않은 구성:
{
  "valid": false,
  "merged_yaml": "---\ntest_job:\n  script: echo 1\n",
  "errors": [
    "jobs config should contain at least one visible job"
  ],
  "warnings": []
}

jq를 사용하여 YAML 및 JSON 페이로드 생성 및 처리

YAML 구성을 CI Lint 엔드포인트에 POST하려면 올바르게 이스케이프되고 JSON으로 인코딩되어야 합니다.

jqcurl을 사용하여 YAML을 GitLab API에 이스케이프하고 업로드할 수 있습니다.

JSON 인코딩을 위한 YAML 이스케이프

따옴표를 이스케이프하고 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를 사용해 GitLab API에 POST하는 한 줄 명령어는 다음과 같습니다:

jq --null-input --arg yaml "$(<example-gitlab-ci.yml)" '.content=$yaml' \
| curl "https://gitlab.com/api/v4/projects/:id/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/*\ndeploy:\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을 사용하여 API에 POST
  4. 응답 형식 지정
jq --null-input --arg yaml "$(<example-gitlab-ci.yml)" '.content=$yaml' \
| curl "https://gitlab.com/api/v4/projects/:id/ci/lint?include_merged_yaml=true" \
--header 'Content-Type: application/json' --data @- \
| jq --raw-output '.merged_yaml | fromjson'