GitLab Project Runner using Docker
GitLab
에서 기본으로 제공되는 Runner
를 활용하여 CI를 이용하던 도중에 Pipeline
의 Jobs
다음의 에러와 함께 실패가 되고 있었습니다.
Email과 Google Chats에도 실패된 Alarm 들..
실패된 원인을 확인해보니 무료로 제공되는 Gitlab-hosted Runner
의 400분을 초과되어 Pipeline의 Job들이 할당되지 못하는 이슈 였습니다.
해당 Issue를 해결하려면 Pay-as-you-go 모델로 과금을 하거나, 별도의 GitLab Runner를 운영하는 방법이 있습니다.
개발 환경의 서버들이 있어 Self-managed Runner
를 생성하려고 합니다.
GitLab Runner
- CI / CD Pipeline에 Job을 실행하는 오픈소스 프로젝트입니다.
- Linux, macOS, Windows, Docker, Kubernetes 클러스터와 같은 다양한 OS와 Platform에 설치가 가능합니다.
- GitHub에는 Actions가 동일합니다.
- GitLab Runner는 GitLab 서버에서 실행할 새로운 Job을 주기적으로 확인합니다.
- .gitlab-ci.yml 파일에 정의된 Stage 별로 실행합니다.
- Runner가 작업을 실행하면 실시간 상태, 로그 및 이벤트 들을 GitLab 서버로 보내어 모니터링이 가능합니다.
GitLab Runner 종류
- Instance Runner: GitLab 관리자가 구성하며, Instance 내의 모든 그룹과 프로젝트에 이용 가능합니다.
- Group Runners: Group 관리자가 구성하며, 그룹 내의 모든 프로젝트와 그룹에 속한 서브 그룹에 이용 가능합니다.
- Project Runners: 특정 프로젝트에만 이용 가능한 단일 Runner입니다.
- https://docs.gitlab.com/ee/ci/runners/runners_scope.html
Project Runner 등록
프로젝트에 들어가 서브 메뉴에서 Settings → CI/CD
를 클릭합니다.
다음에서 Runner 측에 Expand 버튼을 누르고 New project runner
버튼을 클릭합니다.
다음의 페이지에서 Tags와 Configuration을 입력합니다.
Runner가 생성되었습니다.
지원되는 OS와 Cloud, Container Platform 설정 방법들이 나옵니다.
Runner의 authentication token
을 활용해 Runner를 실행합니다.
해당 Token 정보를 잘 저장하도록 합니다.
Docker를 통해 Runner 배포를 진행해보겠습니다.
다음의 명령어를 통해 Docker Runner를 실행합니다.
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
gitlab-runner
Container로 접속하여 상기 등록 과정을 진행합니다.
docker exec -it gitlab-runner /bin/bash
$ gitlab-runner register --url https://gitlab.com --token [YOUR_TOKEN]
추가적으로 Container Image 빌드 및 Push를 위해서는 previleged mode 권한 부여가 필요합니다.
미 설정 시 다음의 오류가 발생됩니다.
Starting service docker:dind...
Pulling docker image docker:dind ...
Using docker image sha256:023c1e5a395e5cf6647ec770a46402bf1238698b8b85a2bf4c583d724ab98b4c for docker:dind with digest docker@sha256:75f620cbf8e87543ec1fb0bf98fa2cfde8f684308dafb6c50cc75f3a235fa1fc ...
Waiting for services to be up and running (timeout 30 seconds)...
*** WARNING: Service runner-aahrpg9ng-project-57497592-concurrent-0-3cc63cac9cbecad8-docker-0 probably didn't start properly.
Health check error:
start service container: Error response from daemon: Cannot link to a non running container: /runner-aahrpg9ng-project-57497592-concurrent-0-3cc63cac9cbecad8-docker-0 AS /runner-aahrpg9ng-project-57497592-concurrent-0-3cc63cac9cbecad8-docker-0-wait-for-service/service (services.go:215:0s)
Service container logs:
2024-07-22T18:19:11.846202657Z cat: can't open '/proc/net/ip6_tables_names': No such file or directory
2024-07-22T18:19:11.846451257Z cat: can't open '/proc/net/arp_tables_names': No such file or directory
2024-07-22T18:19:11.847820182Z ip: can't find device 'nf_tables'
2024-07-22T18:19:11.848311569Z nf_tables 372736 993 nft_chain_nat,nft_limit,nft_compat
2024-07-22T18:19:11.848518921Z libcrc32c 12288 5 btrfs,xfs,nf_nat,nf_conntrack,nf_tables
2024-07-22T18:19:11.848524179Z nfnetlink 20480 7 ip_set,nf_conntrack_netlink,nft_compat,nf_tables
2024-07-22T18:19:11.848824182Z modprobe: can't change directory to '/lib/modules': No such file or directory
2024-07-22T18:19:11.849881342Z ip: can't find device 'ip_tables'
2024-07-22T18:19:11.850540211Z ip_tables 36864 0
2024-07-22T18:19:11.850577682Z x_tables 69632 20 xt_multiport,xt_set,ipt_rpfilter,xt_statistic,xt_mark,xt_comment,xt_recent,xt_nat,xt_MASQUERADE,ip6t_REJECT,xt_hl,ip6t_rt,ipt_REJECT,xt_LOG,xt_limit,xt_addrtype,xt_tcpudp,xt_conntrack,nft_compat,ip_tables
2024-07-22T18:19:11.850908736Z modprobe: can't change directory to '/lib/modules': No such file or directory
2024-07-22T18:19:11.851553132Z ip: can't find device 'ip6_tables'
2024-07-22T18:19:11.852463736Z modprobe: can't change directory to '/lib/modules': No such file or directory
2024-07-22T18:19:11.853416454Z iptables v1.8.10 (nf_tables)
2024-07-22T18:19:11.854741902Z mount: permission denied (are you root?)
2024-07-22T18:19:11.854778795Z Could not mount /sys/kernel/security.
2024-07-22T18:19:11.854784000Z AppArmor detection and --privileged mode might break.
2024-07-22T18:19:11.855411686Z mount: permission denied (are you root?)
GitLab Runner
의 환경 설정 파일인 config.toml 파일을 수정합니다.
vi /etc/gitlab-runner/config.toml
[[runners]]
url = "https://gitlab.com"
...
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:stable"
privileged = true <---
GitLab Page로 돌아와 View runner 버튼을 클릭해 등록된 Runner를 확인합니다.
상세 버튼을 클릭하여 해당 Runner 정보를 확인합니다.
실패되었던 Pipeline을 Retry 해봅니다.
Docker Log를 확인해봅니다.
docker logs -f gitlab-runner
Page내에 Job들이 성공적으로 수행됩니다.
정상 동작되어 Pipeline이 완료가 된 것을 확인할 수 있습니다.
다음은 Group Runner와 Kubernetes 기반으로 Runner를 배포해보겠습니다.
감사합니다.
'Git > GitLab' 카테고리의 다른 글
GitLab CI를 활용한 Harbor Registry로 Container Image Push (1) | 2024.08.31 |
---|---|
GitLab Group Runner Docker Container (1) | 2024.07.24 |
GitLab Runner Docker Build Daemon 2375 port issue (0) | 2024.07.24 |
GitLab CI Container 이미지 빌드와 GitLab Registry (1) | 2024.07.08 |
GitLab CI Golang 배포 (0) | 2024.07.08 |