muku.のプロフィール
CircleCI実践入門のトップ画像

「CircleCI実践入門」読了。DevOps入門者にもおすすめ。

2020.9.20

2020年9月14日にCircleCI実践入門が発売されました。 これまでCircleCIについて書籍としてちゃんとまとめられたものってなかったのではないでしょうか。

早速購入し、読了したので、この本を読んでよかった点・学んだ点をまとめました。

CircleCIの本の画像

目次

1章. なぜCI/CDが必要か

この章ではまず「アジャイル・DevOpsという考え方とはどんなものか、導入することの意義は何か」から始まり、なぜCI/CDが生まれたのか、どのような役割を果たすのか、が解説されています。言葉の定義もしっかりと書かれているのでそれぞれの言葉の意味わからなかった場合でもこの章を読めば一通り理解できます。


2章.CircleCIの基本

2章ではCircleCIの実際のジョブの開始から完了までのフローについてと、用語や仕組みの解説がされています。またYAMLの3種類のデータ表現であるリスト(配列)・マップ(連想配列、ハッシュ)・スカラを始めとした基本的なシンタックスについても言及されています。とても丁寧に説明されていて分かり易かいです。


3章.環境構築

3章はGitHubとの連携方法についての記述です。クラウド環境での実行・ローカル環境での実行それぞれについて解説されています。ここで初めてCircleCI CLIをインストールして$cirlceci config validate(設定ファイルの文法エラーチェック)と$circleci local execute(ローカルでジョブ実行)しました。

実行スキップ、再実行、キャンセル、SSHデバッグ(githubアカウントのsshキーを利用して、実行ジョブのコンテナにsshログインしてデバッグを行う機能)の方法などもまとめられています。


4章.ワークフローでジョブを組み合わせる

ここではCircleCIでの重要な概念であり、ジョブの組み合わせと実行順序を定めたルールであるワークフローについて書かれています。 また、ジョブが利用できるファイルストレージであるワークスペースによるジョブ間のファイルの共有方法について学びます。ワークスペース使用時にはpersist_to_workspaceで永続化するファイルやディレクトリを宣言し、attach_workspaceでジョブからワークスペースへアタッチすることがわかりました。 その他ワークフローを実行したいコミットタグやブランチを指定するフィルタリングやクーロンジョブ(定期実行するジョブ)の方法などが紹介されています。

ジョブ間で再利用できる実行環境を設定可能なexecutorsキー・ステップを再利用できるように設定可能なcommandsキーにも言及しています。


5章.実践的な活用方法

この章ではまずAdvancedSettings、ブランチプロテクション、CircleCIChecksによる各種詳細設定について解説されています。その後は環境変数の利用方法、通知とsshキーの活用方法についてまとめてられています。


6章.テストの基本と最適化

6章では「JestによるTypeScriptのテスト例」「Rspecによるデータベースを伴うRubyのテスト例」「Cypressというテストツールを使用したE2Eテスト例」が記載されています。 これまでの解説によって、ymlファイルを見ることで何を行っているのかある程度理解できました。

後半ではCI実行速度の改善をいかに行うかが解説されています。 具体的な方法としては、 ・複数ジョブを同時実行させること ・キャッシュを活用すること(ファイルキャッシュ&Dockerイメージキャッシュ) ・必要なツール、設定を下準備済みのカスタムDockerイメージを用意、利用すること ・ジョブ内でも並列実行を行うこと(有料プランでのみ可能) ・リソースクラスを変更すること(有料プランでのみ可能) があることがわかりました。このうち最も単純で効果的なのはキャッシュ活用です。

またテスト結果を理解しやすい形で表示するテストサマリーの利用についても紹介されています。テスト数が増加した時もログを見やすく、確認の漏れの防止に役立ちます。


7章.継続的デプロイの実践

7章は継続的デプロイについてです。 CDには継続的デプロイと継続的デリバリの2種類の意味で使用されますが、その違いが解説されています。 ・継続的デプロイ = CI(コードプッシュ+テスト)をパスしたのち、本番環境へ全ての変更が自動でデプロイされる。 ・継続的デリバリ = CIをパスしたのち、コードをいつでも本番環境へデプロイ可能な状態にしておく。デプロイ自体は人が行う。

