GitHubの有償版と無償版の機能比較


## はじめに
プライベートなコミュニティでSWの構成管理にGitHubを検討していますが可能な限りお金をかけずに済ませたいので、有償版と無償版の機能比較をしてどちらのプランにするかを検討しました。<br>なお、内容は記事投稿時点のものとなります。<br>また、有償版の機能についてはGitHub Docsから読み取った内容ですが、実際に有償版を使用したわけではないため、間違いがあれば指摘いただけますと幸いです。

---
## 目次
* [GitHub](#GitHub)
* [プラン別の機能比較](#プラン別の機能比較)
* [Protected Branches(保護されたブランチ)](#protected-branches保護されたブランチ)
* [やりたいことが無償版でできるか検証](#やりたいことが無償版でできるか検証)
* [結論](#結論)

---
## GitHub
言わずと知れたソースコードをホスティングするサービスです。<br>名前の通りgitの仕組みを利用しておりWebサービスであるためインターネットにさえつながればどこからでもソースコードを見ることができます。<br>アカウントプランには有償版と無償版がありますが、無償版でも様々な機能が使用できるためプライベートな開発や自主学習として活用できます。

----
## プラン別の機能比較
GitHubの公式サイトやGitHub Docsから主要な機能を抜粋して比較しました。
|機能|詳細|無償版|有償版|
|---|----|-----|-----|
|リポジトリ作成|GitHub.comで誰でもアクセスできるパブリックリポジトリと許可されたユーザーにしかアクセス権を与えないプライベートリポジトリがある|パブリック/プライベートともに無制限|パブリック/プライベートともに無制限|
|GitHub Actionsを用いたCI/CDの利用|ビルド、テスト、デプロイなどのパイプラインを自動化できる<br>CI/CDツールのGitHub Actionsを利用できる|プライベート:2,000分/月<br>パブリック:無制限|プライベート:3,000分/月<br>パブリック:無制限|
|GitHub Packagesの利用|GitHub Packagesはコンテナや依存関係を含むSWパッケージをホスティングして管理するサービス<br>GitHub Actionsと組み合わせてCDを実現できる|プライベート:500MBまで利用可<br>パブリック:無制限で利用可|プライベート:2GBまで利用可<br>パブリック:無制限で利用可|
|Protected Branches|[Protected Branches](#protected-branches保護されたブランチ)に別途記載|利用不可|利用可|
|Multiple Pull Request Assignees|複数のユーザーまたはTeamをPull Requestの担当者にアサインできる|プライベート:1人のみ設定可<br>※ 現状無償版でも複数設定できている…<br>パブリック:最大10人まで設定可|プライベート/パブリックともに<br>最大10人まで設定可|
|Multiple Pull Request Reviewers|複数のユーザーまたはTeamにPull Requestのレビューをリクエストできる|プライベート:1人のみ設定可<br>※ 現状無償版でも複数リクエストができている…<br>パブリック:無制限に設定可|プライベート/パブリックともに<br>無制限で設定可|
|Code Owners|所有するコードに変更が加えられた場合、設定したオーナーによるレビューや承認を自動で要求する<br>オーターの所有コードはファイル単位で設定できる|利用不可|利用可|
|Pages and Wikis|プロジェクトのためのドキュメントや簡単な静的Webページをwiki形式で公開できる|利用不可|利用可|
|Merge PR automatically|必要なすべてのレビューが完了し、全てのステータスチェックがPassするなど、Protected Branchesで設定した保護ルールを満たした場合に自動的にマージがおこなわれる|利用不可|利用可|

----
## Protected Branches(保護されたブランチ)
個人で利用する分には特に意識する必要はないと思いますが、複数人で開発を行う場合はこちらのProtected Branchesはそれなりにプラン選定において重要なポイントとなってくると思います。<br>この機能で設定可能な保護ルールについてまとめました。
|設定|説明|
|---|-----|
|Require pull request reviews before merging|Pull Requestに対して指定数以上の承認レビューがないとマージができないよう制限をかける<br>また、Code Ownersの機能と組み合わせて、コードの所有者の承認を必須にすることもできる|
|Require status checks before merging|事前に設定したCIを全てPassした場合だけマージを実施する|
|Require conversation resolution bfore mergint|Pull Requestの全てのコメントが解決されないとマージを実施できない|
|Require signed commits|署名されたコミットでないとマージを実施できない|
|Require liner history|マージには元のバージョンに戻しやすいようにスカッシュマージかリベースマージのみ用可能にする|
|Require merge queue|Pull Requestマージキューに登録すると、Pull Requestが必要なブランチ保護のチェックに合格すると自動的にマージをおこなう<br> ※ パブリックリポジトリのみの限定的なベータ版機能|
|Require deployments to succeed before merging|指定した環境へのデプロイが成功した場合だけマージを実施する|
|Lock Branch|ブランチをロックする<br>ロックするとブランチに対してコミットをおこなうことができなくなる|
|Do not allow bypassing the above setting|リポジトリの管理者権限を持つユーザーとカスタムロールで「ブランチ保護をバイパスする」権限を持つユーザーは前述の各ブランチ保護ルールの制限はデフォルトで受けないが、<br>この設定を有効にすることで制限を適用させることができる|
|Restrict who can push to matching brances|リポジトリがGitHub TeamやGitHub Enterprise Cloudを使用する組織に所有されている場合にブランチ制限を有効にできる<br>ブランチ制限すると権限を与えられたユーザー、チーム、アプリしかブランチへのプッシュができなくなる|
|Allow force pushes|デフォルトでは保護されたすべてのブランチは強制プッシュをブロックするが、本設定で強制プッシュを許可できる<br>また、許可できるグループはいかの2つから選択できる<br>　- 管理者権限を持つユーザーを含めリポジトリへの書き込み権限を持つすべてのユーザー<br>  　- 特定の人またはチーム|
|Allow deletions|デフォルトでは保護されたブランチは削除できないが、この設定をすると書き込み権限を持つ全てのユーザーがブランチを削除できるようになる|

----
## やりたいことが無償版でできるか検証
上記のプラン比較をもとに今回やりたかったことが無償版でどこまでできるかを確認してみました。
|やりたかったこと|無償版での可否|備考|
|---|:---:|---|
|コミュニティメンバだけを公開範囲とした運用|〇|プライベートリポジトリが無制限で使用できる|
|CI/CDパイプラインでビルドやテストの自動化をしたい|〇|2,000分/月も使用できれば十分|
|複数の人をPull Requestのレビュアーに設定したい|×だけど？|使用上は無償版では1人しか設定できないはずだが、無償版を試してみたところ2人設定できている<br>(3人以上は未検証)|
|Pull Requestの必須レビュアーのレビューが完了したら自動でマージしたい|×|離れたロケーションで、各自のタイミングで開発を行っていくため欲しい機能だったが当面は運用でカバーする|
|リポジトリ内でドキュメントをwiki形式で管理したい|×|MDwikiなど代替案を検討する|

---
## 結論
今回の検証をもとに我々のコミュニティでは『無償版』を選択することにしました。<br>この選定結果はあくまでも我々のやりたいことに照らし合わせた結果となります。<br>上記の調査内容が皆さんのお役に立てれば幸いです。

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

<br>

---
## 参考文献
[GitHub-プラン](https://github.co.jp/pricing)  
[GitHub Docs](https://docs.github.com/en)  
[Githubの無料プラン(Free)と有料プラン(Pro)を比較](https://ryohidaka.jp/blogs/compare-github-plans)  
[GitHubリポジトリにおけるレビュープロセスの統制](https://engineering.mercari.com/blog/entry/20211213-8f5f5a5aee/)