GitLab CI & Runner
Topicon-premises 설치형 Git으로 유명한 GitLab은 자체적으로 CI / CD를 제공합니다. Microsoft에서 인수한 GitHub도 이와 같은 기능인 GitHub Actions도 GitLab CI의 private 프로젝트의 가격 정책을 그대로 담습한 모습이 보입니다.
on-premises : 자체 보유 인프라 환경으로 내부에 별도로 구축한 인프라를 의미한다.
GitLab CI는 자체적으로 공유하고 있는 Runner
를 사용할 경우 프로젝트 성격에 따라 다른 정책을 차용하고 있습니다. public 프로젝트는 Gold Plan 혜택이 적용되어 50,000분/월 CI 러닝타임
을 기본 제공하고 있습니다. 반면 private 프로젝트는 Free Plan의 경우 2,000분/월 CI 러닝타임
을 제공합니다. 많은 사람들이 GitLab을 쓰는 이유는 private에 있기 때문에 CI는 하루에 약 1시간 20분 정도 사용할 수 있습니다.
물론 이는 GitLab이 자체적으로 제공하는 Runner
를 사용할 경우입니다. 자신의 서버에서 Runner
를 구동하는 경우에는 제한 사항이 없습니다. 따라서 서버에 Runner
를 세팅하면 추가적인 비용을 들이지 않고도 마음껏 GitLab CI를 사용할 수 있습니다. 일부 블로그에는 이 내용이 잘못 정리되어 있으니 참고 바랍니다.
GitLab Runner 설치
GitLab은 자체적으로 운용할 수 있는 Runner
를 제공합니다. 서버에 Runner
를 설치하는 방법은 다음과 같습니다.
1. GitLab Runner를 다운로드합니다.
# Linux x86-64
curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# Linux x86
curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-386
# Linux arm
curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm
2. GitLab Runner에 실행 권한을 부여합니다.
chmod +x /usr/local/bin/gitlab-runner
3. GitLab Runner를 담당할 계정을 생성합니다.
useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
# nginx의 경우 그룹 www-data 권한 추가
usermod -aG gitlab-runner www-data
4. GitLab Runner를 설치하고, 실행합니다.
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
gitlab-runner start
GitLab Runner 생성
GitLab Runner
를 설치했으면 이제 설정을 해야 합니다. 아래와 같은 코드를 실행하면 GitLab 정보 및 토큰을 지정할 수 있습니다. 등록을 마쳤으면 이제 Runner
를 통해 CI/CD를 구축할 수 있습니다.
gitlab-runner register
토큰 확인: GitLab → Settings → CI/CD → Runner
등록한 Runner
는 GitLab을 통해 확인할 수 있습니다. 해당 페이지에서 사용하지 않는 Runner
에 대하여 비활성화할 수도 있으며, 필요하다면 GitLab에 연동된 Runner
를 지울 수도 있습니다.
.gitlab-ci.yml
GitLab CI를 이용하기 위해서는 Repository root에 .gitlab-ci.yml
을 생성해야 합니다. 이를 생성하면 다양한 기본 템플릿을 제공하는 것을 확인할 수 있습니다. 기본적으로 shell를 사용할 줄 알면 손쉽게 CI를 구축할 수 있습니다. 스크립트도 GitLab를 통해 관리하면 편리하게 배포 체계를 살펴볼 수 있으며, 다른 코드와 마찬가지로 버전 관리할 수 있습니다.
GitLab CI는 다양한 상수를 제공하는데, 버전에 따라 지원하는 상수가 다릅니다. 개인적으로 흔하게 쓰일 법한 상수는 이 두 개가 아닐까 싶습니다.
- 프로젝트명: $CI_PROJECT_NAME
- 실행한 브랜치명: $CI_COMMIT_REF_NAME
이 외에도 Commit 내역이나, 서버 정보 등 다양한 상수가 필요하다면 레퍼런스를 참조하면 됩니다. 최신 버전일수록 다양한 상수를 지원하기 때문에 오래된 버전이라면 지원 여부를 꼭 확인하도록 합시다.
GitLab CI가 제공하는 상수 외에도 별도로 지정할 수 있으며, 상수를 GitLab을 통해 관리할 수도 있습니다. flag 정도는 GitLab에서 직접 관리하는게 편합니다. 매 번 flag를 위해 .gitlab-ci.yml
를 commit하는건 비효율적입니다.
GitLab은 Docker 친화적이기 때문에 Docker를 사용한다고 하더라도 문제가 되지 않습니다. 수많은 예시가 Docker 기반으로 이루어져 있다는걸 보면 GitLab이 이를 얼마나 밀고 있는지 알 수 있습니다. 따라서 자신의 상황에 맞게 Docs를 참조하여 .gitlab-ci.yml
를 작성하면 됩니다. 이 파일이 생성되는 순간부터 commit을 하면 파이프라인이 실행되는걸 볼 수 있습니다.
.gitlab-cl.yml 기본 설명
variables: # 상수 지정
GIT_STRATEGY: clone # 러너 실행 시 clone하도록 지정(기본값: fetch)
PROJECT_ROOT_PRODUCTION: /~~ # 커스텀 상수
stages: # 스테이지 종류
- composer # 임의로 스테이지를 지정할 경우 Runner에 해당 tag를 부여해야 함
- deploy
before_script: # Job 실행 시 먼저 될 공용 스크립트
- echo "before_script"
composer-install: # 작업명
stage: composer # 스테이지 지정
script:
- echo "composer install"
deploy-master: # 작업명
stage: deploy # 스테이지 지정
script:
- echo "deploy project ${CI_COMMIT_REF_NAME}";
only: # 해당 조건만 실행
refs: # 특정 브랜치
- master
deploy-staging: # 작업명
stage: deploy #스테이지 지정
script:
- echo "deploy project ${CI_COMMIT_REF_NAME}";
only: # 해당 조건만 실행
refs: # 특정 브랜치
- staging
after_script: # Job 실행 시 마지막 실행 될 공용 스크립트
- echo "after_script"
GitLab Runner in Server
# GitLab Runner home directory
cd
# GitLab Project code
cd builds/{runner_code}/{thread_num}/{project_group}/{project_name}
GitLab Runner는 위와 같은 경로로 프로젝트 별 코드를 관리합니다. 브랜치 별로 코드를 가지고 있지 않으며, 특정 브랜치에서 Runner
를 호출할 때마다 checkout하여 코드를 관리합니다.
Q. Runner에 tag를 설정했는데, Job이 실행되지 않아요.
This job is stuck because the project doesn't have any runners online assigned to it.
Go to Runners page
This job has not started yet
This job is in pending state and is waiting to be picked by a runner
A. Runner 옵션에 Run untagged jobs를 체크하면 Job이 실행되는걸 확인할 수 있습니다.
Devellany
back-end Developer
PHP, Java, JavaScript, MySQL, Redis, Ubuntu, Nginx
Codeigniter, Laravel, Zend, Phalcon, Spring Boot, JPA
PHPStorm, IntelliJ, Upsource, SVN, Git, Telegram Bot