GitLab CI/CD workflow 키워드

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

파이프라인이 생성될 때 workflow 키워드를 사용하여 제어하세요.

workflow 키워드는 작업 이전에 평가됩니다. 예를 들어, 작업이 태그를 실행하도록 구성되어 있지만, 워크플로가 태그 파이프라인을 막는다면 해당 작업은 실행되지 않습니다.

workflow:rules에 대한 일반적인 if

workflow: rules에 대한 예시 if 절:

예시 규칙 상세 내용
if: '$CI_PIPELINE_SOURCE == "merge_request_event"' 합병 요청 파이프라인이 실행되는 시점을 제어합니다.
if: '$CI_PIPELINE_SOURCE == "push"' 브랜치 및 태그 파이프라인이 실행되는 시점을 제어합니다.
if: $CI_COMMIT_TAG 태그 파이프라인이 실행되는 시점을 제어합니다.
if: $CI_COMMIT_BRANCH 브랜치 파이프라인이 실행되는 시점을 제어합니다.

더 많은 예시는 rules에 대한 일반 if을 확인하세요.

workflow:rules 예시

다음 예시에서:

  • 모든 push 이벤트(브랜치 변경 및 새로운 태그)에 대해 파이프라인이 실행됩니다.
  • -draft로 끝나는 커밋 메시지의 push 이벤트에 대한 파이프라인은 실행되지 않습니다. 왜냐하면 해당 파이프라인은 when: never로 설정되었기 때문입니다.
  • 스케줄 또는 합병 요청에 대한 파이프라인도 실행되지 않습니다. 왜냐하면 해당 규칙에 대해 참이 되는 상황이 없기 때문입니다.
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 규칙은 합병 요청 파이프라인을 포함하여 다른 모든 파이프라인 유형을 실행합니다.

브랜치 파이프라인과 합병 요청 파이프라인 간 전환

합병 요청이 생성된 후 파이프라인을 브랜치 파이프라인에서 합병 요청 파이프라인으로 전환하려면 .gitlab-ci.yml 파일에 workflow: rules 섹션을 추가하세요.

동일한 시간에 두 파이프라인 유형을 동시에 사용하는 경우, 중복 파이프라인을 예방하기 위해 CI_OPEN_MERGE_REQUESTS 변수를 사용하세요.

다음 예시는 브랜치 및 합병 요청 파이프라인만 실행되지만, 다른 경우에는 어떤 파이프라인도 실행되지 않습니다. 이 예시는 다음과 같이 실행됩니다:

  • 합병 요청이 브랜치에 대해 열리지 않은 경우 브랜치 파이프라인이 실행됩니다.
  • 합병 요청이 브랜치에 대해 열린 경우 합병 요청 파이프라인이 실행됩니다.
workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
      when: never
    - if: $CI_COMMIT_BRANCH

GitLab이 다음에 대해 트리거하려고 하는 경우:

  • 합병 요청 파이프라인을 시작합니다. 예를 들어, 연관된 열린 합병 요청이 있는 브랜치로 푸시하여 합병 요청 파이프라인을 트리거할 수 있습니다.
  • 브랜치 파이프라인을 시작하지만 해당 브랜치에 대해 열린 합병 요청이 있는 경우, 해당 브랜치 파이프라인을 실행하지 않습니다. 예를 들어, 브랜치에 대한 변경, API 호출, 예약된 파이프라인 등에 의해 브랜치 파이프라인이 트리거될 수 있습니다.
  • 브랜치 파이프라인을 시작하지만 해당 브랜치에 대해 열린 합병 요청이 없는 경우, 해당 브랜치 파이프라인을 실행합니다.

합병 요청이 생성된 경우 브랜치 파이프라인에서 합병 요청 파이프라인으로 전환하기 위해 기존 workflow 섹션에 규칙을 추가할 수도 있습니다.

기존의 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"가 규칙이 해당 파이프라인을 차단하지 않도록 합니다.

합병 요청 파이프라인과 함께 하는 Git Flow

합병 요청 파이프라인 기능을 사용하면서 장기 브랜치를 유지하여 소프트웨어의 여러 버전을 지원하는 경우, workflow: rules를 사용할 수 있습니다.

예를 들어, 합병 요청, 태그, 보호된 브랜치에 대해서만 파이프라인을 실행하려면:

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된 결과 파이프라인 또는 Merge Train과 같은 기능을 지원하지 않습니다. 이 템플릿은 일부 기능을 일부러 피하기 위해 이러한 기능을 의도적으로 피합니다.

포함하려면:

include:
  - template: 'Workflows/Branch-Pipelines.gitlab-ci.yml'

MergeRequest-Pipelines 템플릿 은 기본 브랜치, 태그, 그리고 모든 유형의 합병 요청 파이프라인에 대해 파이프라인을 실행합니다.

이 템플릿은 합병 요청 파이프라인 기능 중 하나 이상을 사용한다면 사용하세요.

포함하려면:

include:
  - template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'

문제 해결

‘파이프라인 상태 확인 중’ 메시지로 멈춘 Merge Request

Merge Request이 ‘파이프라인 상태 확인 중’을 표시하지만 메시지가 사라지지 않을 때(스피너가 계속 돌아가는 경우), 이는 workflow:rules 때문일 수 있습니다. 이 문제는 프로젝트가 파이프라인이 성공해야 함 옵션을 활성화했지만 workflow:rules가 Merge Request의 파이프라인 실행을 막을 때 발생할 수 있습니다.

예를 들어, 다음 워크플로우로 인해 Merge Request에서 파이프라인을 실행할 수 없으므로 Merge Request을 Merge할 수 없습니다.

workflow:
  rules:
    - changes:
        - .gitlab/**/**.md
      when: never