파이프라인 실행 정책
- GitLab 17.2에 소개되었으며, 기본으로 활성화된
pipeline_execution_policy_type
이라는 플래그와 함께 함께 소개되었습니다. GitLab 17.3에서 feature flag가 제거되었습니다.
파이프라인 실행 정책을 사용하여 모든 적용 가능한 프로젝트에 대해 CI/CD 작업을 실행합니다.
- 비디오 안내는 보안 정책: 파이프라인 실행 정책 유형을(를) 참조하세요.
파이프라인 실행 정책 스키마
suffix
필드는 GitLab 17.4에서 소개되었습니다.
파이프라인 실행 정책을 가진 YAML 파일은 pipeline_execution_policy
키 아래 중첩된 파이프라인 실행 정책 스키마와 일치하는 객체 배열로 구성됩니다. 보안 정책 프로젝트 당 pipeline_execution_policy
키 아래 최대 다섯 개의 정책을 구성할 수 있습니다. 첫 다섯 개 이후 구성된 다른 정책은 적용되지 않습니다.
새 정책을 저장할 때 GitLab은 해당 내용을 이 JSON 스키마에 대해 유효성을 검사합니다. JSON 스키마의 읽는 방법을 잘 모르신다면, 다음 섹션 및 표가 대안으로 제공됩니다.
필드 | 유형 | 필수 | 설명 |
---|---|---|---|
pipeline_execution_policy
|
파이프라인 실행 정책 의 배열
| true | 파이프라인 실행 정책 목록 (최대 다섯 개) |
파이프라인 실행 정책 스키마
필드 | 유형 | 필수 | 설명 |
---|---|---|---|
name
| 문자열
| true | 정책의 이름. 최대 255자까지 가능합니다. |
description (선택 사항)
| 문자열
| true | 정책 설명. |
enabled
| 부울
| true | 정책을 활성화(true ) 또는 비활성화(false )하는 플래그.
|
content
|
content 의 객체
| true | 프로젝트 파이프라인에 삽입할 CI/CD 구성에 대한 참조. |
pipeline_config_strategy
| 문자열
| false |
inject_ci 또는 override_project_ci 중 하나일 수 있습니다. 자세한 내용은 파이프라인 전략을 참조하세요.
|
suffix
| 문자열
| false |
on_conflict (기본) 또는 never 중 하나일 수 있습니다. 프로젝트 및 모든 해당 정책에서 작업명이 고유하지 않은 작업명에 대해 작업명 충돌 처리 동작을 정의합니다. on_conflict 는 고유성을 깨뜨리는 작업들을 위해 작업명 뒤에 고유한 접미사를 적용합니다. never 는 프로젝트 및 모든 적용 가능한 정책에 걸쳐 작업명이 고유하지 않다면 파이프라인이 실패합니다.
|
policy_scope
|
policy_scope 의 객체
| false | 규정 프레임워크 레이블 또는 정의한 프로젝트를 기준으로 정책을 범위 지정합니다. |
다음 사항을 유의하세요:
- 파이프라인을 트리거하는 사용자는 파이프라인 실행 파일에 적어도 읽기 액세스해야 하며, 그렇지 않으면 파이프라인이 시작되지 않습니다.
- 파이프라인 실행 파일이 삭제되거나 이름이 변경되면 정책이 실행된 프로젝트의 파이프라인이 작동을 멈출 수 있습니다.
- 파이프라인 실행 정책 작업은 다음 두 예약된 단계 중 하나에 할당할 수 있습니다:
-
.pipeline-policy-pre
:.pre
단계 앞에 처음에 기본으로 설정된 파이프라인 앞에서 실행됩니다. -
.pipeline-policy-post
:.post
단계 후에 기본으로 설정된 파이프라인의 마지막에 실행됩니다.
-
- 예약된 단계 중 하나에 작업을 삽입하면 항상 작동할 수 있습니다. 실행 정책 작업은 표준(빌드, 테스트, 배포) 또는 사용자가 선언한 단계 중 하나에 할당될 수도 있습니다. 그러나 이 경우 프로젝트 파이프라인 구성에 따라 작업이 무시될 수 있습니다.
- 파이프라인 실행 정책이 적용된 프로젝트에 CI/CD 구성 파일이 없어도 파이프라인 실행 정책은 계속 유지됩니다.
- 정책의 순서는 적용된 접미사에 영향을 미칩니다.
- 주어진 프로젝트에 적용된 모든 정책 중 하나라도
suffix: never
를 가지고 있다면 다른 프로젝트의 파이프라인에 동일한 이름의 다른 작업이 이미 있으면 파이프라인이 실패합니다.
작업명 작성 규칙
- GitLab 17.4에서 작업명 충돌 처리가 소개되었습니다.
보안 정책에서 나온 작업에 대한 시각적인 표시가 없습니다. 작업명에 고유한 접두사 또는 접미사를 추가하면 이를 식별하고 작업명 충돌을 피할 수 있습니다.
예시:
-
policy1:deployments:sast
- 좋음, 정책 및 프로젝트 전체에서 고유합니다. -
sast
- 나쁨, 다른 곳에서 사용될 가능성이 높습니다.
파이프라인 실행 정책은 suffix
속성에 따라 이름 충돌을 처리합니다.
-
on_conflict
(기본) 사용 시, 파이프라인의 작업명이 다른 작업명과 충돌하면 접미사가 추가됩니다. -
never
사용 시, 충돌 시 접미사가 추가되지 않고 파이프라인이 실패합니다.
적용된 접미사는 다음과 같은 순서로 추가됩니다:
- 프로젝트 파이프라인 작업
- 프로젝트 정책 작업 (적용 가능한 경우)
- 그룹 정책 작업 (적용 가능한 경우, 계층 구조에 따라 정렬되며 최상위 그룹이 마지막으로 적용됨)
적용된 접미사의 형식은 다음과 같습니다:
:policy-<security-policy-project-id>-<policy-index>
.
결과적으로 생성된 작업의 예시: sast:policy-123456-0
.
보안 정책 프로젝트에서 여러 정책이 동일한 작업명을 정의하는 경우, 숫자 접미사는 충돌 정책의 인덱스에 해당합니다.
결과적으로 생성된 작업의 예시:
sast:policy-123456-0
sast:policy-123456-1
업무 단계 최상의 실천 방법
파이프라인 실행 정책에서 정의된 작업은 프로젝트의 CI/CD 구성에서 정의된 단계로 사용할 수 있으며, 또한 예약된 단계인 .pipeline-policy-pre
와 .pipeline-policy-post
도 사용할 수 있습니다.
참고:
정책에 .pre
와 .post
단계에서만 작업이 포함된 경우, 정책의 파이프라인은 “비어있는”으로 평가되어 프로젝트의 파이프라인과 병합되지 않습니다. 파이프라인 실행 정책에서 .pre
및 .post
단계를 사용하려면 예를 들어 .pipeline-policy-pre
에서 사용 가능한 다른 단계에서 실행되는 작업을 반드시 포함해야 합니다.
inject_ci
파이프라인 전략을 사용할 때 대상 프로젝트에 자체 .gitlab-ci.yml
파일이 없으면 기본 파이프라인 단계와 예약된 단계만 사용할 수 있습니다.
다른 프로젝트의 CI/CD 구성을 제어하지 않는 프로젝트에 파이프라인 실행 정책을 강제로 적용할 때, 반드시 작업을 .pipeline-policy-pre
및 .pipeline-policy-post
단계에 정의해야 합니다. 이러한 단계는 프로젝트의 CI/CD 구성 여부에 관계없이 항상 사용할 수 있습니다.
content
유형
필드 | 유형 | 필수 | 설명 |
---|---|---|---|
project
| string
| true | 동일한 GitLab 인스턴스의 프로젝트에 대한 전체 GitLab 프로젝트 경로입니다. |
file
| string
| true | 루트 디렉터리 (/)를 기준으로 한 전체 파일 경로입니다. YAML 파일은 .yml 또는 .yaml 확장자를 가져야 합니다.
|
ref
| string
| false | 파일을 검색할 ref입니다. 지정되지 않은 경우 프로젝트의 HEAD가 기본값입니다. |
정책에서 content
유형을 사용하여 다른 저장소에 저장된 CI/CD 구성을 참조할 수 있습니다. 이를 통해 동일한 CI/CD 구성을 여러 정책에서 재사용하여 이러한 구성을 유지하는 오버헤드를 줄일 수 있습니다. 예를 들어, 정책 A 및 정책 B에서 강제로 적용하려는 사용자 정의 비밀 감지 CI/CD 구성이 있다면, 단일 YAML 구성 파일을 작성하고 해당 구성을 둘 다 참조할 수 있습니다.
전제 조건:
-
content
유형을 포함하는 정책을 포함하는 프로젝트에서 파이프라인을 트리거하는 사용자는 해당 CI/CD를 포함하는 프로젝트에 대해 최소한 읽기 전용 액세스를 가져야 합니다. - 파이프라인 실행 정책을 강제로 적용하는 프로젝트에서, 사용자는 파이프라인을 트리거하기 위해 해당 프로젝트에 대해 최소한 읽기 전용 액세스를 가져야 합니다.
GitLab 17.4 이상에서 보안 정책 프로젝트에서 지정된 CI/CD 구성 파일에 대한 필요한 읽기 전용 액세스를 부여하려면, 일반 설정에서 파이프라인 실행 정책 설정을 활성화하면 됩니다. 이 설정을 활성화하면 파이프라인을 트리거한 사용자가 파이프라인 실행 정책에 의해 강제된 CI/CD 구성 파일을 읽을 수 있습니다. 이 설정은 구성 파일이 저장된 프로젝트의 다른 부분에 대한 사용자 액세스를 부여하지 않습니다.
policy_scope
스코프 유형
- GitLab 17.4에서 도입된 그룹별 스코핑입니다. 소개됨.
필드 | 유형 | 가능한 값 | 설명 |
---|---|---|---|
compliance_frameworks
| array
| 적용 범위 내의 컴플라이언스 프레임워크 ID 목록인 id 키를 가진 객체의 배열입니다.
| |
projects
| object
|
including , excluding
|
excluding: 또는 including: 를 사용한 다음 포함하거나 제외할 프로젝트의 ID 목록, id 키를 가진 객체의 배열입니다.
|
groups
| object
| including
|
including: 를 사용한 다음 포함할 그룹의 ID 목록, id 키를 가진 객체의 배열입니다.
|
예시:
특정 컴플라이언스 프레임워크를 사용하는 프로젝트:
policy_scope:
compliance_frameworks:
- id: 1020076
특정 집합의 프로젝트만:
policy_scope:
projects:
including:
- id: 61213118
- id: 59560885
한 가지 특정 프로젝트를 제외한 모든 프로젝트:
policy_scope:
projects:
excluding:
- id: 59560885
파이프라인 전략
파이프라인 구성 전략은 정책 구성을 프로젝트 파이프라인에 병합하는 방법을 정의합니다. 파이프라인 실행 정책은 독립적인 파이프라인에서 .gitlab-ci.yml
파일에 정의된 작업을 실행하여 대상 프로젝트의 파이프라인에 병합합니다.
inject_ci
이 전략은 프로젝트 파이프라인을 완전히 교체하지 않고 기존 프로젝트 파이프라인에 사용자 정의 CI/CD 구성을 추가하는 것입니다. 기존 파이프라인을 보강하거나 확장하고 싶을 때 보안 스캔, 컴플라이언스 검사 또는 사용자 정의 스크립트 추가 등의 추가 단계가 필요한 경우 적합합니다.
여러 정책이 활성화되어 있는 경우 모든 작업이 추가적으로 적용됩니다.
이 전략을 사용할 때 프로젝트의 .gitlab-ci.yml
파일이 없는 경우 이 전략을 사용하여 파이프라인에 정의된 작업만 포함된 파이프라인이 실행됩니다.
override_project_ci
이 전략은 파이프라인 실행 정책에 의해 정의된 새로운 CI/CD 구성으로 프로젝트의 기존 CI/CD 구성을 완전히 교체하는 것입니다. 이 전략은 조직 전체의 CI/CD 표준이나 컴플라이언스 요구 사항을 강제로 적용할 때 이상적입니다.
override_project_ci
를 사용하는 다른 정책보다 이 전략이 우선합니다. override_project_ci
가 포함된 정책이 적용되면 프로젝트 CI 구성이 무시됩니다. 다른 보안 정책 구성은 덮어쓰지 않습니다.
이 전략을 사용하면 사용자는 프로젝트 CI/CD 구성을 파이프라인 실행 정책 구성에 포함하여 정책 작업을 사용자 정의할 수 있습니다. 예를 들어, 정책 및 프로젝트 CI/CD 구성을 하나의 YAML 파일로 결합함으로써 사용자는 before_script
구성을 재정의할 수 있습니다.
참고:
파이프라인 실행 정책이 정책 작업의 실행을 방지하는 워크플로우 규칙을 사용하는 경우 프로젝트의 기존 CI/CD 구성은 덮어쓰지 않고 유지됩니다. 파이프라인 소스가 병합 요청 이벤트인 경우와 같이 정책이 프로젝트의 CI/CD 구성에 영향을 미치는 시기를 제어할 수 있는 조건적으로 파이프라인 실행 정책을 적용할 수 있습니다. 예를 들어, if: $CI_PIPELINE_SOURCE == "merge_request_event"
라는 워크플로우 규칙을 설정하면 파이프라인 소스가 병합 요청 이벤트인 경우에만 프로젝트의 CI/CD 구성이 덮어씌워집니다.
파이프라인 실행 정책 구성에 프로젝트의 CI/CD 구성 포함
override_project_ci
전략을 사용할 때, 프로젝트 구성은 파이프라인 실행 정책 구성에 포함될 수 있습니다.
include:
- project: $CI_PROJECT_PATH
ref: $CI_COMMIT_SHA
file: $CI_CONFIG_PATH
compliance_job:
...
참고:
사용자 정의 stage
에 정의된 프로젝트 구성의 작업은 최종 파이프라인에서 제외됩니다.
최종 구성에 작업을 포함하려면 해당 작업을 기본 파이프라인 단계나 예약 단계(.pipeline-policy-pre
또는 .pipeline-policy-post
)로 정의하세요.
CI/CD 변수
파이프라인 실행 작업은 격리된 상태에서 실행됩니다. 다른 정책이나 프로젝트의 .gitlab-ci.yml
파일에서 정의된 변수는 파이프라인 실행 정책에서 사용할 수 없으며 외부에서 덮어쓸 수 없습니다.
변수는 그룹이나 프로젝트 설정을 사용하여 파이프라인 실행 정책과 공유될 수 있습니다. 만약 파이프라인 실행 정책에 변수가 정의되지 않은 경우, 해당 변수는 그룹이나 프로젝트 설정에서의 값이 적용됩니다. 만약 파이프라인 실행 정책에서 변수가 정의된 경우, 해당 그룹이나 프로젝트 설정은 덮어쓰기됩니다. 이 동작은 파이프라인 실행 정책 전략과는 독립적입니다.
UI에서 프로젝트나 그룹 변수를 정의할 수 있습니다.
예시
이 예시는 파이프라인 실행 정책으로 얻을 수 있는 것을 보여줍니다.
파이프라인 실행 정책
보안 정책 프로젝트에 저장된 .gitlab/security-policies/policy.yml
파일에서 다음 예제를 사용할 수 있습니다.
---
pipeline_execution_policy:
- name: 나의 파이프라인 실행 정책
description: CI/CD 작업 강제
enabled: true
pipeline_config_strategy: override_project_ci
content:
include:
- project: verify-issue-469027/policy-ci
file: policy-ci.yml
ref: main # 옵션
policy_scope:
projects:
including:
- id: 361
프로젝트 변수에 기반하여 강제 작업 사용자 지정
프로젝트 변수의 존재 여부에 따라 강제 작업을 사용자 정의할 수 있습니다. 이 예에서 CS_IMAGE
의 값은 정책에서 alpine:latest
로 정의됩니다. 그러나 프로젝트에서도 CS_IMAGE
의 값을 정의하면 해당 값을 사용합니다. CI/CD 변수는 프로젝트의 .gitlab-ci.yml
파일에 정의된 변수가 아니어야 합니다.
variables:
CS_ANALYZER_IMAGE: "$CI_TEMPLATE_REGISTRY_HOST/security-products/container-scanning:7"
CS_IMAGE: alpine:latest
policy::container-security:
stage: .pipeline-policy-pre
rules:
- if: $CS_IMAGE
variables:
CS_IMAGE: $PROJECT_CS_IMAGE
- when: always
script:
- echo "CS_ANALYZER_IMAGE:$CS_ANALYZER_IMAGE"
- echo "CS_IMAGE:$CS_IMAGE"
프로젝트 구성에서 before_script
를 사용하여 보안 스캐너의 동작 사용자 정의
프로젝트의 .gitlab-ci.yml
에서 정책에 의해 징발되는 보안 작업의 동작을 사용자 정의하기 위해, before_script
를 재정의할 수 있습니다. 이를 위해 정책에서 override_project_ci
전략을 사용하고 프로젝트의 CI/CD 구성을 포함시킬 수 있습니다. 다음은 예제 파이프라인 실행 정책 구성입니다.
# policy.yml
type: pipeline_execution_policy
name: Secret detection
description: >-
This policy enforces secret detection and allows projects to override the
behavior of the scanner.
enabled: true
pipeline_config_strategy: override_project_ci
content:
include:
- project: gitlab-org/pipeline-execution-policies/compliance-project
file: secret-detection.yml
# secret-detection.yml
include:
- project: $CI_PROJECT_PATH
ref: $CI_COMMIT_SHA
file: $CI_CONFIG_PATH
- template: Security/Secret-Detection.gitlab-ci.yml
프로젝트의 .gitlab-ci.yml
에서 보안 스캐너를 위한 before_script
를 정의할 수 있습니다.
include:
- template: Jobs/Secret-Detection.gitlab-ci.yml
secret_detection:
before_script:
- echo "Before secret detection"
override_project_ci
를 사용하여 프로젝트의 구성을 포함시키면 YAML 구성을 병합할 수 있습니다.
그룹 또는 프로젝트 변수를 파이프라인 실행 정책에서 사용
파이프라인 실행 정책에서 그룹 또는 프로젝트 변수를 사용할 수 있습니다.
프로젝트 변수 PROJECT_VAR="I'm a project"
가 있을 때, 다음 파이프라인 실행 정책 작업은 I'm a project
를 반환합니다.
pipeline execution policy job:
stage: .pipeline-policy-pre
script:
- echo "$PROJECT_VAR"
파이프라인 실행 정책을 사용하여 변수의 값 강제
파이프라인 실행 정책에서 정의된 변수 값이 동일한 이름을 가진 그룹 또는 정책 변수의 값보다 우선합니다.
이 예에서 변수 PROJECT_VAR
의 프로젝트 값이 덮어씌워지고 작업은 I'm a pipeline execution policy
를 반환합니다.
variables:
PROJECT_VAR: "I'm a pipeline execution policy"
pipeline execution policy job:
stage: .pipeline-policy-pre
script:
- echo "$PROJECT_VAR"
보안 정책 범위가 있는 policy.yml
예제
이 예에서 보안 정책의 policy_scope
는 다음을 포함합니다:
- 코드 준수 프레임워크를 적용한 모든 프로젝트를 포함합니다(
ID: 9
). -
ID: 456
를 가진 프로젝트를 제외합니다.
pipeline_execution_policy:
- name: Pipeline execution policy
description: ''
enabled: true
pipeline_config_strategy: inject_ci
content:
include:
- project: my-group/pipeline-execution-ci-project
file: policy-ci.yml
policy_scope:
compliance_frameworks:
- id: 9
projects:
excluding:
- id: 456