この記事は
YAMAP エンジニア Advent Calendar 2020 の 22 日目になる予定です。
頑張るぞ。
tl;dr
いよいよブログに書けそうなネタが尽きてきたので、試してみた色強めのネタを書かせて頂きます。
かねてより気になっていた、Github Actions の自己ホストランナーを手元の MacBook Pro 上の Docker Desktop を利用して試してみました。
自己ホストランナー
self-hosted runners
自己ホストランナーは self-hosted runners が直訳されている感じですが、以降は self-hosted runners と書かせて頂きます。
self-hosted runners は、GitHub が提供する Runner を使う代わりに自前のクラウド環境のサーバーやオンプレサーバー、Docker コンテナ等を Runner として利用する機能です。
self-hosted runners を利用することで、Github Actions の課金が発生しなくなるのはメリットだと思います。Runner のホストを管理するコストが発生しますが、カスタマイズした Runner 環境を用意出来たり、閉じた環境で Runner を構築することで、よりセキュアな CI/CD 環境を構築出来るようになると思います。
セットアップ
基本的なセットアップは、下図の通り、self-hosted runners を利用したい Github リポジトリの Actions > Self-hosted runners > Add runner をクリックして開始します。
以下のようにエージェントのダウンロードとインストール、リポジトリとの連携までのステップが記載されたページが表示されます。
おお、めっちゃ簡単。
Download の部分を Docker コンテナイメージに封じ込めて、Configure の部分は、コンテナを起動した後、手動でコマンドを実行するようにしたいと思います。(後ほど記載します)
self-hosted runners 環境を Docker で作る
コンテナの起動
こちらの記事を参考にさせて頂いて、Dockerfile を用意しました。
Docker on Docker でコンテナイメージをビルドしたり、AWS CLI を使った処理を実行したいので、Docker をインストールしたり、AWS CLI をインストールしたりしています。
FROM ubuntu:bionic ENV DEBIAN_FRONTEND noninteractive RUN apt update && apt install language-pack-ja sudo curl apt-transport-https awscli \ ca-certificates \ gnupg-agent \ software-properties-common --yes RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - RUN apt-key fingerprint 0EBFCD88 RUN add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" RUN apt update && apt-get install docker-ce docker-ce-cli containerd.io --yes ENV TZ Asia/Tokyo ENV LANG ja_JP.UTF-8 RUN useradd runner -m && echo runner:secret | chpasswd USER runner WORKDIR /home/runner RUN mkdir actions-runner && cd actions-runner RUN curl -O -L https://github.com/actions/runner/releases/download/v2.275.1/actions-runner-linux-x64-2.275.1.tar.gz RUN tar xzf ./actions-runner-linux-x64-2.275.1.tar.gz USER root RUN ./bin/installdependencies.sh RUN gpasswd -a runner sudo && gpasswd -a runner docker
一応、docker-compose.yml でコンテナを起動出来るようにしています。
version: '3.7' services: self-host: build: context: . dockerfile: Dockerfile volumes: - /var/run/docker.sock:/var/run/docker.sock tty: true
以下のようにコンテナを起動します。
$ docker-compose build
$ docker-compose up -d
そして、Docker on Docker を実現する為、以下のコマンドを実行します。
$ docker-compose exec self-host sh -c 'chgrp docker /var/run/docker.sock'
Runner のセットアップ
以下のように実行して、Github リポジトリとの連携を設定します。
docker-compose exec --user runner self-host sh -c 'cd $WORKDIR && ./config.sh --url https://github.com/${ORG_NAME}/${REPO_NAME} --token ${TOKEN}'
実行すると、以下のように、いくつかの質問に答える必要があります。
-------------------------------------------------------------------------------- | ____ _ _ _ _ _ _ _ _ | | / ___(_) |_| | | |_ _| |__ / \ ___| |_(_) ___ _ __ ___ | | | | _| | __| |_| | | | | '_ \ / _ \ / __| __| |/ _ \| '_ \/ __| | | | |_| | | |_| _ | |_| | |_) | / ___ \ (__| |_| | (_) | | | \__ \ | | \____|_|\__|_| |_|\__,_|_.__/ /_/ \_\___|\__|_|\___/|_| |_|___/ | | | | Self-hosted runner registration | | | -------------------------------------------------------------------------------- # Authentication √ Connected to GitHub # Runner Registration Enter the name of runner: [press Enter for a0c4fc82adb6] docker-self-host This runner will have the following labels: 'self-hosted', 'Linux', 'X64' Enter any additional labels (ex. label-1,label-2): [press Enter to skip] √ Runner successfully added √ Runner connection is good # Runner settings Enter name of work folder: [press Enter for _work] √ Settings Saved.
リポジトリ側の設定をみると、以下のように連携した Runner が追加されていました。
self-hosted runners の起動
後は以下のように実行して Runner を起動します。
$ docker-compose exec --user runner self-host sh -c 'cd $WORKDIR && ./run.sh'
以下のように出力されます。
√ Connected to GitHub
2020-12-22 15:04:29Z: Listening for Jobs
リポジトリ側の設定をみると、以下のように連携した Runner の状態が Idle
状態になりました。
Runner を使ったジョブの実行
Actions YAML
以下のような Actions YAML (この呼び方が正しいか不明) を書きました。
name: sandbox on: push: branches: - 'master' - 'main' jobs: sandbox: runs-on: self-hosted env: S3_TARGET_BUCKET: ${{ secrets.S3_TARGET_BUCKET }} steps: - name: Checkout uses: actions/checkout@v2 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN }} aws-region: ap-northeast-1 role-duration-seconds: 900 - name: Test1 run: | cat /etc/lsb-release - name: Test2 run: | docker build -t test1 . - name: Test3 run: | aws --version
肝は runs-on: self-hosted
です。というか、これだけで変えられるのは簡単ですね。
実行結果
リポジトリに push してしばらくすると、以下のように Runner のログが出力されました。
2020-12-22 15:10:26Z: Running job: sandbox 2020-12-22 15:10:42Z: Job sandbox completed with result: Succeeded
リポジトリの Actions ジョブの結果も以下のように正常に終了していました。
良い感じですね!
以上
GitHub Actions の自己ホストランナーを手元の MacBook Pro 上の Docker Desktop で試してみました。思ったよりも簡単で驚いています。
引き続き、深堀りしていこうかなと思います。