GitLab CI/CD workflow 키워드

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-Managed, GitLab Dedicated

파이프라인이 생성될 때 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