👨‍🔧

GitLab RunnerをLXDコンテナ上に構築

2022/10/08に公開

TL;DR

https://gitlab.com/-/snippets/2423983

背景

CIはじゃぶじゃぶ使いたいが、無料だとGitLabのCIをあまり使えなくなった。よって、GitLab Runnerを自前で立てたい。しかし、GitLab Runnerのdockerコンテナの実行がrootで走るのが気に入らないので直接インストールしたくない。
GitLab RunnerはDocker上にインストール出来るが、現状Rootless Docker上には出来ないっぽい。LXDコンテナはデフォルトでコンテナ内のrootがコンテナ外のrootにならない。よって、LXDコンテナ上にインストールすれば良い。
LXDコンテナのイメージは無難にUbuntuとかでも良かったのだが、なんとなくAlpine Linuxを使って使うリソースを減らしてみた。

先に準備しておくもの

構築スクリプト

#!/bin/sh
set -eux
# LXDコンテナの名前
name=gitlab-runner
# 用意した登録トークン
token="your runner registration token here"
# CIをいくつまで同時に走らせるかの設定
num_workers=$(nproc)
lxc init images:alpine/3.16 "$name"
# LXDコンテナ内でDockerを使うために必要
lxc config set "$name" security.nesting true
lxc start "$name"
# コンテナの初期化等を待つ (`apk update`が失敗するようなら適当に伸ばす)
sleep 10
lxc exec "$name" apk update
# GitLab RunnerとDockerをインストール
lxc exec "$name" apk add docker gitlab-runner
# GitLab Runnerの設定
lxc exec "$name" mkdir /etc/gitlab-runner
lxc exec "$name" -- sh -c 'cat >/etc/gitlab-runner/config.toml' << EOF
concurrent = $num_workers
check_interval = 0

[session_server]
  session_timeout = 1800

EOF
# 「gitlab-runner」というユーザーを「docker」グループに入れる
lxc exec "$name" addgroup gitlab-runner docker
# dockerd と gitlab-runner がコンテナ起動時に自動で立ち上がるように設定
lxc exec "$name" rc-update add docker boot
lxc exec "$name" rc-update add gitlab-runner boot
# dockerd と gitlab-runner を起動
lxc exec "$name" service docker start
lxc exec "$name" service gitlab-runner start
# 起動待ち
sleep 3
# dockerd と gitlab-runner の起動に成功したかどうか確認
lxc exec "$name" service docker status
lxc exec "$name" service gitlab-runner status
# GitLab Runner を登録 (以下はDockerで実行し、プロジェクト等にlockしない設定)
lxc exec "$name" -- gitlab-runner register \
	--non-interactive \
	--url https://gitlab.com/ \
	--registration-token "$token" \
	--executor docker \
	--docker-image alpine:latest \
	--locked=false

備考

ufwを有効にしている場合コンテナ内からの通信が上手く行かない可能性がある。その場合、このようにすれば良い。

LXDコンテナのストレージプールを拡張したい場合このようにすれば良い。(snapでLXDをインストールしていて、poolがBtrfsの場合)

Discussion