GitLab: Runnerの構築と登録
gitlab(saas: gitlab.com)でDinD用のRunnerを登録する。公式のドキュメントではDinDとDooDの両方についてセットアップ方法が記載されている。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の登録を開始する。
Ruunerの設定を記入して、Runnerを作成へ進む。
ステップ1に記載されるコマンド(トークン)を取得する。このトークンはdockerで立ち上げたgitlab-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が追加されていることを確認する。
パイプラインの実行
動作確認のためにコンテナビルドジョブをテスト実行する。今回は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