Merge Request 파이프라인

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

GitLab 14.8에서 pipelines for merge requestsmerge request pipelines로 이름이 변경되었습니다.

소스 브랜치에서 변경을 할 때마다 파이프라인을 구성할 수 있습니다.

이 유형의 파이프라인인 Merge Request 파이프라인은 다음 경우에 실행됩니다:

  • 하나 이상의 커밋이 있는 소스 브랜치에서 새로운 Merge Request을 생성할 때.
  • Merge Request을 위한 소스 브랜치에 새로운 커밋을 푸시할 때.
  • Merge Request의 Pipelines 탭으로 이동하여 Run pipeline을 선택할 때.

또한, Merge Request 파이프라인은:

이러한 파이프라인은 파이프라인 디렉터리에서 merge request 레이블을 표시합니다.

Merge Request 파이프라인은 소스 브랜치의 내용에만 적용되며, 대상 브랜치의 내용은 무시됩니다. 소스와 대상 브랜치의 결과를 테스트하는 파이프라인을 실행하려면 Merge된 결과 파이프라인을 사용하세요.

전제 조건

Merge Request 파이프라인을 사용하려면:

  • 프로젝트의 .gitlab-ci.yml 파일에 Merge Request 파이프라인에서 실행되는 작업이 구성되어 있어야 합니다. 이를 위해 다음을 사용할 수 있습니다:
  • Merge Request 파이프라인을 실행하려면 소스 프로젝트에서 적어도 개발자 역할이 있어야 합니다.
  • 귀하의 리포지터리는 GitLab 리포지터리여야 하며, 외부 리포지터리가 아니어야 합니다.

작업 추가를 위해 rules 사용

rules 키워드를 사용하여 Merge Request 파이프라인에서 실행될 작업을 구성합니다. 예를 들어:

job1:
  script:
    - echo "이 작업은 Merge Request 파이프라인에서 실행됩니다"
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'

또한, 전체 파이프라인을 Merge Request 파이프라인에서 실행되도록 구성하기 위해 workflow: rules 키워드를 사용할 수 있습니다. 예를 들어:

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'

job1:
  script:
    - echo "이 작업은 Merge Request 파이프라인에서 실행됩니다"

job2:
  script:
    - echo "이 작업도 Merge Request 파이프라인에서 실행됩니다"

Merge Request, 태그, 기본 브랜치에 대해 파이프라인을 실행할 수 있는 일반적인 workflow 구성은 다음과 같습니다:

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_COMMIT_TAG
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

작업 추가를 위해 only 사용

rules가 선호되는 방법이지만, merge_requests와 함께 only 키워드를 사용하여 Merge Request 파이프라인에서 실행될 작업을 구성할 수도 있습니다. 예를 들어:

job1:
  script:
    - echo "이 작업은 Merge Request 파이프라인에서 실행됩니다"
  only:
    - merge_requests

포크된 프로젝트에서 사용

포크에서 작업하는 외부 기여자는 부모 프로젝트에서 파이프라인을 생성할 수 없습니다.

부모 프로젝트에 제출된 포크에서의 Merge Request은 다음과 같은 파이프라인을 트리거합니다:

  • 생성되고 실행되는 것은 부모(대상) 프로젝트가 아닌 포크(소스) 프로젝트입니다.
  • 포크 프로젝트의 CI/CD 구성, 리소스 및 프로젝트 CI/CD 변수를 사용합니다.

포크용 파이프라인은 부모 프로젝트에서 fork 배지와 함께 표시됩니다:

포크에서 실행된 파이프라인

부모 프로젝트에서 파이프라인 실행

부모 프로젝트의 프로젝트 멤버는 포크 프로젝트에서 제출된 Merge Request을 위해 파이프라인을 트리거할 수 있습니다. 이 파이프라인은 다음과 같습니다:

  • 생성되고 부모(대상) 프로젝트에서 실행됩니다.
  • 포크 프로젝트의 브랜치에 있는 CI/CD 구성을 사용합니다.
  • 부모 프로젝트의 CI/CD 설정, 리소스 및 프로젝트 CI/CD 변수를 사용합니다.
  • 파이프라인을 트리거하는 부모 프로젝트 멤버의 권한을 사용합니다.

부모 프로젝트에서 포크 프로젝트의 Merge Request에 대해 파이프라인을 실행하여 Merge 후 파이프라인이 부모 프로젝트에서 통과하는지 확인하세요. 또한, 포크 프로젝트의 러너를 신뢰하지 않는 경우 부모 프로젝트에서 파이프라인을 실행하면 부모 프로젝트의 신뢰할 수 있는 러너를 사용합니다.

caution
포크된 Merge Request에는 Merge하기 전에도 부모 프로젝트의 보안 정보를 탈취하려는 악성 코드가 포함될 수 있습니다. 리뷰어로서 파이프라인을 트리거하기 전에 Merge Request의 변경 사항을 주의 깊게 확인하세요. API 또는 /rebase 빠른 조치를 통해 파이프라인을 트리거하지 않는 한, GitLab은 파이프라인이 실행되기 전에 수락해야 하는 경고를 표시합니다. 그렇지 않으면 경고가 표시되지 않습니다.

전제 조건:

부모 프로젝트에서 포크 프로젝트의 Merge Request에 대해 UI를 사용하여 파이프라인을 실행하려면:

  1. Merge Request에서 Pipelines 탭으로 이동합니다.
  2. Run pipeline을 선택합니다. 경고를 읽고 수락해야 파이프라인이 실행됩니다.

프로젝트 포크에서 파이프라인 실행 방지

부모 프로젝트에서 포크된 프로젝트에 대해 새 파이프라인을 실행하는 것을 방지하려면 프로젝트 API를 사용하여 ci_allow_fork_pipelines_to_run_in_parent_project 설정을 비활성화하세요.

caution
설정이 비활성화되기 전에 생성된 파이프라인은 영향을 받지 않고 계속 실행됩니다. 이전 파이프라인에서 작업을 다시 실행하면 해당 작업은 원래 생성된 파이프라인 당시의 동일한 컨텍스트를 사용합니다.

사용 가능한 미리 정의된 변수

Merge Request 파이프라인을 사용할 때 다음을 사용할 수 있습니다: