파이프라인 실행 정책
- GitLab 17.2에서 도입됨 플래그
pipeline_execution_policy_type
와 함께. 기본적으로 활성화됨. GitLab 17.3에서 기능 플래그 제거됨.
이 기능의 사용 가능성은 기능 플래그로 제어됩니다.
자세한 내용은 기록을 참조하세요.
모든 적용 가능한 프로젝트에 대해 CI/CD 작업을 시행하기 위해 파이프라인 실행 정책을 사용하십시오.
- 비디오 안내를 보려면 보안 정책: 파이프라인 실행 정책 유형을 참조하세요.
파이프라인 실행 정책 스키마
suffix
필드는 GitLab 17.4에서 도입됨.
파이프라인 실행 정책이 포함된 YAML 파일은 pipeline_execution_policy
키 아래에 중첩된 파이프라인 실행 정책 스키마와 일치하는 객체 배열로 구성됩니다.
보안 정책 프로젝트당 pipeline_execution_policy
키 아래에 최대 다섯 개의 정책을 구성할 수 있습니다.
처음 다섯 개 이후에 구성된 기타 정책은 적용되지 않습니다.
새 정책을 저장할 때 GitLab은 이 JSON 스키마에 대해 해당 내용을 검증합니다.
JSON 스키마를 읽는 방법에 익숙하지 않은 경우, 다음 섹션과 표는 대안을 제공합니다.
필드 | 타입 | 필수 | 설명 |
---|---|---|---|
pipeline_execution_policy |
array of pipeline execution policy |
true | 파이프라인 실행 정책 목록(최대 다섯 개) |
파이프라인 실행 정책 스키마
필드 | 타입 | 필수 | 설명 |
---|---|---|---|
name |
string |
true | 정책 이름. 최대 255자. |
description (선택 사항) |
string |
true | 정책 설명. |
enabled |
boolean |
true | 정책을 활성화하는 플래그(true ) 또는 비활성화하는 플래그(false ). |
content |
object of content
|
true | 프로젝트 파이프라인에 주입할 CI/CD 구성 참조. |
pipeline_config_strategy |
string |
false |
inject_ci 또는 override_project_ci 중 하나일 수 있습니다. 파이프라인 전략에 대한 자세한 내용은 참조하세요. |
suffix |
string |
false |
on_conflict (기본값) 또는 never 일 수 있습니다. 작업 이름 충돌 처리 방법을 정의합니다. on_conflict 는 고유성을 깨뜨릴 작업에 고유 접미사를 적용합니다. never 는 프로젝트와 모든 적용 가능한 정책에서 작업 이름이 고유하지 않으면 파이프라인이 실패하게 만듭니다. |
policy_scope |
object of policy_scope
|
false | 준수 프레임워크 레이블 또는 정의한 프로젝트를 기반으로 정책의 범위를 설정합니다. |
다음 사항에 유의하세요:
- 파이프라인을 트리거하는 사용자는 파이프라인 실행 정책에서 지정한 파이프라인 실행 파일에 대해 최소한 읽기 권한을 가져야 하며, 그렇지 않으면 파이프라인이 시작되지 않습니다.
- 파이프라인 실행 파일이 삭제되거나 이름이 변경되면 정책이 시행된 프로젝트의 파이프라인이 작동을 멈출 수 있습니다.
- 파이프라인 실행 정책 작업은 두 개의 예약된 단계 중 하나에 할당될 수 있습니다:
-
.pipeline-policy-pre
파이프라인의 시작 부분,.pre
단계 이전에. -
.pipeline-policy-post
파이프라인의 마지막,.post
단계 이후에.
-
- 예약된 단계에서 작업을 주입하는 것은 항상 성공할 것으로 보장됩니다. 실행 정책 작업은 표준(빌드, 테스트, 배포) 또는 사용자 정의 단계에도 할당될 수 있습니다. 그러나 이 경우 작업은 프로젝트 파이프라인 구성에 따라 무시될 수 있습니다.
- 파이프라인 실행 정책 외부의 예약된 단계에는 작업을 할당할 수 없습니다.
- 파이프라인 실행 정책에 대해 고유한 작업 이름을 선택해야 합니다. 일부 CI/CD 구성은 작업 이름을 기반으로 하며, 동일한 파이프라인에 여러 번 존재하는 경우 원하지 않는 결과를 초래할 수 있습니다. 예를 들어,
needs
키워드는 하나의 작업이 다른 작업에 의존하도록 만듭니다. 동일한 이름을 가진 여러 작업이 있는 경우 랜덤으로 그 중 하나에 의존하게 됩니다. - 파이프라인 실행 정책은 프로젝트에 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 | 파일을 검색할 참조입니다. 지정하지 않으면 프로젝트의 HEAD가 기본값입니다. |
정책에서 content
유형을 사용하여 다른 리포지토리에 저장된 CI/CD 구성을 참조하세요. 이를 통해 동일한 CI/CD 구성을 여러 정책 간에 재사용할 수 있으며, 이러한 구성을 유지 관리하는 오버헤드를 줄일 수 있습니다. 예를 들어, 정책 A와 정책 B에서 시행하려는 사용자 정의 비밀 탐지 CI/CD 구성이 있는 경우, 단일 YAML 구성 파일을 생성하고 두 정책 모두에서 구성을 참조할 수 있습니다.
전제 조건:
-
content
유형이 포함된 정책이 시행되는 프로젝트에서 파이프라인을 트리거하는 사용자는 CI/CD가 포함된 프로젝트에 대해 최소한 읽기 전용 액세스 권한을 가져야 합니다.파이프라인 실행 정책을 시행하는 프로젝트는 사용자가 CI/CD 구성이 포함된 프로젝트에 대해 최소한 읽기 전용 액세스 권한을 가져야 합니다.
GitLab 17.4 이상 버전에서는 보안 정책 프로젝트에서 지정된 CI/CD 구성 파일에 필요한 읽기 전용 액세스를
content
유형을 사용하여 부여할 수 있습니다. 그렇게 하려면 보안 정책 프로젝트의 일반 설정에서 Pipeline execution policies 설정을 활성화하십시오. 이 설정을 활성화하면 파이프라인을 트리거한 사용자에게 파이프라인 실행 정책에서 시행된 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 구성 요소를 추가하여 프로젝트의 원래 CI/CD 구성을 완전히 대체하지 않습니다. 새로운 보안 스캔, 규정 준수 검사 또는 사용자 지정 스크립트와 같은 추가 단계를 통해 현재 파이프라인을 개선하거나 확장하려는 경우에 적합합니다.
여러 정책이 활성화되면 모든 작업이 누적되어 삽입됩니다.
이 전략을 사용할 때, 프로젝트 CI/CD 구성은 정책 파이프라인에 정의된 모든 동작을 무시할 수 없습니다. 각 파이프라인은 격리된 YAML 구성을 가지기 때문입니다.
.gitlab-ci.yml
파일이 없는 프로젝트의 경우, 이 전략은 .gitlab-ci.yml
파일을 암묵적으로 생성합니다. 다시 말해, 파이프라인 실행 정책에 정의된 작업만 포함된 파이프라인이 실행됩니다.
override_project_ci
이 전략은 프로젝트의 기존 CI/CD 구성을 파이프라인 실행 정책에 의해 정의된 새로운 것으로 완전히 대체합니다. 이 전략은 전체 파이프라인을 표준화하거나 대체해야 할 때, 예를 들어 조직 전체의 CI/CD 표준 또는 규정 준수 요구 사항을 시행할 때 이상적입니다.
이 전략은 inject_ci
전략을 사용하는 다른 정책보다 우선합니다. override_project_ci
가 적용되는 정책이 있는 경우, 프로젝트 CI 구성은 무시됩니다. 다른 보안 정책 구성은 덮어쓰이지 않습니다.
이 전략은 사용자가 파이프라인 실행 정책 구성에 프로젝트 CI/CD 구성을 포함할 수 있도록 하여 정책 작업을 사용자 지정할 수 있게 해줍니다. 예를 들어, 정책과 프로젝트 CI/CD 구성을 하나의 YAML 파일로 결합하여 before_script
구성을 덮어쓸 수 있습니다.
참고:
파이프라인 실행 정책이 정책 작업 실행을 방지하는 워크플로 규칙을 사용하는 경우, 프로젝트의 원래 CI/CD 구성은 덮어쓰이지 않고 그대로 남아있습니다. 정책이 프로젝트의 CI/CD 구성에 영향을 미치도록 하려면 조건부로 파이프라인 실행 정책을 적용할 수 있습니다. 예를 들어, 워크플로 규칙을 if: $CI_PIPELINE_SOURCE == "merge_request_event"
로 설정하면, 파이프라인 소스가 병합 요청 이벤트일 때만 프로젝트 CI 구성이 덮어써집니다.
파이프라인 실행 정책 구성에 프로젝트의 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: 비밀 감지
description: >-
이 정책은 비밀 감지를 시행하며 프로젝트가
스캐너의 동작을 덮어쓸 수 있도록 허용합니다.
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 "비밀 감지 이전"
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