弊社ではGitHub Actionsの登場以前からCI/CDを行っていることもあり、CI環境としてはCircleCIが標準となっています。とはいえ開発の中心はやはりGitHubであり、GitHub上で自己完結できるという点において、GitHub Actionsの優位性は見逃せません。
今まで筆者は「CircleCIでやってたこの機能は、GitHub Actionsではどうやるんだろう?」といった視点で、都度検索することが多かったのですが、そういうやり方では知識が横方向に広がらないのですよね。もしかしたらもっと便利な機能があったり、やってはいけないアンチパターンがあるかもしれないのに、ピンポイントに検索していると、そういう気づきが得にくいのです。
なので場当たり的にググるのではなく、どのような技術であっても、一度は体系的に学んでおく必要があるというのが筆者の考え方です。そんな用途にぴったりな書籍が、技術評論社から発刊されました。
今回はこの「GitHub CI/CD実践ガイド 持続可能なソフトウェア開発を支えるGitHub Actionsの設計と運用」を読んだ感想をまとめます。
目次を以下に引用します。本書は大きく「基礎編」「実践編」「応用編」の3部に分かれており、全部で18の章が存在します。
[基礎編]第1章 ソフトウェア開発とGitHub第2章 GitHub Actionsの基礎概念第3章 ワークフロー構文の基礎第4章 継続的インテグレーションの実践第5章 運用しやすいワークフローの設計第6章 アクションによるモジュール化[実践編]第7章 クリーンなリポジトリの維持第8章 Dependabotによる依存関係バージョンアップ第9章 GitHub Releasesによるリリース自動化第10章 GitHub Packagesによるパッケージ管理第11章 OpenID Connectによるセキュアなクラウド連携第12章 コンテナオーケストレーションのデプロイメント第13章 アクションのオープンソース化[応用編]第14章 GitHub Actionsの高度な使い方第15章 GitHub Actionsのセキュリティ第16章 セキュリティのシフトレフト第17章 GitHub Appsトークンによるクロスリポジトリアクセス第18章 継続的デリバリーの実践
以下では各章の内容を簡単に紹介します。
この章は前フリです。CI/CDの概念やGitHubの説明、GitHubのCLIクライアントのインストールといった内容が、非常にライトに解説されています。
GitHub Actionsの基本的な概念を解説しています。ワークフローの構成、基本的な構文、実行環境、実行方法、エラー時の対応などが含まれます。GitHub Actionsってなに? という人は、まずここから読みましょう。
ワークフローに登場する様々な構文を解説しています。コンテキスト、環境変数、VariablesとSecrets、演算子や条件分岐などです。どれもワークフローの実装において必須となるため、きちんと理解しておきましょう。
基本的なテストと静的解析をGitHub Actionsで実装し、これを通してCIの基礎を学ぶ章です。CIそのものの運用プラクティスについても解説されています。「ワークフローの基礎は知ってるけれど、具体的に何をしたらいいかわからない」という人は、この章をしっかり読んでみましょう。
デバッグ、レポート、通知といった、より使いやすいワークフローの設計について解説しています。またジョブの実行順序、Environmentsによる環境の切り替え、Matrixによる並列実行、ジョブ間のデータ共有などについても触れています。
GitHub Actionsでは「アクション」によってジョブをモジュール化し、再利用を可能にしています。この章ではローカルアクションの実装を通して、アクションの基礎を学びます。
ソフトウェアを壊さないためには、リリースブランチをいかにして守るかということが大事です。この章ではGitHub Actionsではなく、GitHubのブランチプロテクションルールといった、Gitのリポジトリを守る方法を解説しています。
ソフトウェアが自己完結していることは少なく、大抵はなんらかのライブラリやフレームワークに依存しています。こうした依存関係を管理し、バージョンアップに追従していくのは、思った以上に面倒な作業です。この章は依存関係の管理をサポートするDependabotについて解説しています。
CIによるビルドやテストが完了したら、いよいよリリースです。この章ではGitHub Releasesを使って、リリースを自動化する方法について解説しています。GitHub Releasesでは、プルリクエストを元にリリースノートを自動生成することもできます。
ビルドした成果物は、なんらかの「パッケージ」として配布することも多いでしょう。そしてパッケージを配布するには、パッケージマネージャーが参照できるレジストリサーバーが必要です。そしてGitHubにはパッケージレジストリとしてGitHub Packagesというサービスが用意されています。この章ではコンテナイメージをビルドし、GitHub Packagesで自動リリースする手順を解説します。
CI/CDシステムはクラウドプロバイダをはじめとする、様々なサービスに接続する必要があります。またその性質上、本番環境を構築(あるいは削除)できるほどの権限を持つことも珍しくありません。そのため長期間に渡って利用できる、静的なクレデンシャルを払い出すのは大きなセキュリティリスクとなります。そこで使い捨てが可能な、一時的なクレデンシャルを都度払い出すのが定石となっています。この章ではOIDCを使ってGitHub ActionsとAWSを接続する方法を解説します。
ここまでで解説された内容を元に、AWSのECSに対してコンテナの自動デプロイ方法を解説しています。またEnvironmentsを利用して環境を切り替え、複数のECSクラスターへのデプロイを実現する方法も紹介しています。
実践編の最後は、自作のアクションをオープンソースとして、GitHub Marketplaceで公開する方法を紹介しています。ワークフロー内で、誰かが公開しているサードパーティ制のアクションを利用することも多いと思います。もしも便利なアクションを内製したら、それを公開してみるのもよいのではないでしょうか。それが世界中の誰かを助けることになるかもしれません。
ここからは応用編として、より高度な内容に踏み込んでいきます。この章ではワークフロー全体をカプセル化して再利用可能にする、Reusable Workflowsについて解説しています。
現代的なソフトウェア開発において、セキュリティは避けて通れない話題です。この章ではセキュリティの設計原則をはじめ、アタックサーフェスを最小化するためにはどのような機能を利用すればよいか、GitHubの具体的な設定についても言及しています。
テストやセキュリティ対策は、ソフトウェアが完成する目処が立ってから、ようやく重い腰を上げて実施するケースが多く見られます。ですがそれでは手遅れで、こうしたタスクは開発の初期段階から、継続的に行うべきです。そこで最近では「シフトレフト」の考え方が広まってきました。これはタスクの開始時期を、線表のもっと左側に移すという意味です。この章ではセキュリティ向上への取り組み方を解説しています。
通常GitHub Actionsのワークフローは、そのワークフローが起動されたリポジトリにしかアクセスできません。もちろん個人アカウントに登録したSSH鍵などを使えば、そのユーザーの権限で他のリポジトリを読み書きすることは可能ですが、これはアンチパターンです。そこでこの章ではGitHub Appsを作成し、そのトークンを利用して、他のリポジトリへ横断的にアクセスする方法を解説しています。
継続的デリバリーとは、ソフトウェアを常にリリース可能な状態に保つことです。ここまでやってきたCIは、CDを実現するためのいちプロセスだと言ってもいいでしょう。この章では本書のまとめとして、継続的デリバリーに必要な観点をまとめています。
GitHub Actionsに限らず、こうしたサービスは動かすだけであれば簡単です。ちょっとググれば目的は達成できるでしょう。ですが場当たり的に知識をつまみ食いしているだけでは、ベストプラクティス、あるいはアンチパターン、セキュリティに付随する情報といったものまで知識を広げるのは、なかなか難しいのではないでしょうか。
本書はGitHub Actionsに入門するだけでなく、CI/CDの基礎や考え方を学ぶという意味でも、おすすめできるガイドブックだと感じました。

引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。