目次
- はじめに
 - 謝辞
 - 本書の読み方
 - 目次
 
第1章 なぜCI/CDが必要か
1.1 アジャイルとDevOps
- アジャイルとは?
 - DevOpsとは?
 - DevOpsの導入効果
 - CI/CDとの関係
- 自動化の必要性
 - 誰がCI/CD環境を用意するか
 - CI/CD導入後の運用チームの役割
 
 
1.2 自動化で品質と開発速度をアップ
- CI/CDで自動化できること
- ビルド
 - テスト
 - デプロイ
 - その他さまざまなタスク
 
 - 自動化することで得られる効果
- テストし忘れの防止
 - テストに対する信頼性の向上
 - 積極的な機能リリース
 - 品質と開発速度の向上
 
 - DevOpsの効果を測る4つの指標
- (a)リードタイム
 - (b)デプロイ頻度
 - (c)平均修復時間(MTTR)
 - (d)失敗の頻度
 - 品質と速度の両立性
 
 
1.3 CI/CDツールの選び方
- オンプレミス vs. SaaS
- オンプレミス型のメリット/デメリット
 - SaaS型のメリット/デメリット
 - どちらを選べばよいか?
 
 - 代表的なツール/サービスの紹介
- CircleCI
 - Travis CI
 - Jenkins
 - AWS CodeBuild
 - GitHub Actions
 
 - CircleCIの特徴
- Dockerのサポート
 - 多様なプログラミング言語に対応
 - ワークフロー(パイプライン)
 - リソースクラス
 - 従量課金プラン
 
 - [Column]Dockerについて
 
第2章 CircleCIの基本
2.1 CircleCIの動作フロー
- ジョブの開始から完了まで
 - ジョブが失敗した場合
 
2.2 CircleCIの基本
- ビルド──アプリケーションの構築
 - 設定ファイル──コード化された設定
 - プロジェクト──コードホスティングサービスにおけるリポジトリ
 - ステップ──ジョブの設定の最小単位
 - [Column]コンビニエンスイメージ
- runステップ
 - ビルトインステップ
 
 - ジョブ──ステップのグループ化
 - Executor──ジョブの実行環境
- Docker Executor
 - Machine Executor
 - macOS Executor
 - Windows Executor
 
 - [Column]Docker in Docker問題
 - ワークフロー──ジョブ実行順序の制御
 - ワークスペース/キャッシュ/アーティファクト──データの永続化
- ワークスペース
 - キャッシュ
 - アーティファクト
 
 - パイプライン──ワークフローのグループ化
- パイプラインとは何か
 - パイプラインの活用
 
 - Orbs──ジョブ設定の再利用
- Orbsのしくみ
 - Orb Registry
 
 - 料金体系──従量課金とOSSプラン
- 従量課金プラン
 - クレジット
 - 有料オプション
 - シート料金
 - アクティブユーザー
 - 注意点
 - OSSプラン
 
 
2.3 YAMLの基本
- [Column]サポート体制
 - リスト
 - マップ
 - スカラ
 - 複数行の記述
 - アンカーとエイリアス
 
第3章 環境構築
3.1 GitHubとの連携
- GitHubアカウントの連携
 - プロジェクトの追加
- 個人リポジトリの場合
 - GitHub Organizationのリポジトリの場合
 
 - プライベートリポジトリを追加した場合のアクセス権
- 個人リポジトリの場合
 - GitHub Organizationのリポジトリの場合
 
 
3.2 CircleCIの実行環境
- クラウド環境での実行
 - ローカル環境での実行
 
3.3 ローカル環境での初めてのジョブ実行
- CircleCI CLIのインストール
 - config.ymlの作成
 - config.ymlのバリデーション
 - ジョブの実行
 
3.4 クラウド環境での初めてのジョブ実行
- config.ymlの自動追加
 - config.ymlの手動追加
 
3.5 プロジェクト追加後の通常のジョブ実行
- 失敗したジョブの修正
 - 実行のスキップ
 - 再実行
 - キャンセル
 
