개요
2025.02.09-[GitLab] PipeLine 유형에서 GitLab 파이프라인이 실행되는 조건을 지정할 수 있다는 것을 알게 되었다. 이번 글에서는 실행 조건을 지정하는 방법에 초점을 맞춰 알아보려고 한다.
rules
rules 속성은 파이프라인에서 Job을 포함하거나 제외할 때 사용한다. rules는 일치할 때까지 순서대로 평가되고, 일치하는 항목이 발견되면 그 구성에 따라 Job이 포함되거나 제외된다.
규칙은 Job이 실행되기 전에 평가되기 때문에 Job script에서 생성한 dotenv 파일은 사용할 수 없다.
rules는 배열을 허용하며, 각 규칙에는 if, changes, exists, when 속성이 하나 이상 존재해야 한다. 그리고 allow_failure, needs, variables, interruptable 속성과 결합되어 평가될 수 있다.
Job은 if, changes, exist가 만족하고 when 속성에 on_success, delayed, always가 설정되거나 별도 규칙 없이 when 속성에 on_success, delayed, always가 설정되어 있으면 파이프라인에 추가된다.
반면 규칙을 만족하지 않거나 규칙을 만족해도 when 속성에 never가 설정되어 있으면 파이프라인에 Job이 추가되지 않는다.
if / changes / exist
if
CI/CD 변수 등을 사용하여 파이프라인에 Job을 추가할 조건을 지정한다.
- if 문이 참인 경우 -> Job을 파이프라인에 추가한다.
- if 문이 참이고 when이 never인 경우 -> Job을 파이프라인에 추가한다.
- if 문이 거짓인 경우 -> 다음 rules 요소를 확인한다.
예시 )
job:
script: echo "Hello, Rules!"
rules:
- if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
when: never
- if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/
when: manual
allow_failure: true
- if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
changes
특정 파일의 변경 여부를 파이프라인에 Job을 추가하는 조건으로 지정한다.
changes는 새 branch pipeline이나 git push 이벤트가 없는 경우에는 항상 참으로 평가된다. 때문에 git push 이벤트가 연결되어 있지 않은 tag 파이프라인, 스케쥴링된 파이프라인, 수동 파이프라인은 항상 Job을 파이프라인에 포함시키는 것 같다. 이러한 경우를 제어하기 위해 rules:changes:compare_to 속성을 추가하여 비교할 분기를 지정한다.
만약 compare_to 속성을 사용하지 않는 경우 branch 파이프라인이나 MR 파이프라인을 대상으로만 작성해야 한다. 그래도 새 branch를 생성하면 유효한 것으로 평가된다.
예시 )
docker build:
script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
changes:
- Dockerfile
when: manual
allow_failure: true
docker build:
script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
changes:
paths:
- Dockerfile
compare_to: 'refs/heads/branch1'
exists
레포지터리에 특정 파일이 존재하는지 여부에 따라 파이프라인에 Job을 포함시킨다.
예시 )
job:
script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
rules:
- exists:
- Dockerfile
when
단독을 또는 다른 규칙과 결합하여 파이프라인에 Job을 추가하기 위한 조건을 지정한다. 지정할 수 있는 값은 다음과 같다.
- on_success : 이전 stage에서 실패한 job이 없을 때 동작한다. 기본값이다.
- on_failure : 이전 stage에서 실패한 작업이 존재할 때 동작한다.
- never : 이전 stage의 job 상태와 관계없이 실행하지 않는다.
- always : 이전 stage의 job 상태와 관계 없이 실행한다.
- manual : 파이프라인에 manual job을 추가한다.
- delayed : delayed job으로 job을 추가한다.
예시 )
job1:
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_REF_NAME =~ /feature/
when: delayed
- when: manual
script:
- echo
기타 다른 속성도 많지만 이번 글에서는 규칙을 구성하는 간단한 속성 정도만 정리하고 넘어간다.
참고 문서
https://docs.gitlab.com/ee/ci/jobs/job_rules.html
https://gitlab-docs.infograb.net/ee/ci/jobs/job_rules.html
https://docs.gitlab.com/ee/ci/yaml/index.html#rules
https://ohyecloudy.com/ddiary/2019/11/24/til-gitlab-ci-cd-pipeline-rules/