CI/CD(継続的インテグレーション、継続的デプロイ)を導入すると、ビルド/テスト/デプロイなどアプリケーションのリリースに至るまでの多くの作業を自動化できます。開発が効率化するだけでなく、テストを確実に行うことなどにより品質の向上にもつながります。本書は、多くのアプリケーション開発で活用されているCI/CDサービス「CircleCI」を使って、CI/CDを実現できるようになるための書籍です。基本から始め、実際の開発に応用できるよう設定例やTipsをふんだんに掲載しています。
・見出し記号の意味は以下の通りです
# 節
## 項
### 目
#### [Column]コラム
----------------------------------------
はじめに
謝辞
本書の読み方
目次
第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]シェルオプションの初期値
索引
執筆者プロフィール