3.6 SSHによる失敗したテストのデバッグ
- SSHデバッグでできること
 - SSHデバッグの実行
- 開始
 - 終了
 
 
3.7 サンプルコードでCI環境構築を実践
- 実装とテストコード
 - config.ymlの作成とローカル環境実行
 - CircleCIでジョブ実行
 - SSHデバッグによるテスト失敗の原因調査
- CircieCIで失敗するコードの追加
 - SSHデバッグでテストの成功確認
 - config.ymlを修正してテストの成功確認
 
 
第4章 ワークフローでジョブを組み合わせる
4.1 ワークフローとは
- ワークフローでできること
 - ジョブのオーケストレーションの種類
- シーケンシャルジョブ
 - ファンアウト/ファンイン
 
 
4.2 ワークフローの基本的な使い方
- ワークフローに対応するconfig.yml
 - ワークフローの実行
- ワークフローのステータス
 - 失敗したワークフローの再実行
 
 
4.3 ジョブの分割
- ジョブを分割するメリット
 - 再利用可能なコンフィグを使ってジョブを分割
- executorsキー
 - commandsキー
 - 再利用可能なコンフィグのパラメータ
 
 
4.4 複数ジョブの同時実行
- 同時実行するメリット
 - requiresキーでジョブ間の依存関係を制御
 
4.5 ワークスペースによるジョブ間のファイル共有
- ワークスペースの利用方法
- persist_to_workspace
 - attach_workspace
 - 利用できないジョブ
 
 - ワークスペースのライフサイクル
 - キャッシュとの違い
 - 証明書エラーへの対応
 
4.6 そのほかのワークフロー
- フィルタリング
- フィルタリングのしくみ
 - タグによるフィルタリング
 - ブランチによるフィルタリング
 
 - スケジュール
- スケジュール実行のしくみ
 - cronキー利用時の注意点
 
 - 承認ジョブ
- ワークフローをコントロール
 - 具体的な設定例
 
 
第5章 実践的な活用方法
5.1 プロジェクト設定によるジョブの実行タイミングの調整
- フォークされたリポジトリのビルド
 - プルリクエストのみのビルド
 - 自動キャンセルによる最新のコミットのみのビルド
 
5.2 GitHubのブランチプロテクションによるマージのブロック
- ブランチプロテクションでできること
 - CIステータスによるマージのブロック
 
5.3 CircleCI Checksによる詳細なCIステータスの取得
- CircleCI Checksでできること
 - CircleCI Checksの導入
- 有効化
 - 無効化
 - ブランチプロテクションの詳細設定
 
 
5.4 環境変数を利用する理由
- パスワードやAPIキーなどの秘匿情報の保護
 - アプリケーション設定とコードの分離
 
5.5 ビルトイン環境変数
- ビルトイン環境変数を利用する理由
 - 主なビルトイン環境変数一覧
 - ビルトイン環境変数の利用
 
5.6 ユーザー定義の環境変数
- ユーザー定義の環境変数を利用する理由
 - インライン環境変数の利用
- ステップ
 - ジョブ
 - イメージ
 
 - プロジェクト設定の利用
 - コンテキストの利用
- コンテキストの設定
 - コンテキスト環境変数の利用
 
 - 複数行の環境変数を利用する方法
 - セキュリティ
- 環境変数の出力
 - SSH接続による環境変数の出力
 
 - [Column]コマンドのパス(PATH)を通すには?
 
5.7 通知の活用
- 通知の設定
- Slackへの通知(Webhook URLの取得)
 - Slackへの通知(Slack Orb)
 - Slack通知の調整
 - GitHubへのコメント
 
 - ステータスバッジ
- テンプレートコード
 - プライベートリポジトリの場合
 
 
5.8 SSHキーの活用
- SSHキー登録のしくみ
 - ユーザーキーとデプロイキー
 - ベストプラクティス
 - デプロイキーの使い方
- 追加
 - 利用
 
 - 同一ホストの複数デプロイキー
