GitLab CI/CD workflow
키워드
파이프라인이 생성될 때 workflow
키워드를 사용하여 제어합니다.
workflow
키워드는 작업 이전에 평가됩니다. 예를 들어, 작업이 태그를 위해 구성되었지만 workflow가 태그 파이프라인을 방지하면 작업이 실행되지 않습니다.
workflow:rules
에 대한 일반 if
절
workflow: rules
에 대한 몇 가지 예시 if
절:
예시 규칙 | 자세한 내용 |
---|---|
if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
| Merge Request 파이프라인이 실행되는 시점을 제어합니다. |
if: '$CI_PIPELINE_SOURCE == "push"'
| 브랜치 파이프라인 및 태그 파이프라인이 실행되는 시점을 제어합니다. |
if: $CI_COMMIT_TAG
| 태그 파이프라인이 실행되는 시점을 제어합니다. |
if: $CI_COMMIT_BRANCH
| 브랜치 파이프라인이 실행되는 시점을 제어합니다. |
더 많은 예시에 대해서는 사전 정의된 변수를 사용한 if
절의 일반적인 예시를 참조하세요.
workflow: rules
예시
다음 예시에서:
- 모든
push
이벤트(브랜치의 변경 및 새로운 태그)에 대해 파이프라인이 실행됩니다. -
-draft
로 끝나는 커밋 메시지를 가진 push 이벤트는when: never
로 설정되어 실행되지 않습니다. - 일정 또는 Merge Request에 대한 파이프라인도 실행되지 않습니다. 이들에 대한 규칙이 어느 것에도 참이 되지 않기 때문입니다.
workflow:
rules:
- if: $CI_COMMIT_MESSAGE =~ /-draft$/
when: never
- if: $CI_PIPELINE_SOURCE == "push"
이 예에서는 엄격한 규칙이 적용되어 다른 경우에는 파이프라인이 실행되지 않습니다.
대신, 모든 규칙이 when: never
일 수 있고, 마지막에 when: always
규칙을 추가할 수 있습니다. when: never
규칙과 일치하는 파이프라인은 실행되지 않습니다. 다른 모든 파이프라인 유형은 실행됩니다. 예를 들어:
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
when: never
- if: $CI_PIPELINE_SOURCE == "push"
when: never
- when: always
이 예시는 스케줄 또는 push
(브랜치 및 태그) 파이프라인을 방지합니다. 최종 when: always
규칙은 Merge Request 파이프라인을 포함하여 모든 다른 파이프라인 유형을 실행합니다.
브랜치 파이프라인과 Merge Request 파이프라인 전환
브랜치에 대한 파이프라인이 Merge Request이 작성된 후 Merge Request 파이프라인으로 전환하려면 .gitlab-ci.yml
파일에 workflow: rules
섹션을 추가하세요.
동시에 두 가지 파이프라인 유형을 사용하는 경우 중복 파이프라인이 동시에 실행될 수 있습니다. 중복 파이프라인을 방지하려면 CI_OPEN_MERGE_REQUESTS
변수를 사용하세요.
다음 예시는 프로젝트가 브랜치 및 Merge Request 파이프라인만 실행되도록 구성되어 있지만 그 외의 경우에는 실행되지 않습니다. 이는 다음과 같이 작동합니다:
- Merge Request이 열리지 않은 브랜치에 대해 브랜치 파이프라인이 실행됩니다.
- Merge Request이 열린 브랜치에 대해 Merge Request 파이프라인이 실행됩니다.
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_BRANCH
GitLab이 다음을 트리거하려고 하는 경우:
- Merge Request 파이프라인을 시작합니다. 예를 들어, 연관된 열린 Merge Request이 있는 브랜치에 푸시됨으로써 Merge Request 파이프라인이 트리거될 수 있습니다.
- 브랜치 파이프라인을 시작합니다. 그러나 해당 브랜치에 열린 Merge Request이 있는 경우에는 브랜치 파이프라인이 실행되지 않습니다. 예를 들어, 브랜치에 대한 파이프라인은 브랜치의 변경, API 호출, 예약된 파이프라인 등으로 트리거될 수 있습니다.
- 브랜치 파이프라인을 시작합니다. 그러나 해당 브랜치에 열린 Merge Request이 없는 경우, 브랜치 파이프라인이 실행됩니다.
또한, .gitlab-ci.yml
파일에 기존 workflow
섹션에 규칙을 추가하여 Merge Request이 작성될 때 브랜치 파이프라인에서 Merge Request 파이프라인으로 전환하세요.
이 규칙을 workflow
섹션 상단에 추가한 후 이미 있는 다른 규칙들을 추가하세요:
workflow:
rules:
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
when: never
- ... # 기존에 정의된 workflow 규칙들을 여기에 추가
브랜치에서 트리거된 파이프라인은 $CI_COMMIT_BRANCH
가 설정되어 있으며 유사한 규칙에 의해 차단될 수 있습니다. 트리거된 파이프라인의 파이프라인 소스는 trigger
또는 pipeline
이므로 && $CI_PIPELINE_SOURCE == "push"
은 규칙이 트리거된 파이프라인을 차단하지 않도록 보장합니다.
Merge Request 파이프라인을 사용한 Git Flow
workflow: rules
를 사용하여 Merge Request 파이프라인을 실행할 수 있습니다. 이러한 규칙을 사용하여 기능 브랜치에 대해 Merge Request 파이프라인 기능을 사용하고 소프트웨어의 여러 버전을 지원하기 위해 장기 브랜치를 유지할 수 있습니다.
예를 들어, Merge Request, 태그, 및 보호된 브랜치에 대한 파이프라인만 실행하려면:
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_REF_PROTECTED == "true"
이 예시는 여러분의 장기 브랜치가 보호되어 있다고 가정합니다.
workflow:rules
템플릿
GitLab은 흔한 시나리오에 대해 workflow: rules
를 설정하는 템플릿을 제공합니다. 이러한 템플릿은 중복 파이프라인을 방지하는 데 도움이 됩니다.
Branch-Pipelines
템플릿은 파이프라인을 브랜치 및 태그에 대해 실행합니다.
브랜치 파이프라인 상태는 해당 브랜치를 소스로 사용하는 Merge Request의 Merge Request에서 표시됩니다. 그러나 이 파이프라인 유형은 Merge Request 파이프라인이 제공하는 기능을 지원하지 않습니다. 이러한 기능을 의도적으로 피합니다.
포함하려면:
include:
- template: 'Workflows/Branch-Pipelines.gitlab-ci.yml'
MergeRequest-Pipelines
템플릿은 기본 브랜치, 태그, 및 모든 유형의 Merge Request 파이프라인에 대해 파이프라인을 실행합니다. 만약 Merge Request 파이프라인 기능 중 하나라도 사용하고 있다면 이 템플릿을 사용하세요.
포함하려면:
include:
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
문제 해결
Checking pipeline status.
메시지로 막힌 Merge Request
Merge Request에 Checking pipeline status.
가 표시되지만 메시지가 사라지지 않을 때(스피너가 멈추지 않을 때), 이는 workflow:rules
로 인한 문제일 수 있습니다. 이 문제는 프로젝트에 [파이프라인은 성공해야 함(../../user/project/merge_requests/auto_merge.md#require-a-successful-pipeline-for-merge) 옵션이 활성화되어 있지만 workflow:rules
로 인해 Merge Request에 대한 파이프라인이 실행되지 않는 경우 발생할 수 있습니다.
예를 들어, 이러한 workflow로 인해 Merge Request이 실행되지 않을 수 있습니다:
workflow:
rules:
- changes:
- .gitlab/**/**.md
when: never