2024. 10. 16. 16:00ㆍIT/Git
GitLab CI(Continuous Integration)는 소프트웨어 개발에서 코드 품질을 유지하고, 빌드, 테스트, 배포 등의 작업을 자동화하는 도구다. GitLab CI 스크립트는 .gitlab-ci.yml 파일에 정의되며, 코드 변경 시 자동으로 실행되게 된다. 여기서는 GitLab CI의 주요 개념들과 함께 러너(Runner) 태그 개념까지 설명해보겠다.
1. Job (작업)
Job은 파이프라인의 가장 작은 단위로, 하나의 작업을 정의한다. 빌드, 테스트, 배포 등 각 작업이 job으로 표현된다. job은 독립적으로 실행되며, 여러 job을 순차적으로 또는 병렬로 실행할 수 있다.
2. Stage (단계)
Stage는 여러 job을 묶는 단위이다. 파이프라인은 순차적으로 단계별로 진행되며, 한 단계가 완료된 후에 다음 단계로 넘어간다. 예를 들어, build, test, deploy 단계가 있을 수 있다.
3. Script (스크립트)
Script는 각 job에서 실행할 명령어를 정의합니다. 이는 셸 명령어를 기반으로 하며, 각 작업의 구체적인 실행 내용을 담고 있다.
4. Artifacts (산출물)
Artifacts는 특정 작업의 결과물(예: 컴파일된 파일이나 로그 등)을 다른 작업이나 단계에서 사용할 수 있도록 저장하는 기능이다.
5. Cache (캐시)
Cache는 빌드 간에 공유할 수 있는 파일을 저장하여, 불필요한 다운로드나 작업을 줄여 빌드 시간을 단축하는데 도움을 준다.
6. Variables (변수)
Variables는 환경에 맞춘 설정값이나 민감한 데이터를 관리할 수 있게 하는 기능이다. 환경 변수로 설정되며, 파이프라인 전반에 걸쳐 사용할 수 있다.
7. Runner (러너)와 태그(Tag) 개념
Runner는 GitLab CI 파이프라인에서 정의된 job을 실제로 실행하는 역할을 한다. Runner는 특정한 서버에 설치되어 있으며, 여러 파이프라인에서 공유될 수 있다. 러너는 각 job을 받아들이고, 스크립트에 정의된 작업을 수행한다.
Gitlab CI 스크립트 예시
stages: # 파이프라인의 단계 정의
- build
- test
- deploy
build_job: # 'build' 단계의 작업 정의
stage: build # 해당 작업이 속한 단계
tags:
- linux # 'linux' 태그를 가진 러너에서 실행
script:
- echo "Building the project"
- make build
test_job: # 'test' 단계의 작업 정의
stage: test
tags:
- windows # 'windows' 태그를 가진 러너에서 실행
script:
- echo "Running tests"
- make test
deploy_job: # 'deploy' 단계의 작업 정의
stage: deploy
script:
- echo "Deploying the project"
- make deploy
이 스크립트는 build, test, deploy 세 단계로 구성되어 있으며, 각 단계에서 작업이 정의되어 있다. 태그를 활용하여 build_job은 리눅스 환경에서, test_job은 윈도우 환경에서 실행되도록 설정되어 있다. 이처럼 러너 태그를 사용하면 특정 환경에 맞는 작업을 선택적으로 실행할 수 있다. script 부분을 커스텀 하면 다양한 명령어를 실행하 수 있도록 만들수도 있다.
GitLab CI의 러너 태그는 다양한 환경에서 작업을 분배하고 관리하는 데 매우 유용한 기능으로, 프로젝트의 요구 사항에 따라 유연하게 활용할 수 있다.
나올 수 있는 질문
Q. job에 특정 runner를 실행하기 위한 tag 를 작성해두었는데, runner 가 없으면 어떻게 될까?
A. 해당 job 은 계속 pending 상태로 남아있게 되어 그 파이프라인이 무한히 안끝날 수 있다. 따라서 ci스크립트에 job이 있다면 해당 job을 실행시킬 수 있는 runner는 반드시 명시해두어야 한다.
Q. runner 에 그냥 아무 공용 runner를 등록해놨는데, job을 실행하면 얘가 돌아갈까?
A. job과 runner 에 tag 가 설정되어 있지 않다면 등록해둔 공용(tag 없음) runner가 실행될 수 있다. 오동작이 될 수도 있고.. 웬만하면, 위에서 말한것 처럼 job과 runner는 맵핑되도록 스크립트 작성하도록 하자. But, runner에 tag가 명시되어 있다면, job에서 해당 tag를 호출하지 않는 이상 runner가 실행될 경우는 없기 때문에 문제는 없겠다.