- add_ssh_keysの複数回実行
 - 環境変数の利用
 
 - ユーザーキーの使い方
- 追加
 - 利用
 
 
第6章 テストの基本と最適化
6.1 基本的なテストの実行方法
- 最小構成のテスト
- 設定
 - 解説
 
 - データベースを使ったテスト
- 設定
 - 解説
 
 - ブラウザを使ったテスト
- 設定
 - 解説
 
 - CircleCIでテストを実行する際の注意点
- 並列実行数
 - メモリ量
 
 
6.2 CI実行速度の改善
- CIを改善するタイミング
 - 実行時間の改善方法
- 複数ジョブの同時実行
 - キャッシュ
 - ジョブ内の並列実行
 - リソースクラスの変更
 
 - 改善方法の決定方針
 
6.3 キャッシュの活用
- キャッシュの種類と特徴
- ファイルキャッシュ
 - Dockerイメージキャッシュ
 
 - ファイルキャッシュの活用方法
- 依存パッケージのキャッシュ
 - キャッシュのクリア
 
 - [Column]キャッシュを削除できない理由──不変性とべき等性
- 部分キャッシュリストア
 - 適切なキャッシュキーの設計
 
 - Dockerイメージキャッシュの活用方法
- Dockerイメージとレイヤ構造
 - DLCのしくみ
 - DLCの利用
 
 
6.4 最適化済みDockerイメージの活用
- CI用のDockerイメージを用意するメリット
 - イメージの取得
- Docker Hubからの取得
 - ECRからの取得
 
 
6.5 テストサマリーでテスト結果をわかりやすく表示する
- テストサマリーを利用する目的
 - エラーレポートの確認
 - テストサマリーの利用方法
- サポートされているレポートフォーマット
 - さまざまなツールによるレポートファイル出力
 - レポートファイルの保存
 
 
6.6 ジョブ内並列実行の活用
- 並列実行のしくみ
- テスト分割コマンドの使い方
 - タイミングデータを利用したテストの分割
 
 - 並列実行の利用方法
 
6.7 リソースクラスを活用し,ジョブ実行環境の性能を変更
- リソースクラスとは?
 - リソースクラスの利用方法
- 種類と選択方針
 - resource_classキーの利用
 
 
第7章 継続的デプロイの実践
7.1 継続的デプロイ
- 継続的デリバリとの違い
 - 広義の継続的デリバリ
 
7.2 なぜ継続的デプロイを行うのか
- 本番環境によるテスト
- テスト環境でのQAの限界
 - 実際の失敗事例
 - 何が問題なのか?
 - 本番環境でのテスト
 
 - フィードバックループの構築
- フィードバックループとは何か?
 - フィードバックループの重要性
 - 継続的デプロイとフィードバックループの関係
 
 
7.3 継続的デプロイの難しさ
- 組織的な理由
 - ビジネス的な理由
 
7.4 継続的デプロイの導入を助ける手法
- 承認ジョブによる承認フローへの対応
- 承認ジョブの設定例
 - 承認ジョブの注意点
 
 - フィーチャーフラグによる段階的リリース
- フィーチャーフラグの使用例
 
 - [Column]デプロイとリリースは同じ?
- フィーチャーフラグの導入方法
 
 - 新規プロジェクトからの導入
- リリースの前倒し
 - アジャイル的な思考の普及
 
 
7.5 Orbsを使った継続的デプロイの実践例
- Orbsの探し方
- 認定済み,パートナー,サードパーティーOrbs
 - Orbsのバージョン
 
 - 必要なもの
- アカウント
 - Docker
 - サンプルコード
 - CircleCIプロジェクト
 
 - 全体の流れ
 - ECRへのデプロイ
- IAMユーザーの権限
 - CloudFormationでECRの作成
 - CircleCIで環境変数の設定
 - .circleci/config.yml
 - ECR Orbのインポート
 - aws-ecr/build-and-push-imageジョブ
 
 - ECSへのデプロイ