継続的デプロイを行うと、 ・Test in Production(本番環境でのテスト)が可能となり、本番環境の依存状態も含め、バグを探し出すことができること ・変更を常に本番環境へリリースするためフィードバックループを構築できること などのメリットがあることが理解できました。

途中、デプロイとリリースの違いも解説されており、リリースエンジニアリングの重要性を理解できました。 継続的デプロイとフィーチャーフラグ(アプリケーションの機能の段階的なリリースを可能にする仕組み)を併用することでそれが可能となります。 継続的デプロイの実践例としてOrbsを使用したAmazonECSへのデプロイ例が記載されていました。


8章.Webアプリケーション開発、インフラでの活用

ここでは以下のサンプルごとにCI/CDの活用方法が紹介されていました。 ・TypeScript ・Ruby ・PHP ・Java ・Docker ・Terraform

Dockerのサンプルではsetup_remote_dockerというステップを宣言することによってプライマリコンテナからアクセス可能となり、ステップ使用の宣言なしにdockerコマンドが使用できることがわかりました。

Terraformのサンプルでは、terraformの出力結果をgithubやslackへ通知するtfnotifyの使用方法、Terraform plan、applyの実行、State(リソースの現在の状態)の競合問題を回避するためのState Lockingについて解説されています。


9章.モバイルアプリ開発での活用

ここでは章題の通りモバイルアプリ開発における活用例をAndroid、iOSに分けて解説されています。 僕はモバイルアプリ開発の予定はなかったので(1度はやってみたいですが)、この章は一旦飛ばしました。


10章.デスクトップ/ネイティブアプリ開発での活用

こちらも9章と同様です。 内容としては、Windows、クラスプラットフォーム、Unityについて言及していました。


11章.様々なタスクの自動化

11章では ・Webサイトのリリース自動化 ・バーションごとのリリースタスクの自動化 ・依存モジュールのセキュリティチェックの自動化 ・脆弱性のあるパッケージの発見+アップデートの自動化 ・ドキュメントの校正の自動化 が解説されています。

特に最後のドキュメント校正の自動化に目が止まりました。 というより、GitHub上でドキュメントを管理するというのをあまり聞いたことがなかったのでこんな使い方もあるんだなあと興味を持ちました。 textlintreviewdogを組み合わせて校正を自動化が解説されています。


12章.Orbsの作成

最後の章はOrbs(CircleCIの設定をプロジェクト間で使い回すことができるパッケージ)についてです。 CI/CDを利用した開発しやすい環境で、使用しやすいOrbsを作るためのノウハウが載っています。


(Appendix)config.ymlの基本構造

Appendixでは設定ファイルで使用する設定キーが網羅されています。 これからCircleCIを使用する時に何度も見返すリファレンスになりそうです。

所感

全体を通してすごく丁寧に解説されています。 言葉の定義から始まり、その機能の役割・意義・導入方法などがまとめられており、さらに手を動かして学ぶことができます。導入例も豊富です。

CI/CDを含めたDevOps周辺についてあまり詳しくない人(僕のような)でも置いてきぼりにせず、しっかりと理解までたどり着ける本でした。

(たった1つだけ、しかも本の内容には関係のない不満が1点あります。電子書籍の場合、目次が見辛いことです。1~12章の章題の他に、小見出しも同列で表示されているため、○章を見返したい、と言った時に探すのが少し大変でした。)

まとめ

CI/CDの役割・導入することのメリット・実際の導入方法を1から理解することができました。 またDevOpsの最近の動向とこれからについても所々解説があって、これからDevOps関連に詳しくなっていきたい自分としては読んでよかった1冊でした。

今後ポートフォリオ作成に取り組むなどして、理解を深め、使いこなせるようになりたいです。 その他のDevOps周りの知識も学んでいきます。

今後も学びの跡をブログにまとめていく予定です。 もしよかったらTwitterのフォローよろしくお願いします。<muku.(@mmuu_kkuu)>

Amazon(CircleCI実践入門)