書評：CircleCI実践入門

# はじめに

先日発売されました「[CircleCI実践入門](https://www.amazon.co.jp/CircleCI%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80CI-CD%E3%81%8C%E3%82%82%E3%81%9F%E3%82%89%E3%81%99%E9%96%8B%E7%99%BA%E9%80%9F%E5%BA%A6%E3%81%A8%E5%93%81%E8%B3%AA%E3%81%AE%E4%B8%A1%E7%AB%8B-WEB-PRESS-plus/dp/4297114119)」を読みました。2020年9月現在、唯一日本語で書かれたCirecle CI本ということで期待して購入したところ、取り扱われている情報の質・量ともに大変満足のいく本でした。そこで、今回本書籍について簡単に書評を書こうと思った次第です。 

# この記事で取り扱う内容

- 本書籍をオススメする人について（同時に、この本のユースケース）
- 読むうえで必要な前提知識
- 各章のポイント、特にCircleCIを理解・実践する上で意識した方がよいと思ったこと
- オススメの読み方

# この記事では取り扱わない内容

- 具体的なconfig.ymlの記述や各種設定の仕方について(書籍には書かれています)

# 誰向けの本か

- [ ] CI/CD周りの知識が欲しい

- [ ] CIrcleCIをまだ使っていないが使ってみたい

- [ ] CircleCIを使うかはわからないが、とりあえず機能を知ったうえで検討したい

- [ ] CircleCIを使っているが、使い方がわからない

- [ ] CircleCIを使いこなせているが、もっと良い使い方があるなら知りたい

- [ ] CircleCIの必要知識が体系的にまとまった本が欲しい

  

上記に一つでも当てはまるなら購入を検討されてはいかがでしょう

# 前提知識

## （ほぼ）必須

- git / GitHub に関する知識
- シェルスクリプト
- 手作業でビルド、テスト、デプロイする方法

## 推奨（なくても読むことは可能だがあると読みやすい）

- Dockerに関する知識
- CI/CDを導入したいアプリのビルド、テストする方法
- AWSに関する知識
- YAML（書籍中で簡単な説明あり）
- CI/CD に関する知識

# 各章ポイントメモ

※業務上当面必要にならないため、第8章の一部、および第9章～第11章は読み飛ばしてます

## 第１章 なぜCI/CDが必要なのか

- ビジネスに変化への対応が求められる⇒アジャイル開発が重要視

- アジャイル開発においては、システムを安定稼働させつつ早く開発することが求められる⇒DevOpsの思想に行き着く

- ビルド、テスト、デプロイ作業を手作業（ミスが起きる、遅い）ではなく自動化（一度うまくいけば（機能が壊れない限り）そのまま、早い）⇒[CI（継続的インテグレーション）](https://circleci.com/docs/ja/2.0/about-circleci/#%E7%B6%99%E7%B6%9A%E7%9A%84%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%AF)/CD（継続的デリバリ、あるいはデプロイ）

  

## 第２章 CircleCIの基本

- 一つのリボジトリをひとつのプロジェクトとみなす
- プロジェクトごとのビルド実行内容は.[circleci/config.yml](https://circleci.com/docs/ja/2.0/configuration-reference/#section=reference)ですべて管理する
- [制御構文：ステップ（実行コマンド※後述のOrbで用いるCommandとは別）、ジョブ（ステップのまとまり）、ワークフロー（ジョブの実行順序を制御）](https://circleci.com/docs/ja/2.0/jobs-steps/#section=getting-started)
- [実行環境：ジョブごとに実行環境（Executor）が違う。選択可能な実行環境：Docker、Macine(Linux)、macOS、Windows](https://circleci.com/docs/ja/2.0/executor-intro/#section=configuration)
- [ジョブごとに実行環境が異なる⇒ジョブの生成物を永続化する必要がある：ワークスペース・キャッシュ・（アーティファクト）を使い分ける](https://circleci.com/docs/ja/2.0/jobs-steps/#%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E6%A6%82%E8%A6%81)
- [Orbs](https://circleci.com/docs/ja/2.0/orb-intro/#section=configuration)：パッケージ化された処理をまとめたもの。(Orbs名)/(Job/Command名)で使用。OrbsRegistryで管理

## 第３章 環境構築

- [リボジトリの管理者がCircleCIでのプロジェクトの管理者となる。](https://circleci.com/docs/ja/2.0/project-build/#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%83%9A%E3%83%BC%E3%82%B8)
- [CircleCIはローカル環境でも（機能制限付きで）使用可能。](https://circleci.com/docs/ja/2.0/local-cli/#section=configuration)文法チェックやデバッグに使えるが、[ワークフローは使えないので、ジョブ単体ずつデバッグする](https://circleci.com/docs/ja/2.0/local-cli/#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E3%81%AE%E3%82%B8%E3%83%A7%E3%83%96%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AE%E5%88%B6%E9%99%90%E4%BA%8B%E9%A0%85)
- SSHデバッグは[原因が一目でわからないエラーのデバッグに有用](https://circleci.com/blog/debugging-ci-cd-pipelines-with-ssh-access/)だが、SSHデバッグを実行した場合、[SSH接続を切っても課金は終わらない](https://circleci.com/docs/ja/2.0/ssh-access-jobs/#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97)。かならずジョブを終わらせる

## 第４章 ワークフローでジョブを組み合わせる

- [シーケンシャル（順次）](https://circleci.com/docs/ja/2.0/sample-config/#%E9%A0%86%E6%AC%A1%E5%AE%9F%E8%A1%8C%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E6%A7%8B%E6%88%90%E4%BE%8B)か[ファンイン／ファンアウト（並列）](https://circleci.com/docs/ja/2.0/sample-config/#%E3%83%95%E3%82%A1%E3%83%B3%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A1%E3%83%B3%E3%82%A2%E3%82%A6%E3%83%88-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E6%A7%8B%E6%88%90%E4%BE%8B)か
- ひとつのジョブに大きい複数の責務を負担させないよう、ジョブを小さく分割する
- ジョブの依存関係はrequiresキーで管理

## 第５章 実践的な活用法

- [プルリクが来た場合、ビルドが正常である場合のみマージするよう設定可能](https://circleci.com/docs/ja/2.0/oss/#%E3%83%97%E3%83%AB-%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E3%81%BF%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B)
- [環境変数の使い分け](https://circleci.com/docs/ja/2.0/env-vars/#section=projects)
- [メールやスラックと提携させて通知させる](https://circleci.com/docs/ja/2.0/notifications/#section=projects)
- GitHubのプルリクに対しコメントを送る
- SSHキー（ユーザーキー、デプロイキー）の使い分けは、[ベストプラクティス](https://circleci.com/docs/ja/2.0/gh-bb-integration/#%E3%82%AD%E3%83%BC%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88-%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9)に従う

## 第６章 テストの基本と最適化

- 基本的にローカルで構築・実行したテストをCIで実行する
- DBを使ったテストやブラウザを使ったE2Eテストも実行可能
- [テストを分割、並列に実行する、キャッシュを利用する、CI用のDockerイメージを用意するなど、実行時間を減らす工夫をする](https://circleci.com/docs/ja/2.0/optimizations/#section=projects)
- [テストサマリを用いてテスト結果レポートを出力する](https://circleci.com/docs/ja/2.0/collect-test-data/#section=jobs)

## 第７章 継続的デプロイの実践

- [Test in Production](https://circleci.com/ja/resources/testing-in-production/) ：本番環境でテストをする（テスト環境でのテストには限界がある）
- 仮に本番環境で問題が見つかったのならすぐにロールバックする（前バージョンに戻す）
- ロールバックとリリースを迅速に行うためにCD（継続的デプロイ）が必要となる
- [CDを行うには、Orbsを用いると効率的](https://circleci.com/docs/ja/2.0/deployment-integrations/#section=deployment)（サンプルではAWSの[ECR](https://circleci.com/orbs/registry/orb/circleci/aws-ecr)と[ECS](https://circleci.com/orbs/registry/orb/circleci/aws-ecs)のOrbsを使用）
- リリース時にバグが見つかった：バグフィックス版を再度プッシュするか、取り消しのコミットをプッシュする（ロールバック）

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

- Webアプリケーション開発：TypeScript、Rails、Laravel、Spring Bootに関するビルド、テストについてサンプルで解説
- インフラでの活用：Dockerのビルド設定とCircleCIを用いたTerraformの自動実行についてサンプルで解説

## 第１２章 Orbsの作成

- [開発用Orbsと本番用（安定版）Orbsがある](https://circleci.com/docs/ja/2.0/using-orbs/#orb-%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3-%E9%96%8B%E7%99%BA%E7%89%88%E3%81%A8-%E5%AE%89%E5%AE%9A%E7%89%88)
- 一度公開した[本番用Orbsは基本的に削除できない](https://circleci.com/docs/ja/2.0/using-orbs/#%E5%AE%89%E5%AE%9A%E7%89%88-orbs-%E3%81%AE%E5%89%8A%E9%99%A4)（セキュリティに注意）
- Orbs設計の際は[要件（リンク先）](https://circleci.com/docs/ja/2.0/orb-author/#orbs-%E3%81%AE%E8%A8%AD%E8%A8%88)を満たすようにする
- usageを用意する（Orbsの使い方を例示する）
- Orbsの開発にもCI/CDを導入する

# オススメの読み方

ある程度CircleCIについて知っている方であれば、知りたいところを読むリファレンス的な使い方で問題ないです。（体系的に情報がまとまっている上に、巻末にconfig.ymlの構文がまとめられていますので、おおよそ知りたいことは調べられる作りだと思います）

CircleCI初学者の方であれば、上記の前提知識を学習してから第2～5章までを読み、CircleCIの基本的な使い方を学んだ後、CircleCIをアプリケーションに導入していくうえで必要な知識を適時以降の章から学んでいく、という読み方にするとよいと思います。