WEB+DB PRESS plusシリーズCircleCI実践入門
──CI/CDがもたらす開発速度と品質の両立

書籍の概要

この本の概要

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

こんな方におすすめ

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

この書籍に関連する記事があります!

はじめに
本書の目的は,CircleCIを通してCI/CDに入門することです。

本書のサンプル

本書の一部ページを,PDFで確認することができます。

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

サンプル画像3

サンプル画像4

サンプル画像5

目次

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

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

著者プロフィール

浦井誠人(うらいまさと)

大学卒業後,フィリピンにてフロントエンド/バックエンド担当のエンジニアとして働いている。WEB+DB PRESS Vol.107にて特集『実践CircleCI』を執筆。

URL:https://uraway.hatenablog.com/
mail:masato.uraway@gmail.com
GitHub:uraway
Twitter:@uraway_


大竹智也(おおたけともや)

1983年生まれ。起業家,およびWebエンジニア。2010年にオンライン英会話「ラングリッチ」を起業し,2015年に「EnglishCentral」へ売却。2017年にエンジニア向け教育サービスを主軸とするフォーコード株式会社を設立。著書に『[改訂新版]Emacs実践入門』と『Atom実践入門』(共に技術評論社)がある。

URL:https://blog.tomoya.dev/
mail:tomoya.ton@gmail.com
GitHub:tomoya
Twitter:@tomoyaton


金洋国(きむひろくに)

CircleCIの初期からサポートやプロダクト開発に携わり,2018年にCircleCI Japanを立ち上げた。現在はSREチームで活躍中。エンジニアの仕事のかたわら電動キックボードのビジネスを起業し,現在はSWALLOW合同会社の代表としてさまざまな電動モビリティの普及活動も行う。

URL:https://kimh.github.io/
mail:kim@circleci.com
GitHub:kimh
Twitter:@kimhirokuni