前書き
私はGitHub Actionsのワークフローをセルフホステッドランナーで運用しているのですが、
- インストール系のアクションを使用すると古いバージョンのツールが残る
- ログファイルが溜まる
上記2点のようなログやらファイルやらがディスクを使用することで、ランナーがディスクフルになりワークフローが実行できなくなる事象に遭遇しています。
マネージドイメージの様に毎回初期化状態になっていてくれないかな〜と思い、「セルフホストテッドランナー上でDockerコンテナーアクション使えばホストOSにファイルを残さないようにできるんじゃないか?」 と思い立ったので検証してみることにしました。
結論
- コンテナーアクションの場合は実行時にコンテナを作成しワークフロー終了時に削除するため、ホストOS側に残るのはコンテナーアクションで指定したDockerイメージだけ
- セルフホステッドランナー内でDockerイメージをビルドしてローカルイメージを作成しても、必ず
docker pull
を実行するようになっているため、使用されない
検証環境
ハードウェア: M1 Mac
OS: mac OS Sonoma 14.2.1
ソフトウェア: Docker Desktop 4.28.0
検証手順
以下の手順で進めていきます。
- 検証用セルフホステッドランナーの準備
- セルフホステッドランナーの登録
- GitHub Actions 実行
検証用セルフホステッドランナーの準備
今回はホストOSを汚したくないので、セルフホステッドランナー自体をDocker Containerで作成します。
セルフホステッドランナー内でDockerを使用するのが目的なので、dind(docker in docker)用のコンテナを作成することになります。
今回はUbuntuのイメージを使用してコンテナを作成していきます。
dind用Ubuntuコンテナ作成手順
- Docker HubのUbuntuの公式イメージを使用してDockerfileを作成します
UbuntuでDockerを使用したいので、initとsystemdを追加してsystemctlを使用できるようにしておきます。
FROM ubuntu:22.04 RUN apt-get update \ && apt-get install -y init systemd
- Dockerイメージをビルドします
docker build -t local/ubuntu:22.04-dind .
- イメージからコンテナを起動します
docker run -it --rm --privileged --name github-self-host-runner -d local/ubuntu:22.04-dind /sbin/init
- コンテナ内でBashを実行します
docker exec -it github-self-host-runner bash
-
DockerをUbuntuにインストールする手順を参考にDockerをインストールして起動します
apt-get update apt-get install ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin systemctl start docker
これでコンテナの準備ができました!
今思い返すと、Dockerのインストール部分もDockerfileに書くべきでしたね…
セルフホステッドランナーの登録
前の手順で作成したセルフホステッドランナーコンテナをGitHub Actionsに登録します。
前回の手順の続きから作業するので、セルフホステッドランナーコンテナでbashを使用している状態から手順を始めます。
-
必須コマンドをインストールします
apt install sudo
Ubuntuのイメージにはsudoが入っていないのでインストールします。
-
セルフホステッドランナー用のユーザーを作成します
useradd -m actions-runner -s /bin/bash passwd actions-runner gpasswd -a actions-runner docker,sudo
-
上記手順で作成したユーザーにスイッチしてセルフホストランナーを登録します
su actions-runner cd curl -o actions-runner-linux-arm64-2.314.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.314.1/actions-runner-linux-arm64-2.314.1.tar.gz tar xzf ./actions-runner-linux-arm64-2.314.1.tar.gz ./config.sh --url https://github.com/${username}/${repos} --token ${token} # サービスのインストール及び起動 sudo ./svc.sh install sudo ./svc.sh start
GitHub Actions 実行
今回は検証用にaws-cli
をダウンロードしてバージョンを表示するだけの単純なワークフローを作成して実行後のセルフホステッドランナーに何が残るのかを確認していきたいと思います。
そのため、install-aws-cli-actionを使用したワークフローを作成します。
検証用ワークフロー
今回は以下のワークフローを使用します。
内容は前述した通りaws-cli
を使用するのに必要最低限なパッケージのインストールとツールのインストール&バージョンコマンドで使えることの確認という構成です。
name: ContainerActions
on:
workflow_dispatch:
jobs:
container-test-job:
runs-on: self-hosted
container:
image: ubuntu:22.04
volumes:
- my_docker_volume:/volume_mount
options: --cpus 1
steps:
- run: apt update && apt install -y sudo wget unzip
shell: bash
- name: aws cli install test
id: install-aws-cli
uses: unfor19/install-aws-cli-action@master
with:
version: 2
arch: arm64
- run: aws --version
shell: bash
Dockerコンテナーアクションの検証
それでは実際にワークフローを実行していきます。
実際に成功したワークフローが以下です。
ちゃんとバージョンが表示されているのでcliは使える状態になっています。
Initialize containers
ステップを確認してみると、ワークフロー用のネットワークの作成及び、イメージのpullからコンテナの作成/開始まで一通り行っています。
ユーザーが定義したワークフローの内容が終わった後はStop conteiners
ステップでコンテナとネットワークの削除を行ってくれています。
ワークフロー実行後のセルフホステッドランナーのDockerの使用状況を確認してみたところ、
コンテナーアクションで使用するイメージが増えただけでした。
イメージの容量に気をつければビルド系のワークフローを使い続けてもディスクフルになる心配はなさそうです。
ローカルのDockerイメージは使えるのか
これならセルフホステッドランナー内にDockerイメージ作っておけばそれを使えるのでは?と気になったので、それも確認してみました。
セルフホステッドランナーコンテナ内でさらにdindイメージを作成してみました。
実行してみましたが、こちらは失敗しました…
必ずpullコマンドを実行するため、どこかのリポジトリに入れておかないと実行できなさそうです…
セルフホステッドランナー上にローカルDocker Registry
を構築すればいけるかな?とも思いましたが、その検証はまた別で実施しようと思います。
最後に
セルフホステッドランナーのホストOSを直に使うよりもディスクの管理が楽なので、
今後は積極的にコンテナーアクションを使っていこうと思いました。
最後までお読みいただきありがとうございます!
誤りがあればご連絡頂けると幸いです!