- CloudFormationでECSの作成
 - .circleci/config.yml
 - ECS Orbのインポート
 - aws-ecs/deploy-service-updateジョブ
 
 
7.6 継続的デプロイを使った開発の流れ
- デプロイ
 - 本番環境でテスト
- 本番環境の監視
 - 本番環境に対するE2Eテスト
 
 - ロールバック
 - その他の継続的デプロイ手法
- カナリアリリース
 - ブルー/グリーンデプロイ
 - ローリングデプロイ
 
 
第8章 Webアプリケーション開発,インフラでの活用
8.1 TypeScript
- .circleci/config.yml
 - ビルド
 - テスト
- マトリックスビルド
 - JavaScriptへのコンパイル
 - テスト結果とカバレッジレポートの作成
 - テスト結果とカバレッジレポートの表示
 
 
8.2 Ruby (Ruby on Rails)
- .circleci/config.yml
 - ビルド
 - テスト
- データベースを用いたテスト
 - テストを分割して複数コンテナで実行
 - カバレッジのマージ──アプリケーション側の設定
 - カバレッジのマージ──config.yml側の設定
 
 
8.3 PHP(Laravel)
- .circleci/config.yml
 - ソースコードのチェックアウト
 - ビルド
 - テスト
- Base64を使ってファイルを環境変数として挿入
 - テストの実行
 
 
8.4 Java(Spring Boot)
- .circleci/config.yml
 - OOM問題対策
- Exit Code 137に注意
 - ヒープサイズに関する環境変数
 - ヒープサイズに関する環境変数の優先度
 
 - 環境変数
 - ビルド
- Gradleバイナリのキャッシュ
 - 依存関係のキャッシュ
 
 - テスト
- テスト分割の概要
 - ファイル名からテストクラス名を動的に作成
 - テストレポート
 - アーティファクト
 
 
8.5 Docker
- Dockerコマンドを使うために
- setup_remote_dockerでリモートホストの立ち上げ
 - リモートDocker環境のスペック
 
 - .circleci/config.yml
- Machine Executorを使う場合
 - Docker Layer Caching
 
 - Dockerイメージのキャッシュ戦略
- レジストリからプルする方法
 - save_cacheを使う方法
 - ジョブ間でのイメージの受け渡し
 
 - リモートDocker環境との通信
- 実行中のサービスへのアクセス
 - ファイルの受け渡し
 
 
8.6 Terraform
- .circleci/config.yml
 - tfnotify
- tfnotifyのインストール
 - tfnotifyを使うための準備(GitHub)
 - tfnotifyを使うための準備(Slack)
 - tfnotifyの実行
 
 - Terraformの実行
- IAMユーザーの権限
 - コンテキストの作成
 - run_terraform_planジョブ
 - run_terraform_applyジョブ
 
 - State Lockingの導入
- Stateについて
 - State Lockingについて
 - DynamoDBの作成
 - State Lockingの利用
 - State Lockingの解除
 
 
第9章 モバイルアプリ開発での活用
9.1 Android
- 静的解析,ユニットテスト,APKの作成
- .circleci/config.yml(build_and_setupジョブ)
 - Dockerイメージ
 - 環境変数
 - テスト
 - アーティファクトとテストレポート
 
 - Test Labと連携
- Test Labの準備
 - 環境変数
 - .circleci/config.yml(run_ftlジョブ)
 - ワークスペースからAPKのダウンロード
 - gcloudによる認証
 - Test Labを使ったテストの実行
 - アーティファクトとテストレポート
 
 
9.2 iOS(macOS)
- テスト
- .circleci/config.yml(build-and-testジョブ)
 - macOS Executor
 - テスト
 
 - matchによる証明書の作成
- matchについて
 - matchの初期化
 - 証明書とプロビジョニングファイルの作成
 
 - AdHoc IPAの作成
- .circleci/config.yml(generate-ipaジョブ)
 - 開発環境でのIPAの作成
 - SSHキーの追加
 - 追加したSSHキーの使用
 - IPAの作成とアップロード
 
 
