GitHub Actions の料金体系について調べてみた

# 概要
この記事は、GitHub Actions の料金体系についての調査記事になります。今後、仕事で使う可能性もあることから、正確性を担保するため、公式ドキュメントからの引用が多めです。

結論のみ知りたい方は、[こちらへ](#結論)

# Github Actions とは
公式ドキュメントによると GitHub Actions の説明は以下の通りです。
> GitHub Actions は、ビルド、テスト、デプロイのパイプラインを自動化できる継続的インテグレーションと継続的デリバリー (CI/CD) のプラットフォームです。 リポジトリに対するすべての pull request をビルドしてテストしたり、マージされた pull request を運用環境にデプロイしたりするワークフローを作成できます。

自分の言葉で言い直しますと、 GitHub Actions とは、リポジトリへのプルリクやマージなどのイベントをきっかけにビルド、テスト、デプロイ等の CI/CD を行うプラットフォームサービスの事と言えそうです。

# 完全に無料になる場合について
料金についてドキュメントでは以下のようにあります。
> GitHub Actions の使用は、パブリック リポジトリの標準の GitHub ホステッド ランナーとセルフホステッド ランナーの場合は無料です。プライベート リポジトリでは、GitHub ホステッド ランナーでの使用を対象として、GitHub アカウントで使用されている製品に応じた無料の使用時間 (分) とストレージが各アカウントに付与されます。 含まれる量を超える使用は、使用制限によって制御されます。

無料になる場合として、パブリック リポジトリの標準の GitHub ホステッド ランナーとセルフホステッド ランナーが紹介されていますが、GitHub ホステッドランナーとセルフホステッドランナーとは何でしょう？  

ランナーについては、公式サイトで説明がありました。
> ランナーは、GitHub Actions ワークフローでジョブを実行するマシンです。

つまり、GitHub ホステッドランナーは、GitHub Actions ワークフローのジョブを GitHub 上で実行するマシンのことですね。このランナーを使う場合、パブリックリポジトリであれば無料とされています。

一方でセルフホステッドランナーとはなんでしょう。こちらもドキュメントを見ます。
> セルフホステッド ランナーとは、GitHub.com の GitHub Actions からジョブを実行するためにデプロイおよび管理するシステムです。  セルフホステッド ランナーを使用すると、ハードウェア、オペレーティング システム、ソフトウェア ツールを、GitHub ホステッド ランナーよりも細かく制御できます。 セルフホステッド ランナーを使用すると、大規模なジョブを実行するための処理能力やメモリのニーズを満たすカスタム ハードウェア構成の作成、ローカル ネットワークで利用可能なソフトウェアのインストール、GitHub ホステッド ランナーで提供されていないオペレーティング システムの選択が行えます。 セルフホステッド ランナーは、物理または仮想にでき、コンテナー内、オンプレミス、またはクラウドに配置できます。

やや長いので要約しますと、セルフホステッドランナーとは、GitHub Actions からジョブを実行するためのデプロイおよび管理するシステムである。GitHub ホステッドランナーと比較すると、ジョブの実行環境、例えば、OS、ハードウェア、ソフトウェアを細かく設定できる。また、GitHub 以外の場所、例えば、コンテナ、オンプレ、クラウドに設置できる。と、説明されています。

続けて読みますと、次のようにあります。

> ランナーマシンは、GitHub Actionsのセルフホストランナーアプリケーションを使ってGitHubに接続します。

> 以下の要求を満たしていれば、いかなるマシンもセルフホストランナーとして利用できます。  
・ マシン上にセルフホストランナーアプリケーションをあなたがインストールして実行できること。  
・そのマシンがGitHub Actionsと通信できる。  
・そのマシンが、実行しようとしている種類のワークフローに対して十分なハードウェアリソースを持っていること。 セルフホストランナーアプリケーションそのものは、最小限のリソースしか必要としません。  
・Dockerコンテナアクションあるいはサービスコンテナを使うワークフローを実行したいなら、Linuxのマシンを使い、Dockerがインストールされていなければなりません。

簡潔に言い直しますと、セルフホステッドランナーとは、GitHub Acitions との通信環境を整えた自前のワークフロー実行環境と言えそうです。このランナーの場合、料金が無料ですが、その理由はワークフロー実行のためのリソースを自分たちで用意しているからでしょうね。

# Private なリポジトリにおける無料枠について
Private なリポジトリが GitHub ホステッドランナーにジョブを実行してもらう場合について、ドキュメントでは以下のように記載されています。

> GitHub アカウントで使用されている製品に応じた無料の使用時間 (分) とストレージが各アカウントに付与されます。 含まれる量を超える使用は、使用制限によって制御されます。

> 月ごとの請求のお客様の場合、アカウントには既定の使用制限として 0 米ドル (USD) が設定されます。これにより、プライベート リポジトリで、そのアカウントに含まれる容量を超える追加の時間 (分) やストレージが使われるのを防ぐことができます。 アカウントを請求書で支払っている場合、そのアカウントの既定の使用制限は無制限となります。時間 (分) は毎月リセットされますが、ストレージはリセットされません。

アカウントプラン毎の無料枠
|製品|Storage|分 (月あたり)|
|-|-|-|
|GitHub Free|500 MB|2,000|
|GitHub Pro|1 GB|3,000|
|組織の GitHub Free|500 MB|2,000|
|GitHub Team|2 GB|3,000|
|GitHub Enterprise Cloud|50GB|50,000|

無料枠については使用時間と Storage という概念があるので、別々に見ていきましょう。

### 使用時間とその無料枠について
使用時間とは、Job の実行時間を指しているのでしょう。何度か検証用のプログラムで実験しましたが、job の実行毎に計測されていました。画像では3分8秒となります。
![スクリーンショット 2023-01-23 10.45.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117450/e923b61e-2264-d029-0972-e46940afbdb2.png)

そして、ドキュメントによれば Private なリポジトリであっても、一定の範囲内で無料枠があると記載されています。例として Pro アカウントをとると、無料枠として 3000分/月 の無料枠が与えられています。そして、無料枠は毎月リセットされるとあります。
月ごとの請求の場合、初期設定として、$0 の使用制限が設定されているため、勝手に課金となることはなさそうです。
請求書支払いの場合、既定の使用制限が無制限になっているので注意が必要ですね。

ちなみに現在の利用状況は、アカウントのSetting > Access > Billing and plans の Actions と Storage for Actions and Package から確認できました。先ほどの job の実行時間も Included minutes に加算されていくようです。
![スクリーンショット 2023-01-23 10.29.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117450/b6d56435-811a-ec4a-ebaa-12b0b053f99d.png)

利用時間が何であるかとその無料枠について分かりましたが、読み進めますと、GitHub がホストするランナーマシンについて次の記載があります。
> GitHubがホストするWindows及びmacOSのランナー上で実行されるジョブは、Linuxのランナー上のジョブの消費に対して2倍及び10倍の分を消費します。 たとえば、Windows で 1,000 分使用すると、アカウントに含まれている 2,000 分が消費されます。 macOS で 1,000 分使用すると、アカウントに含まれている 10,000 分が消費されます。

|オペレーティング システム|分の倍率|
|-|-|
|Linux|1|
|macOS|10|
|Windows|2|

どうやら GitHub ホステッドランナーの場合、ジョブの実行環境として Linux、Windows、macOS が選べるようです。そして、OS毎に利用時間に対する倍率が設定されています。Linux と Windows の倍率はわかりますが、macOS だけ 10 倍 とやたらに高いです。

### Storage とその無料領域について
さて、Storage とは何を指しているのでしょう。
ドキュメントには、ワークフローの成果物(artifacts)について次の記述があります。
> 成果物を使えば、ジョブの完了後にデータを永続化でき、そのデータを同じワークフロー中の他のジョブと共有できます。 成果物とは、ワークフロー実行中に生成されるファイル、またはファイルのコレクションです。

> 成果物の保存には、GitHub上のストレージ領域が使われます。 GitHub Actions の使用は、パブリック リポジトリの標準の GitHub ホステッド ランナーとセルフホステッド ランナーの場合は無料です。 プライベート リポジトリでは、GitHub ホステッド ランナーでの使用を対象として、GitHub アカウントで使用されている製品に応じた無料の使用時間 (分) とストレージが各アカウントに付与されます。 含まれる量を超える使用は、使用制限によって制御されます。

> 時間 (分) は毎月リセットされますが、ストレージはリセットされません。

ドキュメントによれば、GitHub 上の Storage は、成果物 (artifacts) の保存に使用される領域のようです。そして、成果物とは、ワークフロー実行中に生成されるファイル、またはファイルのコレクションとあります。また、一般的な成果物として次のものが挙げられています。
> ・ログファイルとコアダンプ  
・テスト結果、エラー、スクリーンショット  
・バイナリあるいは圧縮されたファイル  
・ストレステストのパフォーマンス出力およびコードカバレッジの結果

テストする場合には、ログやテスト結果等を出力する場合もあるでしょうから、Storage を使いそうです。
また、GitHub は、action として、ダウンロードやアップロードの action を用意しているので、これらの使い方次第で、Storage の利用量が大きくなるでしょう。
[actions/download-artifact](https://github.com/actions/download-artifact)
[actions/upload-artifact](https://github.com/actions/upload-artifact)

Pro アカウントを例にとると、1GB 分が無料領域として与えられ、こちら毎月リセットされないとあるので注意が必要です。

# Private なリポジトリにおける課金について
ここから有料分の話になります。使用時間にしろ Storage にしろ、月払いで $0 の料金制限を掛けているかぎり無料ですが、そうでない場合、無料枠を使い切った後に課金されていきます。

こちらも使用時間と Storage に分けて説明していきます
### 使用時間と課金について

GitHub ホステッドランナーでジョブが実行される場合、次のように示されています。
> オペレーティング システムに応じた使用量を分単位で支払うことになります。 GitHub は、各ジョブが使った分と分未満をもっとも近い分に切り上げます。

|オペレーティング システム|コア|分あたりの料金 (米ドル)|
|-|-|-|
|Linux|2|$0.008|
|macOS|3|$0.08|
|Windows|2|$0.016|

試しに計算してみましょう。無料枠を使い切ったと仮定し、ワークフローにジョブが 5 つ設定され、一つのジョブの実行時間が 10 分だとします。このワークフローが毎日一度実行された場合、月の料金はいくらか？  
計算式は次の通りです。ひと月は 30 日とし、Linux で実行したとします。
```
5 * 10 * 30 = 1500 (分)
1500 * 0.008 = 12 ($)
```
$12 となりました。一応、GitHub 提供の計算ツールを用いて確認しましたが、同一の値になりました。同じく、ひと月 30 日で計算しているようです。
[GitHub 計算ツール](https://github.com/pricing/calculator?feature=actions)

### Storage と課金について
Storage についてドキュメントでは以下のようにあります。

> リポジトリが使用するストレージは、GitHub Actionsの成果物とGitHub Packagesの消費の合計のストレージです。 ストレージのコストは、お客様のアカウントで所有しているすべてのリポジトリの合計使用量です。 

> アカウントによる使用がこれらの制限を超え、使用制限を 0 米国ドルより上に設定している場合、日ごとにストレージの GB あたり 0.008 米国ドル

GitHub Actions の成果物 (Artifacts) のほか、GitHub Packages の使用量を合計し、日毎に $0.008/GB かかるようです。GithHub Packages は、ソフトウェアパッケージのホスティングサービスとのことですが、今回のテーマからは少し外れるので置いておきます。

他のサービスについて詳しくないので高いのか安いのか判断しづらいですが、月毎のリセットがないので、こまめに不要な成果物（Artifacts）を削除していくのが良いように思います。

# 結論
* パブリックリポジトリかつ GitHub 上のマシンにジョブを実行させる場合、無料です。また、プライベートリポジトリでも自前でジョブの実行環境を用意する場合、無料です。
* プライベートリポジトリで GitHub 上のマシンにジョブを実行させる場合でも、アカウントに応じて無料枠があります。無料枠を使い切っても、月払いかつ初期設定の場合、有料課金されることはありません。
* 無料枠分の使用時間は、月毎に使用時間がリセットされます。
* 請求書払いの場合、既定だと使用制限が掛かっていないので注意が必要です。

# 参考文献
* [GitHub Actions を理解する](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions)
* [GitHub Actions の課金について](https://docs.github.com/ja/billing/managing-billing-for-github-actions/about-billing-for-github-actions)
* [GitHub ホステッドランナーの概要](https://docs.github.com/ja/enterprise-cloud@latest/actions/using-github-hosted-runners/about-github-hosted-runners)
* [セルフホステッドランナーの概要](https://docs.github.com/ja/enterprise-cloud@latest/actions/hosting-your-own-runners/about-self-hosted-runners)
* [GitHub Actions の使用状況の表示](https://docs.github.com/ja/billing/managing-billing-for-github-actions/viewing-your-github-actions-usage)
* [ワークフロー データを成果物として保存する](https://docs.github.com/ja/actions/using-workflows/storing-workflow-data-as-artifacts)