GitLab: Runnerの構築と登録

gitlab(saas: gitlab.com)でDinD用のRunnerを登録する。公式のドキュメントではDinDDooDの両方についてセットアップ方法が記載されている。DinDではprivilegedの設定が必要で、DooDではsockファイルのマウントが必要になる。DinDとDooDの違いを使う側はそれほど意識しなくてもよいのでRunnerを管理する側の都合で方式を決定してよいように思われる。

gitlab的にはDinDでの構築を推奨しているように読める。(REF)

You should use Docker-in-Docker with TLS enabled, which is supported by GitLab.com instance runners.

DinD環境で動くパイプラインであればDooD環境でも動くと思われる。後でDooDにするにしても一旦はDinDで作っておくことにする。

(DooDはService無くても直接docker cliを叩けるのでDooD用最適化して作ったパイプラインはDinDでは動かないかもしれない。構築環境として制約が発生するが、rootless環境で専用のユーザを用意して、DooDで構築するのが一番良いのだろうか。手持ちのraspberry piを再利用するならDooDで環境構築して使うときだけ電源を入れるとかが良いかもしれない。)

GitLab Runnerの構築 (docker compose)

gitlab-runner用のdocker-comose.ymlを用意する。

# make -p ./gitlab-runner/config
# cd ./gitlab-runner
# vi docker-compose.yml
services:
  gitlab-runner:
    image: 'gitlab/gitlab-runner:latest'
    container_name: 'gitlab-runner'
    restart: unless-stopped
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - ./config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock

docker composeコマンドでコンテナを起動する。

# docker compose up -d
# docker compose ps
NAME             IMAGE                         COMMAND                  SERVICE          CREATED         STATUS         PORTS
gitlab-runner   gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   gitlab-runner   4 minutes ago   Up 4 minutes

GitLab Runnerの登録

gitlab.comへアクセスし、新規グループRunnerからRunnerの登録を開始する。

Runner作成ボタン

Ruunerの設定を記入して、Runnerを作成へ進む。

Runner作成画面

ステップ1に記載されるコマンド(トークン)を取得する。このトークンはdockerで立ち上げたgitlab-runnerに登録する必要がある。

Runner登録設定

トークンを登録する。この際、コマンドは公式ドキュメントに記載されているようにカスタマイズすることが出来る。今回は、Webページで発行されたコマンドをそのまま実行して、他の設定はconfig.tomlを編集することでは変更する方針とした。このため、docker compose downでコンテナを停止させている。

# docker exec -it gitlab-runner gitlab-runner register  --url https://gitlab.com --token ####secret value####
Runtime platform                                    arch=arm64 os=linux pid=15 revision=66269445 version=17.3.1
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
[https://gitlab.com]:
Verifying runner... is valid                        runner=
Enter a name for the runner. This is stored only in the local config.toml file:
[73260c2693b3]: test20240915
Enter an executor: virtualbox, docker, docker+machine, kubernetes, instance, ssh, shell, parallels, docker-windows, docker-autoscaler, custom:
docker
Enter the default Docker image (for example, ruby:2.7):
docker:27.2.1
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"

# docker compose down

config.tomlを編集する。公式ドキュメントにあるようにprivilegedをtrueに設定し、volumesに/certs/clientを追加する必要がある。1行目のconcurrentはjobの同時実行可能数となる。サーバーの性能を鑑みて、割り振るリソースを決定する。今回はconcurrent = 2とした。tomlの設定項目についてはこちら

concurrent = 2
check_interval = 0
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "test20240915"
  url = "https://gitlab.com"
  id = 41218392
  token = 
  token_obtained_at = 2024-09-15T14:11:27Z
  token_expires_at = 0001-01-01T00:00:00Z
  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:27.2.1"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/certs/client", "/cache"]
    shm_size = 0
    network_mtu = 0

config.tomlの編集が完了したら、コンテナを起動する。

# docker compose up -d

gitlab.comの画面からRunnerが追加されていることを確認する。

Runner登録後画面

パイプラインの実行

動作確認のためにコンテナビルドジョブをテスト実行する。今回はDocker-in-Docker with TLSで構築しているためTLSを想定したJobにしておかないジョブが失敗する可能性があることに注意。(gitlab.comで共有されているRunnerはTLSが有効化されているとのこと

Running with gitlab-runner 17.3.1 (66269445)
  on test20240915 ****, system ID ****: 
Preparing the "docker" executor
Using Docker executor with image **** ...
Starting service docker:dind...
Pulling docker image docker:dind ...
Using docker image sha256:**** for docker:dind with digest **** ...
Waiting for services to be up and running (timeout 30 seconds)...
Authenticating with credentials from job payload (GitLab Registry)
Pulling docker image **** ...
Using docker image sha256:**** for **** ...
Preparing environment
Running on runner-*****-project-61510404-concurrent-0 via c8019d4c7878...
~省略~
$ docker info
Client:
 Version:    27.2.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.17.1
    Path:     /usr/local/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.29.3
    Path:     /usr/local/libexec/docker/cli-plugins/docker-compose
~省略~
$ docker buildx version
github.com/docker/buildx v0.17.1 257815a6fbaee88976808020bf04274388275ae8
パイプラインジョブ実行画面