
普段は GitHub Actions の GitHub ホステッドランナー (GitHub-hosted runners) を使うことが多くて,たまーに AWS CodeBuild ホステッドランナー (AWS CodeBuild-hosted runners) を使うこともある.そう言えば Amazon EC2 インスタンスを使ってセルフホステッドランナー (Self-hosted runners) を動かしたことがないな〜と思って,勉強のために試してみることにした❗️
セルフホステッドランナーの詳細は以下の公式ドキュメントにまとまっている.
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 をポチポチして進めることはできるけど,今回は「ラベル」として ec2 と t3.micro を追加することにした.デフォルトのラベルとして self-hosted と Linux と X64 が付いていて,ランナーが増えたときに詳細にフィルタリングできる.
$ ./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 の詳細は以下の公式ドキュメントにまとまっている.
準備 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)"