Self managed repository and CI #6 - Gitlab-runner

Jinwon Seo·2022년 12월 1일
0
post-thumbnail

앞서 구성한 docker compose에 Gitlab-runner를 추가 하겠습니다.

├─ nginx
│   ├─ config
│   │   ├─ gitlab.conf
│   │   ├─ minio.conf
│   │   └─ nexus.conf
│   └─ nginx.conf
└─ docker-compose.yml # this!

Gitlab-runner

Gitlab runner 의 docker images는 아래 링크에서 확인할 수 있습니다.

Docker hub - gitlab/gitlab-runner

Gitlab-runner 구성

docker compose에 gitlab-runner 구성을 추가합니다.

# ./docker-compose.yml

services:
  (...중략...)
  gitlab-runner:
    image: gitlab/gitlab-runner:v15.5.0
    container_name: gitlab-runner
    restart: always
    volumes:
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: bind
        source: ./gitlab-runner
        target: /etc/gitlab-runner
    networks: 
      docker-host:
        ipv4_address: 172.20.0.11

docker-compose.yml이 존재하는 위치에서 아래 명령을 실행합니다.

$ docker-compsoe up -d gitlab-runner

실행이 완료 되면 아래와 같이 에러 로그가 계속 되는데 gitlab 연결 설정이 되지 않았기 때문에 정상입니다.

$ docker logs -f gitlab-runner

Runtime platform                                    arch=amd64 os=linux pid=8 revision=0d4137b8 version=15.5.0
Starting multi-runner from /etc/gitlab-runner/config.toml...  builds=0
Running in system-mode.

Configuration loaded                                builds=0
listen_address not defined, metrics & debug endpoints disabled  builds=0
[session_server].listen_address not defined, session endpoints disabled  builds=0
ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory  builds=0
ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory  builds=0

Gitlab과 runner 연결

gitlab runner 연결에 대한 내용은 공식 문서가 잘 성명하고 있으니 먼저 살펴 보시는게 좋겠습니다.

(2022-22-01 추가) 링크를 확인 하기 위해 들어가 봤는데 15.6 부터 token을 통한 등록 방식을 지원하지 않고 16 부터는 제거 할 예정이라고 합니다. Gitlab 버전을 올리게 되면 문서를 업데이트 해야겠네요..

Gitlab docs - Registering runners

Gitlab에 runner를 연결하기 위해 registration token을 확인합니다.

admin > runners > Registration token

다시 콘솔로 돌아가서 앞서 실행했던 runner 컨테이너로 접속합니다.

$ docker exec -itu 0 gitlab-runner bash
root@sandbox-gitlab-runner:/# 

register를 통해 등록합니다.

  • GitLab instance URL: http://gitlab/
  • registration token: change_me
  • description for the runner: description
  • tags for the runner: [skip]
  • optional maintenance note for the runner: skip
  • Enter an executor: docker
  • default Docker image: docker:20.10.18
root@gitlab-runner:/# gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=41 revision=0d4137b8 version=15.5.0
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
http://gitlab/
Enter the registration token:
change_me
Enter a description for the runner:
[sandbox-gitlab-runner]:
Enter tags for the runner (comma-separated):

Enter optional maintenance note for the runner:

Registering runner... succeeded                     runner=mSwVo29q
Enter an executor: docker-ssh, parallels, shell, ssh, docker-ssh+machine, custom, docker, virtualbox, docker+machine, instance, kubernetes:
docker
Enter the default Docker image (for example, ruby:2.7):
docker:20.10.18
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"

완료 된 후 gitlab을 보면 등록된 runner를 확인할 수 있습니다.

그리고 docker-compose.yml이 존재하는 디렉토리를 확인 해 보면 runner 폴더와 함께 설정 파일이 생성된 것도 확인 할 수 있습니다. 이 파일을 변경하여 runner 설정을 변경 할 수 있습니다.

├─ nginx
│   ├─ config
│   │   ├─ gitlab.conf
│   │   ├─ minio.conf
│   │   └─ nexus.conf
│   └─ nginx.conf
├─ gitlab-runner
│   └─ config.toml # this!
└─ docker-compose.yml
# ./gitlab-runner/config.toml

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "gitlab-runner"
  url = "http://gitlab/"
  id = 1
  token = "token"
  token_obtained_at = 2022-12-01T01:43:34Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:20.10.18"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0

Gitlab-runner 추가 설정

Cache 설정

config.toml을 변경하여 캐시 구성을 하겠습니다. 지금 설정하는 캐시는 ci 과정에서 발생되는 파일들을 캐시 서버에 보관하여 동일한 프로젝트의 CI 단계에서 원격 라이브러리 저장소에 접속하여 다운 받는 횟수를 최소화하 하여 수행 시간을 줄이기 위함입니다.

아래 설정과 같이 편집해 줍니다.

[runners.cache.s3] 의 AccessKey, SecretKey, BucketName은 아래 문서의 Bucket 생성을 확인해 주세요.

Self managed repository and CI #4 - MinIO

# ./gitlab-runner/config.toml

[[runners]]
  [runners.cache]
    Type = "s3"
    Shared = true
    [runners.cache.s3]
      ServerAddress = "minio.domain.com"
      AccessKey = "change_me"
      SecretKey = "change_me"
      BucketName = "private-gitlab-ci"
      Insecure = true
  [runners.docker]
    privileged = true
    disable_cache = true # runner volume cache 비활성화
    # volumes = ["/cache"] <- 제거 하거나 주석처리, runner volume cache 비활성화

Docker auth config

앞서 nexus에 구성한 docker container registry의 인증 정보를 runners.environment에 추 가합니다. 생성 방법은 아래 링크를 통해 확인 가능합니다.

https://docs.gitlab.com/ee/ci/docker/using_docker_images.html

먼저 아래 명령줄을 통해 Docker에 login 합니다.

$ docker login registry.nexus.domain.com --username change_me --password change_me
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

로그인에 성공한다면 해당 계정정보(username:password)를 Base64로 인코딩 합니다.

$ printf "my_username:my_password" | openssl base64 -A
<base64 encoded output>

이 문자열을 가지고 아래와 같은 json 구조를 만들어 주세요.

{
    "auths": {
        "registry.nexus.doamin.com": {
            "auth": "<base64 encoded output>"
        }
    }
}

그리고 그 json 문자열을 아래와 같이 runners.environment에 추가합니다.

# ./gitlab-runner/config.toml
[[runners]]
  environment = ["DOCKER_AUTH_CONFIG={\"auths\":{\"registry.nexus.domain.com\":{\"auth\":\"<base64 encoded output>\"}}}"]

변경된 설정 적용

변경한 설정을 gitlab-runner에 적용 시킵니다.

$ docker restart gitlab-runner

예제코드

작성된 코드는 아래 Repository에 올려두었습니다.

Github - self-managed-repository-and-ci

Next

다음은 Gitlab에 프로젝트를 생성하고 spring boot application을 올린 뒤 gitlab-ci를 구성하겠습니다.

  1. Self managed repository and CI #1 - Overview
  2. Self managed repository and CI #2 - Docker network, Nginx reverse proxy
  3. Self managed repository and CI #3 - Nexus3
  4. Self managed repository and CI #4 - Minio
  5. Self managed repository and CI #5 - Gitlab
  6. Self managed repository and CI #6 - Gitlab-runnerㆍ현재 글
  7. Self managed repository and CI #7 - Gitlab-CI

0개의 댓글