とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど

開催予定の勉強会

読者登録と各種SNSのフォローもよろしくお願いいたします。

「GitHub CI/CD実践ガイド」を読んで、GitHub Actionsを始めよう

弊社ではGitHub Actionsの登場以前からCI/CDを行っていることもあり、CI環境としてはCircleCIが標準となっています。とはいえ開発の中心はやはりGitHubであり、GitHub上で自己完結できるという点において、GitHub Actionsの優位性は見逃せません。

今まで筆者は「CircleCIでやってたこの機能は、GitHub Actionsではどうやるんだろう?」といった視点で、都度検索することが多かったのですが、そういうやり方では知識が横方向に広がらないのですよね。もしかしたらもっと便利な機能があったり、やってはいけないアンチパターンがあるかもしれないのに、ピンポイントに検索していると、そういう気づきが得にくいのです。

なので場当たり的にググるのではなく、どのような技術であっても、一度は体系的に学んでおく必要があるというのが筆者の考え方です。そんな用途にぴったりな書籍が、技術評論社から発刊されました。

gihyo.jp

今回はこの「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章 継続的デリバリーの実践

以下では各章の内容を簡単に紹介します。

基礎編

第1章 ソフトウェア開発とGitHub

この章は前フリです。CI/CDの概念やGitHubの説明、GitHubのCLIクライアントのインストールといった内容が、非常にライトに解説されています。

第2章 GitHub Actionsの基礎概念

GitHub Actionsの基本的な概念を解説しています。ワークフローの構成、基本的な構文、実行環境、実行方法、エラー時の対応などが含まれます。GitHub Actionsってなに? という人は、まずここから読みましょう。

第3章 ワークフロー構文の基礎

ワークフローに登場する様々な構文を解説しています。コンテキスト、環境変数、VariablesとSecrets、演算子や条件分岐などです。どれもワークフローの実装において必須となるため、きちんと理解しておきましょう。

第4章 継続的インテグレーションの実践

基本的なテストと静的解析をGitHub Actionsで実装し、これを通してCIの基礎を学ぶ章です。CIそのものの運用プラクティスについても解説されています。「ワークフローの基礎は知ってるけれど、具体的に何をしたらいいかわからない」という人は、この章をしっかり読んでみましょう。

第5章 運用しやすいワークフローの設計

デバッグ、レポート、通知といった、より使いやすいワークフローの設計について解説しています。またジョブの実行順序、Environmentsによる環境の切り替え、Matrixによる並列実行、ジョブ間のデータ共有などについても触れています。

第6章 アクションによるモジュール化

GitHub Actionsでは「アクション」によってジョブをモジュール化し、再利用を可能にしています。この章ではローカルアクションの実装を通して、アクションの基礎を学びます。

実践編

第7章 クリーンなリポジトリの維持

ソフトウェアを壊さないためには、リリースブランチをいかにして守るかということが大事です。この章ではGitHub Actionsではなく、GitHubのブランチプロテクションルールといった、Gitのリポジトリを守る方法を解説しています。

第8章 Dependabotによる依存関係バージョンアップ

ソフトウェアが自己完結していることは少なく、大抵はなんらかのライブラリやフレームワークに依存しています。こうした依存関係を管理し、バージョンアップに追従していくのは、思った以上に面倒な作業です。この章は依存関係の管理をサポートするDependabotについて解説しています。

第9章 GitHub Releasesによるリリース自動化

CIによるビルドやテストが完了したら、いよいよリリースです。この章ではGitHub Releasesを使って、リリースを自動化する方法について解説しています。GitHub Releasesでは、プルリクエストを元にリリースノートを自動生成することもできます。

第10章 GitHub Packagesによるパッケージ管理

ビルドした成果物は、なんらかの「パッケージ」として配布することも多いでしょう。そしてパッケージを配布するには、パッケージマネージャーが参照できるレジストリサーバーが必要です。そしてGitHubにはパッケージレジストリとしてGitHub Packagesというサービスが用意されています。この章ではコンテナイメージをビルドし、GitHub Packagesで自動リリースする手順を解説します。

第11章 OpenID Connectによるセキュアなクラウド連携

CI/CDシステムはクラウドプロバイダをはじめとする、様々なサービスに接続する必要があります。またその性質上、本番環境を構築(あるいは削除)できるほどの権限を持つことも珍しくありません。そのため長期間に渡って利用できる、静的なクレデンシャルを払い出すのは大きなセキュリティリスクとなります。そこで使い捨てが可能な、一時的なクレデンシャルを都度払い出すのが定石となっています。この章ではOIDCを使ってGitHub ActionsとAWSを接続する方法を解説します。

第12章 コンテナオーケストレーションのデプロイメント

ここまでで解説された内容を元に、AWSのECSに対してコンテナの自動デプロイ方法を解説しています。またEnvironmentsを利用して環境を切り替え、複数のECSクラスターへのデプロイを実現する方法も紹介しています。

第13章 アクションのオープンソース化

実践編の最後は、自作のアクションをオープンソースとして、GitHub Marketplaceで公開する方法を紹介しています。ワークフロー内で、誰かが公開しているサードパーティ制のアクションを利用することも多いと思います。もしも便利なアクションを内製したら、それを公開してみるのもよいのではないでしょうか。それが世界中の誰かを助けることになるかもしれません。

応用編

第14章 GitHub Actionsの高度な使い方

ここからは応用編として、より高度な内容に踏み込んでいきます。この章ではワークフロー全体をカプセル化して再利用可能にする、Reusable Workflowsについて解説しています。

第15章 GitHub Actionsのセキュリティ

現代的なソフトウェア開発において、セキュリティは避けて通れない話題です。この章ではセキュリティの設計原則をはじめ、アタックサーフェスを最小化するためにはどのような機能を利用すればよいか、GitHubの具体的な設定についても言及しています。

第16章 セキュリティのシフトレフト

テストやセキュリティ対策は、ソフトウェアが完成する目処が立ってから、ようやく重い腰を上げて実施するケースが多く見られます。ですがそれでは手遅れで、こうしたタスクは開発の初期段階から、継続的に行うべきです。そこで最近では「シフトレフト」の考え方が広まってきました。これはタスクの開始時期を、線表のもっと左側に移すという意味です。この章ではセキュリティ向上への取り組み方を解説しています。

第17章 GitHub Appsトークンによるクロスリポジトリアクセス

通常GitHub Actionsのワークフローは、そのワークフローが起動されたリポジトリにしかアクセスできません。もちろん個人アカウントに登録したSSH鍵などを使えば、そのユーザーの権限で他のリポジトリを読み書きすることは可能ですが、これはアンチパターンです。そこでこの章ではGitHub Appsを作成し、そのトークンを利用して、他のリポジトリへ横断的にアクセスする方法を解説しています。

第18章 継続的デリバリーの実践

継続的デリバリーとは、ソフトウェアを常にリリース可能な状態に保つことです。ここまでやってきたCIは、CDを実現するためのいちプロセスだと言ってもいいでしょう。この章では本書のまとめとして、継続的デリバリーに必要な観点をまとめています。

まとめ

GitHub Actionsに限らず、こうしたサービスは動かすだけであれば簡単です。ちょっとググれば目的は達成できるでしょう。ですが場当たり的に知識をつまみ食いしているだけでは、ベストプラクティス、あるいはアンチパターン、セキュリティに付随する情報といったものまで知識を広げるのは、なかなか難しいのではないでしょうか。

本書はGitHub Actionsに入門するだけでなく、CI/CDの基礎や考え方を学ぶという意味でも、おすすめできるガイドブックだと感じました。