GitHub Actionsの特徴と使いみち
少し話が逸れますが、GitHubは2017年にGitHub Appsという機能を発表しました。この機能によって、GitHubと連携して特定のタスクを自動化したりGitHubを便利にしてくれるアプリケーションを、ユーザが自由に作成したり配布したりできるようになりました。GitHubとの連携を実現するには様々な選択肢があるのですが、その中でも最も汎用性が高い方法です。
では、GitHub ActionsはGitHub Appsとどのように違うのでしょうか。この章ではGitHub Actionsの特徴や、GitHub Appsとの使い分けついて説明します。
GitHub Actionsの使用例
GitHub Appsは高機能なアプリケーションを作成するためのフレームワークとも言えますが、アプリケーションを作成したり運用するにはある程度の準備が必要になります。一方、GitHub ActionsはDockerファイルを書くだけで始められ、実行はGitHubのインフラ上で行う点が異なります。そのため、GitHub Appsと比べるとより小〜中規模のタスク実行に向いています。例えば
- 新しく作成されたIssueは全て自動的に特定のGitHub Projectsに追加したい
- プッシュの度にJavaScriptのLintを実行したい
- ソフトウェアをリリースしたら、リリースノートを作成してSendGrid経由でメールを送信したい
- Orgに新しいメンバーが追加されたら、HRのリポジトリにオンボーディング用のIssueを作成したい
といったタスクです。これらは一見、一般的なCI/CD(継続的インテグレーション/デリバリー)ツールでもできることに見えますが、GitHub Actionsは様々な点でこういったCIツールと異なります。主な違いをひとつずつ見ていきましょう。
ステップのモジュール化
1つ目の違いは、ステップのモジュール化です。Workflowの各ステップ(=Action)は独立したDockerコンテナ内で実行されます。つまりActionは一つのモジュールとして分離でき、Action単位でGitHubに公開したり、公開されているActionを組み合わせてWorkflowを構築したりできます。
GitHubとの深い連携
上述したように、WorkflowはGitHub上の様々なイベントをトリガーにできます。一般的なCIツールではpush
イベント以外のイベント検知に一手間必要になる場合が多いのですが、GitHub Actionsではより簡単です。さらに、Action実行時のコンテナ内にはデフォルトでリポジトリのデータがマウントされているので、コードに対してテストやビルドを実行するためにソースコードをダウンロードする必要がありません。これも大きな違いです。
また、リポジトリ毎に専用のGitHub Tokenが発行され、自動的に環境変数に登録される点も、GitHub Actionsの特徴です。これによって、Tokenの値をコピー&ペーストしたりすることなく、Action内でGitHub APIを安全かつ簡単に実行できます。
重い処理の実行には向いていない
今後GitHub Actionsがどのように進化するか未知数ですが、現時点ではGitHub Actions用に提供されるコンテナ実行環境は下記の通りコンパクトで、重い処理の実行には向いていません。
したがって、そういったケースでは従来のCI/CDツールが有効です。GitHub Actionsはそういったツールとも連携可能なので、自動化したい処理の内容に応じて、適切なWorkflowを構築するのが重要です。
Botツールとの違い
GitHub上のイベントをきっかけとした自動化と言えば、ProbotなどのオープンソースのBotフレームワークの利用も考えられます。こういったBotツールとGitHub Actionsの大きな違いは、前述したようにそのBotを運用するサーバを用意しなくていいという点です。ActionはGitHubのインフラ上で実行されるので、インフラについて考える必要はありません。また、Probotの場合JavaScriptで処理を記述する必要がありますが、GitHub Actionsの場合はDockerコンテナなので、任意の言語で開発できる点も異なります。
ただし、単にGitHub上のイベントに反応するだけではなく、なんらかのデータを永続的に蓄積したいなど、より高機能なアプリケーションを作成したい場合はGitHub ActionsではなくGitHub Appsが必要になるので、こうしたBotフレームワークを使ったほうが良いでしょう。
つまり、GitHub Actionsは各種CI/CDツールやBotフレームワークと競合するものではなく、むしろ補完関係にあるのです。