書籍概要

WEB+DB PRESS plus

CircleCI実践入門
──CI/CDがもたらす開発速度と品質の両立

著者
発売日
更新日

概要

CI/CD(継続的インテグレーション,継続的デプロイ)を導入すると,ビルド/テスト/デプロイなどアプリケーションのリリースに至るまでの多くの作業を自動化できます。開発が効率化するだけでなく,テストを確実に行うことなどにより品質の向上にもつながります。本書は,多くのアプリケーション開発で活用されているCI/CDサービス「CircleCI」を使って,CI/CDを実現できるようになるための書籍です。基本から始め,実際の開発に応用できるよう設定例やTipsをふんだんに掲載しています。

こんな方におすすめ

  • Webアプリケーション開発を効率化したいと考えているWeb開発者

サンプル

samplesamplesamplesamplesample

目次

  • はじめに
  • 謝辞
  • 本書の読み方
  • 目次

第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]シェルオプションの初期値
  • 索引
  • 執筆者プロフィール

サポート

ダウンロード

(2020年9月9日更新)

本書のサンプルコードは以下のページで公開しています。

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2020年9月23日最終更新)

P.256 「run_terraform_applyジョブ」の1段落3行目

マージされたときccccccだけ実行される
マージされたときだけ実行される

P.292 「ライセンスのアクティベーション」の3段落目コマンド


# xvfb-run \

$ xvfb-run \

(以下2020年9月9日更新)

P.272 3段落3行目

証明書の作成の作成方法についても解説っっっっっっっl;します。
証明書の作成方法についても解説します。

P.289 注9

https://github.com/circleci-book/unity-sampled
https://github.com/circleci-book/unity-sample

「unity-sample」の後ろの「d」が不要でした。

商品一覧