Jost Do It.

그냥 IT해.

서버 및 환경/Git

[Gitlab] CI/CD에서 Merge Request 시 CI_PIPELINE_SOURCE가 push로 실행되는 이유

그냥하Jo. 2024. 1. 26. 13:05
반응형

문제 상황

gitlab에서 특정 브랜치에 Merge Request(MR)가 발생하면 특정 stage를 실행하려고 아래와 같이 코드를 작성하였다.

stage1:
  stage: example
  rules: 
    - if: $CI_COMMIT_BRANCH == "prod" && $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
  	- echo "hello world!"

 

 

그런데 MR 후에도 해당 stage의 코드가 실행되지 않았다...

다음과 같이 ci/cd 테스트 스테이지를 작성해서 변수 값이 뭘로 설정되는지 확인해보니 push로 나오는걸 확인했다.

test_stage:
  stage: test
  script:
  	- echo "$CI_PIPELINE_SOURCE"

 

 

 

문제 원인

처음에는 해당 이슈를 확인하고 깃랩 자체의 에러인줄 알았으나, 더 찾아보니 다음 정책들로 인해 내 rules가 충족할 수 없었다.

 

첫번째로 gitlab에서는 MR이 발생하면 아래 2개의 파이프라인이 발생할 수 있다.

  • 브랜치 자체에서 trigger 되는 파이프라인 (CI_PIPELINE_SOURCE = push)
  • MR로 인해 발생하는 파이프라인 (CI_PIPELINE_SOURCE = merge_request_event)

 

MR 발생으로 두 파이프라인이 동시에 실행되는 것은 바람직한 결과가 아니기 때문에 merge_request_event의 경우는 rules에 조건이 걸려 있는 경우만 실행이 된다고 한다.

즉, merge_request_event는 default로 실행되지 않는다.

 

 

두번째로 머지 리퀘스트로 인한 파이프라인이 실행( CI_PIPELINE_SOURCE = merge_request_event) 되면 CI_COMMIT_BRANCH 는 값을 가지지 않는다.

  • 당연히 커밋이 아니라 MR 파이프라인이기 때문에 값이 없다.
  • MR이 된 브랜치 정보는 CI_MERGE_REQUEST_TARGET_BRANCH_NAME 을 사용할 수 있다.

 

 

해결 방법

rules에서 첫번째 조건식 CI_COMMIT_BRANCH 변수를 CI_MERGE_REQUEST_TARGET_BRANCH_NAME 로 변경해준다.

stage1:
  stage: example
  rules: 
    - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "prod" && $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
  	- echo "hello world!"

 

 

Reference

반응형