目次
- はじめに
- 謝辞
- 本書の読み方
- 目次
第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]シェルオプションの初期値
- 索引
- 執筆者プロフィール