第10章 デスクトップ/ネイティブアプリ開発での活用
10.1 Windows
- .circleci/config.yml
 - Windows Executor
 - さまざまなシェルの使用
 
10.2 クロスプラットフォーム
- .circleci/config.yml
 - マトリックスビルド
 - キャッシュ
 - クロスプラットフォームのディストリビューション作成
 
10.3 Unity
- .circleci/config.yml
 - ライセンスのアクティベーション
 - テスト
 - ビルド
 
第11章 さまざまなタスクの自動化
11.1 なぜ自動化するのか
- 自動化するメリット
 - 自動化に適したタスク
 
11.2 Webサイトのリリース
- ワークフローが担うタスク
 - ワークフローの設定
- 事前準備
 - 設定ファイル
 
 
11.3 バージョンごとのリリース作業
- ワークフローが担うタスク
 - ワークフロー
- 事前準備
 - 設定ファイル
 
 
11.4 セキュリティアラート
- ワークフローが担うタスク
 - ワークフロー
- 事前準備
 - 設定ファイル
 
 
11.5 依存ライブラリのアップデート
- ワークフローが担うタスク
 - ワークフロー
- 事前準備
 - 設定ファイル
 
 
11.6 ドキュメントの校正
- ワークフローが担うタスク
 - ワークフロー
- 事前準備
 - textlintの設定
 - reviewdogの設定
 
 
第12章 Orbsの作成
12.1 Orbs作成の基礎
- バージョニング
 - 開発用Orbsと本番用Orbs
- それぞれの違い
 - 公開時の注意点
 
 
12.2 初めてのOrbs作成とデプロイ
- Orbsクイックスタート
 - config.ymlに記述するインラインOrbs
- インラインOrbsを作成
 - ローカル環境での実行
 
 - Orbsの公開
- Orbsを公開/利用するためのセキュリティ設定の有効化
 - CircleCIトークンを取得
 - Orbsの名前空間を作成
 - Orbsの公開
 
 - Orbsの設計
- descriptionキーの設定
 - コマンドとExecutorを同梱する
 - Orb内のコマンドやジョブ名には簡潔な名前を付ける
 - パラメータにはなるべくデフォルト値を付ける
 - ジョブだけのOrbを作らないようにする
 - stepsパラメータを使う
 - Examplesを用意する
 
 
12.3 Orbs開発でもCI/CDを実現
- Orbsのテスト
- バリデーション
 - 展開テスト──circleci config process
 - ランタイムテスト──circleci local execute
 - インテグレーションテスト
 
 - Orbsのテストからデプロイまでの流れ
 - orb-toolsを使ったOrbs開発
- orb-tools/publish-devジョブ
 - dev-promote-prod-from-commit-subjectジョブ
 - orb-tools/packジョブ
 - orb-tools/trigger-integration-tests-workflowジョブ
 
 
12.4 orb-toolsを使ったテスト/デプロイの自動化
Appendix config.ymlの基本構造
A.1 versionキー
- version
 
A.2 ジョブ
- jobs
 - Docker Executor
 - Machine Executor
 - macOS Executor
 - Windows Executor
 - steps
 
A.3 workflows
- version
 - ワークフロー
 - triggers
 - schedule
 - jobs
 
A.4 runステップ
- run
 
A.5 ビルトインステップ
- when/unless
 - checkout
 - setup_remote_docker
 - save_cache/restore_cache
 - deploy(非推奨)
 - store_artifacts
 - store_test_results
 - persist_to_workspace/attach_workspace
 - add_ssh_keys
 
A.6 その他
- parameters
- string(文字列)
 - boolean(真偽値)
 - integer(整数)
 - enum(列挙型)
 - executor
 - steps
 - env_var_name(環境変数名)
 
 - orbs
 - commands
 - executors
 - パイプライン変数/パイプラインパラメータ
- パイプライン変数の設定例
 - パイプラインパラメータの設定例
 
 - [Column]シェルオプションの初期値
 
- 索引
 - 執筆者プロフィール