CI Lint API
샘플 CI/CD 구성 유효성 검사
샘플 CI/CD YAML 구성이 유효한지 확인합니다. 이 엔드포인트는 프로젝트 컨텍스트에서 CI/CD 구성을 유효성 검사하며 다음을 포함합니다:
- 프로젝트의 CI/CD 변수 사용.
-
include:local
항목을 위한 프로젝트 파일 검색.
POST /projects/:id/ci/lint
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
content
| 문자열 | 예 | CI/CD 구성 내용. |
dry_run
| 부울 | 아니요 |
파이프라인 생성 시뮬레이션 실행 또는 정적 검사만 수행. 기본값: false .
|
include_jobs
| 부울 | 아니요 | 응답에 포함할 정적 검사 또는 파이프라인 시뮬레이션에 존재할 작업 목록 여부. 기본값: false .
|
ref
| 문자열 | 아니요 |
dry_run 이 true 일 때 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 구성 유효성 검사
sha
속성은 GitLab 16.5에서 도입되었습니다.sha
및ref
는 GitLab 16.10에서content_ref
와dry_run_ref
로 이름이 변경되었습니다.
주어진 ref(기본값은 프로젝트의 기본 브랜치인 content_ref
매개변수)에 대한 프로젝트의 .gitlab-ci.yml
구성이 유효한지 확인합니다. 이 엔드포인트는 다음을 포함하여 CI/CD 구성을 유효성 검사합니다:
- 프로젝트의 CI/CD 변수 사용.
-
include:local
항목을 위한 프로젝트 파일 검색.
GET /projects/:id/ci/lint
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
content_ref
| 문자열 | 아니요 | 이 커밋 SHA, 브랜치 또는 태그에서 가져온 CI/CD 구성 내용. 설정되지 않은 경우 기본값은 프로젝트의 기본 브랜치의 헤드의 SHA입니다. |
dry_run_ref
| 문자열 | 아니요 |
dry_run 이 true 일 때 사용할 브랜치 또는 태그 컨텍스트를 설정합니다. 설정되지 않은 경우 기본값은 프로젝트의 기본 브랜치입니다.
|
dry_run
| 부울 | 아니요 | 파이프라인 생성 시뮬레이션 실행 또는 정적 검사만 수행. |
include_jobs
| 부울 | 아니요 | 응답에 포함할 정적 검사 또는 파이프라인 시뮬레이션에 존재할 작업 목록 여부. 기본값: false .
|
ref
| 문자열 | 아니요 | (사용 중단됨) dry_run 이 true 일 때 CI/CD YAML 구성을 검증하는 데 사용할 브랜치 또는 태그 컨텍스트를 설정합니다. 설정되지 않은 경우 기본값은 프로젝트의 기본 브랜치입니다. 대신 dry_run_ref 를 사용하세요.
|
sha
| 문자열 | 아니요 | (사용 중단됨) 이 커밋 SHA, 브랜치 또는 태그에서 가져온 CI/CD 구성 내용. 설정되지 않은 경우 기본값은 프로젝트의 기본 브랜치의 헤드의 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": []
}
YAML 및 JSON 페이로드를 생성하고 처리하는 데 jq 사용
CI Lint 엔드포인트에 YAML 구성을 POST
하려면 올바르게 이스케이프하고 JSON 인코딩해야 합니다. 이를 위해 jq
와 curl
을 사용하여 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 파일을 이스케이프하고 인코딩할 수 있습니다:
jq --raw-input --slurp < example-gitlab-ci.yml
입력된 YAML 파일(example-gitlab-ci.yml
)을 이스케이프하고 인코딩한 후 curl
및 jq
를 사용하여 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"
한 줄의 명령어로 다음을 할 수 있습니다:
- YAML 이스케이프 처리
- JSON으로 인코딩
- curl로 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 @- \
| jq --raw-output '.merged_yaml | fromjson'