Git/GitLab

GitLab Project Runner using Docker

김 정출 2024. 7. 20. 00:24

GitLab Project Runner using Docker

GitLab에서 기본으로 제공되는 Runner 를 활용하여 CI를 이용하던 도중에 PipelineJobs 다음의 에러와 함께 실패가 되고 있었습니다.

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를 배포해보겠습니다.

감사합니다.