[GitHub]ActionsのホストランナーをEC2でやってみた

Actionsの利用可能時間を気にせずに使えるセルフホスト設定をEC2で実際に試してみました。利用費的にも事前に超過することが判っている場合にはおすすめです、
2020.04.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

GitHub ActionsのWorkflow利用可能時間枠は比較的多めだと思われますが、複数人で使う場合にはやはり上限が気になってきます。

利用枠を上限まで使い切ると動作が止まり、追加時間を購入することで再度動作可能となります。ただ、Workflow毎の実行ベース等読みにくい事も多々あり、足すべき枠の計算は困難だと思います。

Actionsはセルフホストの場合に利用可能時間枠の制限がありません。セルフホスト環境はクラウド環境でも可能です。利用時間が共有されないことと、使いすぎた分はAWS利用費で個々に跳ね返ってくるため分かりやすいこともあり、EC2でのセルフホスト設定を手順作成含めて試してみることにしました。

自分のランナーをホストする - GitHub ヘルプ

EC2インスタンスの設定

管理コンソール上で行っていきます。

Amazon Linuxの無料利用枠対象で問題ありません。

キーペアは新規作成にて「github_actions_runner_test」としておきます。ダウンロードしてインスタンスの作成にて完了です。

作成後に、EC2のパブリックDNSとセキュリティグループ名を控えておきます。

セキュリティグループ設定

SSH接続のために、セキュリティグループの更新を行います。

export publicdns=PUBLIC_DNS
export groupname=SECURITY_GROUPNAME
export groupid=$(aws ec2 describe-security-groups --group-names=$groupname | jq -r '.SecurityGroups[].GroupId')
export selfcidr=$(curl ifconfig.moe)
aws ec2 authorize-security-group-ingress --group-id $groupid --protocol tcp --port 22 --cidr ${selfcidr}/32
aws ec2 describe-security-groups --group-names=$groupname | jq -r ".SecurityGroups[].IpPermissions[].IpRanges[].CidrIp"
echo "check: ${selfcidr}/32"
>  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
    100    15  100    15    0     0    405      0 --:--:-- --:--:-- --:--:--   405
>  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
    100    15  100    15    0     0    384      0 --:--:-- --:--:-- --:--:--   394
> 0.0.0.0/0
> XXX.XXX.XXX.XXX/32
> check: XXX.XXX.XXX.XXX/32

出力されるIPアドレスに、checkとして出力しているIPアドレスが含まれているか確認します。

GitHubホストランナーの設定

リポジトリのSettingsタブから、左側「Actions」を選択して、新規ホストランナー追加を行います。

インスタンスにログイン後、ポップアップに表示されたコマンドを実行していきます。途中求められる入力はそのままEnterで問題ありません。

% ssh ec2-user@$publicdns -i /path/to/github_actions_runner_test.pem
The authenticity of host 'ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com (XXX.XXX.XXX.XXX)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com,XXX.XXX.XXX.XXX' (ECDSA) to the list of known hosts.
   __|  __|_  )
   _|  (     /   Amazon Linux AMI
  ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
% mkdir actions-runner && cd actions-runner
% curl -O -L https://github.com/actions/runner/releases/download/v2.168.0/actions-runner-linux-x64-2.168.0.tar.gz
% tar xzf ./actions-runner-linux-x64-2.168.0.tar.gz
% ./config.sh --url http://github.com/USER/REPO_NAME --token XXXXXXXXXXXXXXXXXXXXX
--------------------------------------------------------------------------------
|        ____ _ _   _   _       _          _        _   _                      |
|       / ___(_) |_| | | |_   _| |__      / \   ___| |_(_) ___  _ __  ___      |
|      | |  _| | __| |_| | | | | '_ \    / _ \ / __| __| |/ _ \| '_ \/ __|     |
|      | |_| | | |_|  _  | |_| | |_) |  / ___ \ (__| |_| | (_) | | | \__ \     |
|       \____|_|\__|_| |_|\__,_|_.__/  /_/   \_\___|\__|_|\___/|_| |_|___/     |
|                                                                              |
|                       Self-hosted runner registration                        |
|                                                                              |
--------------------------------------------------------------------------------
# Authentication

√ Connected to GitHub

# Runner Registration

Enter the name of runner: [press Enter for ip-XXX-XXX-XXX-XXX]

√ Runner successfully added

√ Runner connection is good

# Runner settings

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

√ Settings Saved.

% ./run.sh

√ Connected to GitHub

2020-04-04 01:32:25Z: Listening for Jobs

ブラウザ上のホストランナー一覧にも追加されました。

Workflowを実施する

Workflowの動作環境指定を変更します。

 jobs:
   comment:
-    runs-on: ubuntu-latest
+    runs-on: self-hosted

次にWorkflowが実行されるコミットを行います。

2020-04-04 01:32:25Z: Listening for Jobs
2020-04-04 01:38:08Z: Running job: comment
2020-04-04 01:38:18Z: Job comment completed with result: Failed

こけました。しかし何も分かりません。ブラウザからActionsのログを見てみます。

  git checkout -b test origin/test
    >> /bin/sh: git: コマンドが見つかりません

どうやら詳細はブラウザ側を見ないと分からないようです。run.shを止めてgitを入れます。

% sudo yum -y install git
% ./run.sh

そして再度コミットします。

2020-04-04 01:41:05Z: Listening for Jobs
2020-04-04 01:43:31Z: Running job: comment
2020-04-04 01:43:42Z: Job comment completed with result: Succeeded

上手くいったようです。

あとがき

ややこしい手順になるかと思っていましたが、予想外に手軽に出来ました。

ホストランナーには以下のようなメリットがあります。

  • 標準のランナーに入っていないライブラリを入れやすい
  • 実行環境のスペックを上げやすい
  • 利用可能時間枠上限を気にしないで済む

virtual-environments/Ubuntu1804-README.md at master · actions/virtual-environments

利用費については

t2.micro
$0.0116 per hour
ActionsのLinux環境超過枠
$0.008 per minute ($0.48 per hour)

となります。プライベートリポジトリでの実行にて時間超過する事が判っていれば、長時間必要とするWorkflow向けにホストランナーでの設営を行うことでコストを抑えられる可能性があります。

コスト節約しつつの堅実なCICDを実施するための参考になれば幸いです。