ようへいの日々精進XP

よかろうもん

GitHub Actions の自己ホストランナーを手元の MacBook Pro 上の Docker Desktop で試す

この記事は

YAMAP エンジニア Advent Calendar 2020 の 22 日目になる予定です。

qiita.com

頑張るぞ。

tl;dr

いよいよブログに書けそうなネタが尽きてきたので、試してみた色強めのネタを書かせて頂きます。

かねてより気になっていた、Github Actions の自己ホストランナーを手元の MacBook Pro 上の Docker Desktop を利用して試してみました。

docs.github.com

自己ホストランナー

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 をクリックして開始します。

f:id:inokara:20201223002632p:plain

以下のようにエージェントのダウンロードとインストール、リポジトリとの連携までのステップが記載されたページが表示されます。

f:id:inokara:20201223002657p:plain

おお、めっちゃ簡単。

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 が追加されていました。

f:id:inokara:20201223002856p:plain

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 状態になりました。

f:id:inokara:20201223002916p:plain

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 ジョブの結果も以下のように正常に終了していました。

f:id:inokara:20201223002934p:plain

良い感じですね!

以上

GitHub Actions の自己ホストランナーを手元の MacBook Pro 上の Docker Desktop で試してみました。思ったよりも簡単で驚いています。

引き続き、深堀りしていこうかなと思います。

参考

docs.github.com

nju33.com

techblog.exawizards.com