반응형
문제 상황
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
반응형
'서버 및 환경 > Git' 카테고리의 다른 글
[gitlab] runner 재설치 시 decoding configuration file: toml ~ inv alid UTF-8 byte 문제 (0) | 2024.05.07 |
---|---|
[git] gitignore 적용 안될 때 해결과 gitignore 적용 파일 리스트 확인 (0) | 2024.02.28 |
[git] copy한 레포에서 submodule이 있을 때 초기화 방법 (0) | 2023.12.20 |
[Git] 깃 브랜치 만들기 / 변경 / 삭제 (git branch / checkout / -d) (0) | 2022.11.27 |
[Github] refusing to allow a Personal Access Token to create or update workflow 에러 해결 (0) | 2022.11.26 |