GitHubActionsのGitHubホステッドからセルフホステッドランナーに変更してみた
目次[非表示]
こちらの記事はDIVXアドベントカレンダー2023の16日目の記事です。
はじめに
こんにちは。DIVXでエンジニアをしております、大久保と申します。
今回の記事はGitHubActionsのGitHubのホステッドランナーを、セルフホステッドランナーに変更した時のことを記事にしてみました。
GithubActionsとは
GitHub Actions は、ビルド、テスト、デプロイのパイプラインを自動化できる継続的インテグレーションと継続的デリバリー (CI/CD) のプラットフォームです。
リポジトリに対してpull request をビルドしてテストしたり、マージされた pull request を環境毎にデプロイしたりするワークフローを作成できます。
GitHubActionsではGitHubで用意されているGitHubホステッドランナーを使用するか、自前でEC2などを用意する、セルフホステッドランナーの2種類があります。
GitHubホステッドランナーとは
・システムの管理とメンテナンスはGitHubによって行われます。
・各ジョブの実行時には、いつでもクリーンなインスタンスが提供されます。
・このサービスはGitHubプランに含まれる無料分を利用し、無料分を超えた場合には分単位の課金が適用されます。
セルフホステッドランナーとは
・既存のクラウドサービスやローカルマシンを使用して、料金を支払うことなくセルフホステッドランナーを設置できます。
・ハードウェア、オペレーティングシステム、ソフトウェア、セキュリティの要件に合わせてシステムをカスタマイズすることが可能です。
・GitHubが用意している仮想サーバーとアプリの互換性がなくなったり、より厳密にカスタムを行う場合などに使用します。
実際にGithubActionsを変更していきます
前提として
・元々GitHubActionsのワークフローを作成が済んでいる
・EC2などのサーバーに必要な環境構築が済んでいる
まずGitHubのリポジトリ/Settings/Actions/Runnersの順に遷移してNew self-hosted runnerをクリックして新規作成します。
1. Runner imageをmacOS、Linux、Windowsの中から選択します。
今回はLinuxを選択しました。
2. Architectureをx64、ARM、ARM64の中から選択します。
今回はx64を選択しました。
ここから実際にEC2のサーバーに接続して、コマンドを入力していきます。
actions-runnerフォルダを作成して、ディレクトリを変更します。
curlコマンドを使用して GitHub Actions ランナーの特定バージョン(2.311.0)の tar.gz 圧縮ファイルをダウンロードします。
SHA-256 チェックサムを検証するために使用するコマンドで、ファイルが正しくダウンロードされ、ファイルが変更されていないことを確認しています。
ファイルが解凍され、その中に含まれるファイルが現在のディレクトリに展開されます。
セルフホステッドランナーの初期設定を行い、リポジトリに登録するための認証トークンが発行されます。
これでリポジトリにランナーが作成されました。
ここからは任意で追加していきます。
ランナーのグループを設定するか聞かれますが、今回はDefaultにしておきます。
ランナーの名前は、デフォルトではIPアドレスで登録されるので、任意の名前を設定します。
ラベルを貼り付けておくと、後々ランナーの管理が楽になります。
最後にフォルダ名を変更するか聞かれていますが、特に問題ないのでここもデフォルトにしておきます。
ランナーを起動します。これで実際に動くようになりました。
最後に元々作成していたワークフローのruns-on: をGitHubホステッドからセルフホステッドに変更します。先ほどラベルを設定していれば、ここでラベルが付与されたランナーを指定することができます。
修正前
修正後
セルフホステッドランナーの設定は以上になります。
下記のサンプルコードはmainブランチにプッシュされたことをトリガーに、デプロイをするGitHubActionsのワークフローです。
セルフホステッドランナーを使用時に考慮するべき点
・EC2をワークフローの開始と同時に起動させる。
・EC2をワークフローの終了と同時に停止させる。
・Dockerを使用しているのでコンテナ、イメージなどをリフレッシュする。
・GitHub Actions Runnerの自動起動。
EC2をワークフローの開始と同時に起動させる
EC2は主にインスタンスが起動している時間に基づいて課金されますので、CI/CDを使用しない場合は停止させています。
停止しているEC2を開始させるワークフローを作成します。
インスタンスを開始するワークフローのランナーはGitHubホステッドのランナーにします。
IAMには開始のみの権限を与えて該当ののインスタンスを開始させます。
EC2をワークフローの終了と同時に停止させる
次にワークフローの終了をトリガーにEC2を停止させます。
同じ要領でワークフローを作成します。デプロイワークフローのキャンセル、失敗、成功のアクションに対してトリガーさせます。
Dockerコンテナ、イメージなどをリフレッシュする
ECSを使用している場合は、毎回ECRからイメージをpullして作り直したりするので、ストレージ容量が不足してしまいます。Dockerを使用している場合は、下記をワークフローに追加します。
GitHub Actions Runnerの自動起動
ランナーはactions-runnerディレクトリでrun.shコマンドを打つことによって起動されます。毎回コマンドを入力するワークフローを作成してもいいのですが、今回はSystemdを利用したGitHub Actions Runnerの自動起動をさせます。
Systemdとは
Systemdは、Linuxの初期化システムとして広く採用されているツールキットです。システムの起動や停止、サービスの管理、デーモンの実行など、システム全体の管理を行うことができます。Systemdは、サービスやタスクをユニットとして管理し、これによりシステムの動作を柔軟に制御することができます。
Systemdサービスファイルの作成
/etc/systemd/system/ ディレクトリに actions-runner.service という名前でサービスファイルを作成します。
以下の内容をファイルに記述します。
Systemdでサービスを管理するためには、サービスファイル(.serviceファイル)を作成する必要があります。このファイルには、サービスの動作や依存関係などの情報を記述します。
サービスが何らかの理由で終了した場合の再起動の動作、サービスが終了した場合に常に再起動します。
まとめ
今回はGitHubActionsのGitHubのホステッドランナーを、セルフホステッドランナーに変更した時のことを記事にしてみました。
考慮する点やどんなサービスを使用するかはそのプロジェクトによって異なると思いますが、少しでも皆様のためになる記事になっていたら幸いです。最後まで御覧いただきありがとうございました。
divxでは一緒に働ける仲間を募集しています。
興味があるかたはぜひ採用ページを御覧ください。