GitHub Actionsの実行環境(Runner)として自前のサーバ(Self Hosted)を指定することが可能です。本記事では次の内容をご紹介していきます。
- 任意リポジトリのRunnerとしてEC2を登録する。
- ActionsはSelf-hosted-runnerで実行してみる。
以下、目次となります。
Self hosted runnersの概要
公式サイトの概要は次の通りです。
★ポイントは次の通りです。
- 対象サーバにエージェントのインストールが必要です。
- 対象サーバ → GitHub.comへの通信が必要です。
※ステートフルな通信設定であれば「アウトバンド」通信さえ許容していればOKです。
Runnerに自前のサーバを登録する
リポジトリ管理者権限(Admin)であれば設定可能です。
Settings → Actions → Runners → New self-hosted runnerと進みます。
↓
エージェントのインストール手順等が表示されました。この手順に沿って作業を進めていきます。
※以下、手順抜粋(一部伏せてます)。
# Create a folder
mkdir actions-runner && cd actions-runner
# Download the latest runner package
curl -o actions-runner-linux-x64-2.304.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.304.0/actions-runner-linux-x64-2.304.0.tar.gz
# Optional: Validate the hash
echo "292e8770bdeafca135c2c06cd5426f9dda49a775568f45fcc25cc2b576afc12f actions-runner-linux-x64-2.304.0.tar.gz" | shasum -a 256 -c
# Extract the installer
tar xzf ./actions-runner-linux-x64-2.304.0.tar.gz
# Create the runner and start the configuration experience
./config.sh --url https://github.com/xxxxx --token A7535LL4FAVxxxxxxxxxxxxxxxxxx
# Last step, run it!
./run.sh
ところで今回のRunnerは、AWSのAmazon Linux2を対象としました。
※標準で「shasum」は入っていないため必要なら「yum install -y perl-Digest-SHA」でインストール可能でした。
プロキシは・・・?
必要に応じて設定しよう。
例えば「/etc/prifile」にプロキシサーバのURLを指定すればRunnerエージェントはちゃんと見てくれました。
# 必要なら「/etc/profile」に以下を追記 (proxy,portは適宜置換)
export http_proxy="http://proxy:port/"
export https_proxy="https://proxy:port/"
以下、エージェントダウンロード~実行までのログです(うまくいきました)。
[ec2-user@ip-X-X-X-X ~]$ mkdir actions-runner && cd actions-runner
[ec2-user@ip-X-X-X-X actions-runner]$ curl -o actions-runner-linux-x64-2.304.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.304.0/actions-runner-linux-x64-2.304.0.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 137M 100 137M 0 0 1867k 0 0:01:15 0:01:15 --:--:-- 2282k
[ec2-user@ip-X-X-X-X actions-runner]$ echo "292e8770bdeafca135c2c06cd5426f9dda49a775568f45fcc25cc2b576afc12f actions-runner-linux-x64-2.304.0.tar.gz" | shasum -a 256 -c
actions-runner-linux-x64-2.304.0.tar.gz: OK
[ec2-user@ip-X-X-X-X actions-runner]$ tar xzf ./actions-runner-linux-x64-2.304.0.tar.gz
[ec2-user@ip-X-X-X-X actions-runner]$ ./config.sh --url https://github.com/XXXX --token A7535LL4FAV6XXXXXXXXX
--------------------------------------------------------------------------------
| ____ _ _ _ _ _ _ _ _ |
| / ___(_) |_| | | |_ _| |__ / \ ___| |_(_) ___ _ __ ___ |
| | | _| | __| |_| | | | | '_ \ / _ \ / __| __| |/ _ \| '_ \/ __| |
| | |_| | | |_| _ | |_| | |_) | / ___ \ (__| |_| | (_) | | | \__ \ |
| \____|_|\__|_| |_|\__,_|_.__/ /_/ \_\___|\__|_|\___/|_| |_|___/ |
| |
| Self-hosted runner registration |
| |
--------------------------------------------------------------------------------
# Authentication
Using V2 flow: False
√ 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-X-X-X-X] ABC
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.
[ec2-user@ip-X-X-X-X actions-runner]$ ./run.sh
√ Connected to GitHub
Current runner version: '2.304.0'
2023-06-02 02:11:29Z: Listening for Jobs
うまく通信出来たようです。
早速、GitHub側のRunnersを見ると、ホストが認識されていました。
以下、補足事項です。
- 最初、rootで実行しようとしたら「Must not run with sudo」と怒られました。ここでは、Amazon Linux2のデフォルトユーザ「ec2-user」で試してました。
- エージェントが動作していない場合は「OFFLINE」となります。ジョブ実行中は「Active」でした。
- run.shを停止するとエージェントは終了します。
同梱されたsvc.shを使えばサービスとして登録することが出来、その場合はバックグラウンドに常駐します。
※ただし、プロキシ経由で疎通出来なかったため、サービスファイルに直接「Environment=”HTTP_PROXY=http://proxy:port”」等を記載して回避しました。
Actionsを動かしてみる
早速、Actionsを先ほど登録したRunner(自前ホスト)で動作させてみます。
Actionsの設定ファイルは次の通りです。
name: self-hosted-test
on:
push:
branches: [ "main" ]
jobs:
hello:
runs-on: [self-hosted]
steps:
- uses: actions/checkout@v3
- run: pwd
- run: ls -l
- run: python main.py
- リポジトリ内には「main.py」ファイルがあって、中身は「print(“hello world”)」です。
- steps配下ではリポジトリ内容をチェックアウトして、pythonを実行します(pwd等はお試しで記載した内容で特に意味はないです)。
この状態でmainブランチに何かしらファイルをpushすると動作します。以下がサーバのコンソールログです(サービス常駐の場合は別途ログ出力されます)。
2023-06-06 02:22:48Z: Running job: hello
2023-06-06 02:22:59Z: Job hello completed with result: Succeeded
GitHub上のAction結果は次の通りでした。
Pythonが実行され「hello world」が出力されています!
ところで、タグの指定を変更すれば、ブランチ毎に違うランナーで動かすことも出来ます(振り分けることが出来る)。
runs-on: [self-hosted, label1]
Actionsはこの条件に一致したRunnerで実行されます。
その他
制限
◇公式サイトからの抜粋となりますが、使用状況の制限は次の通りです。
- 最大実行時間は35日です。
- キューの有効時間は24時間です。
→ 実行中の時に再Actionsが発生するとキューに登録されます。実行中のジョブが終わらないとキャンセルされるということ。 - API実行数は1時間で1000まで。
など。
◇Self-Hostedの場合、並列実行は出来ません。
→ 複数のトリガが発生した場合はキューに積まれて、順次実行されます(有効は24時間)。
→ GitHub-Hostedの場合は、GitHub上で次々とコンテナが立ち上がるため、並列実行が可能です。
コスト比較(vs GitHub hosted)
60分動作させた場合のコストを比較してみます。
- GitHub Hosted Runner:0.008$*60分=0.48$/時間
- Self Hosted Runner:0.049$/時間
コンピュータの実行時間だけ(ストレージコストは除いている)比較すれば、「Self Hosted Runner」のほうが、だいぶお安いです。約10倍の差でしょうか。
GitHub hostedの場合は結構高いんだねぇ。。
Privateリポジトリでちょこちょこっと動かす程度であれば、無償枠で収まるでしょう。長期的に使うのであれば、self hosted runnerのほうが、コスト的なメリットは大きいです。
通信関係
通信関係で気になることがあったため書いておきます。
◇Self-hostedであれば、自前の他サーバと通信させることも出来ます。
→ 色々なサーバと連携させながら、何か処理させるには良さそうです。
◇一方のGitHub Hostedでは、PublicのIPアドレスは実行の度に異なります(そして非常に幅広いレンジ)。
→ 仮にGitHub HostedからPublicな通信をさせたい場合は、非常に幅広いIPレンジを許容しないとだめ。
◇ところで、GitHub Hostedでは、Large Runnerというのがあります。
→ Large Runnerであれば、StaticなIPアドレスになるので、外部アクセス時に少し扱いやすいのかもしれませんね。
まとめ
本記事ではActions@Runner(自前ホスト)を試した際の内容を整理してお届けしました。
- 疎通は思ったより簡単でした。
→ AgentsがGitHub.comに対して通信してくれます。 - 自前のサーバ環境があれば選択肢になりえます。
最後までご覧いただきありがとうございました。
コメント