GitHub ActionsでSelf-Hosted-Runnerを試す

Git
この記事は約13分で読めます。
記事内に広告が含まれています。

GitHub Actionsの実行環境(Runner)として自前のサーバ(Self Hosted)を指定することが可能です。本記事では次の内容をご紹介していきます。

こんな感じの構成。
  • 任意リポジトリのRunnerとしてEC2を登録する。
  • ActionsはSelf-hosted-runnerで実行してみる。

以下、目次となります。

Self hosted runnersの概要

公式サイトの概要は次の通りです。

セルフホステッド ランナーの概要 - GitHub Docs
独自のランナーをホストして、GitHub Actionsワークフロー中でジョブの実行に使われる環境をカスタマイズできます。

★ポイントは次の通りです。

  • 対象サーバにエージェントのインストールが必要です。
  • 対象サーバ → 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”」等を記載して回避しました。
Organizationレベル

OrganizationがあればOrganizationレベルでSelf-Hostedを設定することが出来ます。
つまり、Organization配下の各リポジトリから同一のSelf-Hostedを利用することが出来ます。けど並列動作は出来ないため、たくさん要求がある場合はたくさん待たされることになります。

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分動作させた場合のコストを比較してみます。

前提条件
  • Self Hostedの場合、GitHub側でコストは発生しません。
  • Self HostedはAWSのEC2でt3a.medium(2CPU, 4GB Memory)の東京リージョンとします。
    ※ 2024年時点で1時間辺りの動作は$0.049でした。
  • GitHub Hostedは最小構成の場合で1分辺り0.008$です。
  • 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というのがあります。

より大きなランナーの概要 - GitHub Docs
GitHub には、より多くの RAM、CPU、ディスク領域を備えたランナーが用意されています。
Large Runner
  • OrganizationやEnterpriseで作成が出来る。
  • 大きなリソース。
  • StaticなIPアドレスが利用できる(Windows, Linux)

→ Large Runnerであれば、StaticなIPアドレスになるので、外部アクセス時に少し扱いやすいのかもしれませんね。

まとめ

本記事ではActions@Runner(自前ホスト)を試した際の内容を整理してお届けしました。

  • 疎通は思ったより簡単でした。
    → AgentsがGitHub.comに対して通信してくれます。
  • 自前のサーバ環境があれば選択肢になりえます。

最後までご覧いただきありがとうございました。

コメント

Top
タイトルとURLをコピーしました