kakakakakku blog

Weekly Tech Blog: Keep Learning!

EC2 インスタンスで GitHub Actions のセルフホステッドランナーを動かす

普段は GitHub Actions の GitHub ホステッドランナー (GitHub-hosted runners) を使うことが多くて,たまーに AWS CodeBuild ホステッドランナー (AWS CodeBuild-hosted runners) を使うこともある.そう言えば Amazon EC2 インスタンスを使ってセルフホステッドランナー (Self-hosted runners) を動かしたことがないな〜と思って,勉強のために試してみることにした❗️

セルフホステッドランナーの詳細は以下の公式ドキュメントにまとまっている.

docs.github.com

Amazon EC2 インスタンスを構築する

今回は Terraform でセルフホステッドランナーとして使う Amazon EC2 インスタンスを構築する.あくまで検証用なのでインスタンスタイプは小さく t3.micro にして,IAM Role(IAM インスタンスプロファイル)なども既にあるものをベタ書きで指定した.ちなみにセキュリティグループに関してはインバウンドを許可する必要はなく,GitHub Actions に「内 → 外」でアクセスするためのアウトバウンドを許可しておけば OK👌

data "aws_ami" "al2023" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["al2023-ami-*-x86_64"]
  }
}

resource "aws_instance" "runner" {
  ami                    = data.aws_ami.al2023.id
  instance_type          = "t3.micro"
  iam_instance_profile   = "xxxxx"
  vpc_security_group_ids = [aws_security_group.runner.id]

  tags = {
    Name = "self-hosted-runner"
  }
}

resource "aws_security_group" "runner" {
  name = "self-hosted-runner"

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

セットアップ

Amazon EC2 インスタンスに AWS Systems Manager Session Manager で接続してセルフホステッドランナーのセットアップを進める.基本的には GitHub リポジトリの Settings > Actions > Runners > New self-hosted runner に表示されるコマンドを使えば OK👌

まず,Amazon Linux 2023 だと一部のパッケージが不足していてコマンドがエラーになるため以下をインストールしておく.

$ sudo yum install perl-Digest-SHA
$ sudo yum install libicu

次にランナーをダウンロードする.

$ mkdir actions-runner && cd actions-runner
$ curl -o actions-runner-linux-x64-2.333.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.333.1/actions-runner-linux-x64-2.333.1.tar.gz
$ echo "18f8f68ed1892854ff2ab1bab4fcaa2f5abeedc98093b6cb13638991725cab74  actions-runner-linux-x64-2.333.1.tar.gz" | shasum -a 256 -c
$ tar xzf ./actions-runner-linux-x64-2.333.1.tar.gz

そしてランナーを登録する.特に入力せずに Enter をポチポチして進めることはできるけど,今回は「ラベル」として ec2t3.micro を追加することにした.デフォルトのラベルとして self-hostedLinuxX64 が付いていて,ランナーが増えたときに詳細にフィルタリングできる.

$ ./config.sh --url https://github.com/kakakakakku/sandbox-github-actions-ec2-self-hosted-runner --token xxx

--------------------------------------------------------------------------------
|        ____ _ _   _   _       _          _        _   _                      |
|       / ___(_) |_| | | |_   _| |__      / \   ___| |_(_) ___  _ __  ___      |
|      | |  _| | __| |_| | | | | '_ \    / _ \ / __| __| |/ _ \| '_ \/ __|     |
|      | |_| | | |_|  _  | |_| | |_) |  / ___ \ (__| |_| | (_) | | | \__ \     |
|       \____|_|\__|_| |_|\__,_|_.__/  /_/   \_\___|\__|_|\___/|_| |_|___/     |
|                                                                              |
|                       Self-hosted runner registration                        |
|                                                                              |
--------------------------------------------------------------------------------

# Authentication


√ Connected to GitHub

# Runner Registration

Enter the name of the runner group to add this runner to: [press Enter for Default]

Enter the name of runner: [press Enter for ip-172-31-28-58]

This runner will have the following labels: 'self-hosted', 'Linux', 'X64'
Enter any additional labels (ex. label-1,label-2): [press Enter to skip] ec2,t3.micro

√ Runner successfully added

# Runner settings

Enter name of work folder: [press Enter for _work]

√ Settings Saved.

最後はランナーを起動する.手順だとフォアグラウンドで実行する run.sh を実行するようになっているけど,今回はバックグラウンドで実行するため svc.sh を実行する.

$ sudo ./svc.sh install
$ sudo ./svc.sh start
$ sudo ./svc.sh status

svc.sh の詳細は以下の公式ドキュメントにまとまっている.

docs.github.com

準備 OK \( 'ω')/

GitHub Actions ワークフローを実行する

セルフホステッドランナーで GitHub Actions ワークフローを動かす場合は runs-on: self-hosted のように指定すれば OK👌

name: hello-self-hosted-runner

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  hello:
    runs-on: self-hosted
    steps:
      - run: echo 'Hello Self-Hosted Runner!'
      - run: echo "$(cat /etc/os-release | grep PRETTY_NAME)"

GitHub Actions ワークフローを実行して,期待通りにセルフホステッドランナーで動いていることを確認できた❗️

ランナーに追加で設定したラベルでフィルタリングをする場合は runs-on: [self-hosted, linux, ec2, t3.micro] のように指定すれば OK👌

name: hello-self-hosted-runner

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  hello:
    runs-on: [self-hosted, linux, ec2, t3.micro]
    steps:
      - run: echo 'Hello Self-Hosted Runner!'
      - run: echo "$(cat /etc/os-release | grep PRETTY_NAME)"

関連記事

kakakakakku.hatenablog.com