CircleCIとは?高速で使いやすいCI/CDプラットフォーム完全ガイド

ソフトウェア開発で「CI/CD」を導入しようと考えたとき、どのツールを選べばいいか迷いますよね。

「GitHub Actionsは知ってるけど、CircleCIって何が違うの?」「設定が難しそう…」と感じている方も多いはずです。

実は、CircleCIは高速実行と柔軟な設定が特徴の、世界中の開発チームに愛用されている強力なCI/CDプラットフォームなんです。FacebookやSpotifyなど、大規模サービスでも採用されている実績があるんですよ。

この記事では、CircleCIの基礎知識から実践的な設定方法まで、初心者の方にも分かりやすく解説していきます。

具体的な設定例をたくさん見ながら、あなたのプロジェクトにもCircleCIを導入してみましょう!


スポンサーリンク
  1. CircleCIとは?その特徴を知ろう
    1. CircleCIの基本
    2. CircleCIが選ばれる理由
  2. CircleCIの主な機能
    1. 自動ビルドとテスト
    2. Dockerコンテナベースの実行
    3. ワークフロー機能
    4. Orbs(オーブ)
    5. インサイトとアナリティクス
  3. CircleCIと他のCI/CDツールの比較
    1. GitHub Actionsとの違い
    2. Jenkinsとの違い
    3. GitLab CI/CDとの違い
  4. CircleCIの料金プラン
    1. 無料プラン(Free Plan)
    2. Performanceプラン
    3. Scaleプラン
    4. クレジットシステム
  5. 基本的な設定方法
    1. 前提条件
    2. プロジェクトの追加
    3. 設定ファイルの作成
  6. 基本的なconfig.ymlの構成
    1. 最小構成の例
    2. バージョンの指定
    3. jobsとstepsの関係
  7. 実践的な設定例
    1. Pythonプロジェクトの例
    2. 複数バージョンでのテスト
    3. データベースを使うテスト
  8. ワークフローの活用
    1. 順次実行
    2. 並列実行
    3. 承認ステップ
  9. Orbsの活用
    1. Orbsとは
    2. Orbsの使い方
    3. 人気のOrbs
  10. キャッシュの活用
    1. キャッシュの重要性
    2. キャッシュの基本
    3. 複数のキャッシュキー
    4. Pythonの例
  11. アーティファクトとテスト結果
    1. アーティファクトの保存
    2. テスト結果の保存
  12. 環境変数とシークレット管理
    1. 環境変数の設定
    2. シークレット情報の管理
    3. Contextsの活用
  13. 並列実行とテスト分割
    1. 並列実行の設定
    2. テスト分割の種類
  14. Docker操作とビルド
    1. Dockerイメージのビルド
    2. Docker Layerキャッシング
  15. スケジュール実行
    1. 定期実行の設定
  16. トラブルシューティング
    1. 問題1:ビルドが遅い
    2. 問題2:テストが不安定
    3. 問題3:環境変数が反映されない
    4. 問題4:SSH接続でデバッグ
  17. ベストプラクティス
    1. 1. 小さく保つ
    2. 2. キャッシュを積極的に使う
    3. 3. Orbsで車輪の再発明を避ける
    4. 4. 通知を設定する
    5. 5. ブランチごとに挙動を変える
    6. 6. ワークスペースで共有
  18. まとめ

CircleCIとは?その特徴を知ろう

CircleCIの基本

CircleCI(サークルシーアイ)は、2011年に設立されたCircle Internet Services社が提供する、クラウドベースのCI/CDプラットフォームです。

CI/CDとは、コードの変更から本番環境へのデプロイまでを自動化する仕組みのこと。CircleCIは、この一連のプロセスを高速かつ効率的に実行できるんです。

現在では、世界中で50万以上のプロジェクトがCircleCIを利用しており、毎月何千万ものビルドが実行されています。

CircleCIが選ばれる理由

1. 圧倒的な実行速度
最適化されたインフラで、他のCI/CDツールより高速に動作します。

2. 柔軟な設定
YAMLファイルで細かくカスタマイズできます。

3. Docker完全対応
Dockerイメージを使った実行環境の構築が簡単です。

4. 強力な並列実行
複数のジョブを同時実行して、ビルド時間を短縮できます。

5. 豊富なOrbsライブラリ
再利用可能な設定パッケージで、セットアップが簡単になります。


CircleCIの主な機能

自動ビルドとテスト

コードをGitにプッシュすると、自動的にビルドとテストが実行されます。

典型的な流れ:

  1. 開発者がコードをプッシュ
  2. CircleCIが変更を検知
  3. 自動的にビルド環境を起動
  4. テストを実行
  5. 結果を通知

すべて自動なので、手作業は一切不要なんです。

Dockerコンテナベースの実行

CircleCIでは、Dockerコンテナを使ってビルド環境を構築します。

メリット:

  • 環境の再現性が高い
  • 複数のバージョンを簡単に使い分け
  • クリーンな環境で毎回実行
  • カスタムイメージも使用可能

これにより、「自分の環境では動くのに…」という問題が起きにくくなります。

ワークフロー機能

ワークフローを使うと、複数のジョブを組み合わせて複雑なパイプラインを構築できます。

例:

  • テスト → ビルド → デプロイの順次実行
  • 複数の環境で並列テスト
  • 承認後にのみ本番デプロイ

柔軟な設定で、プロジェクトに最適なCI/CDパイプラインが作れるんです。

Orbs(オーブ)

Orbsは、再利用可能な設定パッケージです。

よく使う処理を簡単に組み込めるので、設定ファイルがシンプルになります。

人気のOrbs:

  • AWS CLI、AWS S3
  • Slack通知
  • Node.js、Python、Rubyのセットアップ
  • Docker操作
  • Herokuデプロイ

まるでプラグインのように、必要な機能を追加できるんですね。

インサイトとアナリティクス

Insights機能で、ビルドのパフォーマンスを分析できます。

確認できる情報:

  • ビルド時間の推移
  • 成功率の統計
  • ボトルネックの特定
  • コスト分析

データに基づいて、パイプラインを最適化できますよ。


CircleCIと他のCI/CDツールの比較

GitHub Actionsとの違い

GitHub Actions:

  • GitHubと完全統合
  • 無料枠が多い(月2,000分)
  • 設定が直感的

CircleCI:

  • 実行速度が速い
  • より高度な並列化
  • 複雑なワークフローに強い
  • Docker操作が優秀

どちらを選ぶ?

  • 小規模プロジェクト → GitHub Actions
  • 高速・大規模プロジェクト → CircleCI

Jenkinsとの違い

Jenkins:

  • 自社サーバーで運用
  • 完全無料
  • 高度なカスタマイズ可能

CircleCI:

  • クラウドサービス
  • メンテナンス不要
  • すぐに使い始められる
  • スケーリングが自動

どちらを選ぶ?

  • 既存インフラがある大企業 → Jenkins
  • クラウド重視のスタートアップ → CircleCI

GitLab CI/CDとの違い

GitLab CI/CD:

  • GitLabに統合
  • セルフホスト可能
  • 無料プランが充実

CircleCI:

  • Git関係なく使える
  • 専門特化で高機能
  • UI/UXが洗練

どちらも優秀なツールですが、GitLabを使っているならGitLab CI/CDが自然な選択ですね。


CircleCIの料金プラン

無料プラン(Free Plan)

提供内容:

  • 月6,000クレジット(約30時間相当)
  • 1並列実行
  • コミュニティサポート

向いているプロジェクト:

  • 個人開発
  • 小規模なオープンソース
  • CircleCIの試用

個人やスモールチームなら、無料プランでも十分使えます。

Performanceプラン

提供内容:

  • 月25,000クレジットから
  • 並列実行数を選択可能
  • サポート付き
  • 高度な機能にアクセス

価格:
月額$30から(クレジット数による)

向いているプロジェクト:

  • スタートアップ
  • 中規模チーム
  • 高速なCI/CDが必要

Scaleプラン

提供内容:

  • カスタムクレジット
  • 無制限の並列実行
  • プレミアムサポート
  • SLA保証

向いているプロジェクト:

  • 大企業
  • 大規模開発チーム
  • ミッションクリティカルなサービス

クレジットシステム

CircleCIでは、クレジットという単位で実行時間を管理します。

計算例:

  • Mediumサイズ(2 CPU):1分 = 10クレジット
  • Largeサイズ(4 CPU):1分 = 20クレジット

つまり、性能の高いマシンを使うと、クレジット消費が増えるわけですね。


基本的な設定方法

前提条件

CircleCIを始めるには、以下が必要です:

  1. GitHubまたはBitbucketのアカウント
  2. プロジェクトリポジトリ
  3. CircleCIアカウント(GitHubで簡単登録)

プロジェクトの追加

手順:

  1. CircleCI(https://circleci.com/)にアクセス
  2. GitHub/Bitbucketでサインイン
  3. 「Set Up Project」をクリック
  4. 対象リポジトリを選択

これだけで、基本的な連携は完了です。

設定ファイルの作成

CircleCIの設定は、.circleci/config.yml ファイルで行います。

ディレクトリ構造:

your-project/
├── .circleci/
│   └── config.yml
├── src/
├── tests/
└── package.json

このファイルに、ビルドやテストの手順を記述していくんです。


基本的なconfig.ymlの構成

最小構成の例

シンプルなNode.jsプロジェクト:

version: 2.1

jobs:
  build:
    docker:
      - image: cimg/node:18.0
    steps:
      - checkout
      - run:
          name: Install dependencies
          command: npm install
      - run:
          name: Run tests
          command: npm test

この設定で、Node.js 18環境でテストが実行されます。

バージョンの指定

version: 2.1

CircleCIの設定ファイルバージョンです。現在は2.1が主流で、Orbsなどの高度な機能が使えます。

jobsとstepsの関係

jobは作業の単位で、stepはその中の個々のタスクです。

構造:

ワークフロー
└── ジョブ1
    ├── ステップ1
    ├── ステップ2
    └── ステップ3
└── ジョブ2
    ├── ステップ1
    └── ステップ2

この階層構造を理解すると、設定が分かりやすくなりますよ。


実践的な設定例

Pythonプロジェクトの例

テストとリントを実行:

version: 2.1

jobs:
  test:
    docker:
      - image: cimg/python:3.11
    steps:
      - checkout

      - restore_cache:
          keys:
            - deps-{{ checksum "requirements.txt" }}

      - run:
          name: Install dependencies
          command: |
            python -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt

      - save_cache:
          key: deps-{{ checksum "requirements.txt" }}
          paths:
            - "venv"

      - run:
          name: Run tests
          command: |
            . venv/bin/activate
            pytest --cov=./ --cov-report=xml

      - run:
          name: Run linter
          command: |
            . venv/bin/activate
            flake8 .

      - store_test_results:
          path: test-results

      - store_artifacts:
          path: coverage.xml

workflows:
  test_workflow:
    jobs:
      - test

ポイント:

  • キャッシュで依存関係のインストールを高速化
  • テスト結果とカバレッジを保存
  • リンターでコード品質をチェック

複数バージョンでのテスト

Matrixビルド:

version: 2.1

jobs:
  test:
    parameters:
      python-version:
        type: string
    docker:
      - image: cimg/python:<< parameters.python-version >>
    steps:
      - checkout
      - run:
          name: Run tests
          command: |
            pip install -r requirements.txt
            pytest

workflows:
  test_all_versions:
    jobs:
      - test:
          matrix:
            parameters:
              python-version: ["3.9", "3.10", "3.11", "3.12"]

Python 3.9から3.12まで、4つのバージョンで並列テストが実行されます。

データベースを使うテスト

PostgreSQLを使用:

version: 2.1

jobs:
  test:
    docker:
      - image: cimg/node:18.0
      - image: cimg/postgres:15.0
        environment:
          POSTGRES_USER: testuser
          POSTGRES_DB: testdb
          POSTGRES_PASSWORD: testpass

    environment:
      DATABASE_URL: postgresql://testuser:testpass@localhost/testdb

    steps:
      - checkout

      - run:
          name: Wait for DB
          command: |
            dockerize -wait tcp://localhost:5432 -timeout 1m

      - run:
          name: Run migrations
          command: npm run migrate

      - run:
          name: Run tests
          command: npm test

workflows:
  version: 2
  test:
    jobs:
      - test

複数のDockerイメージを組み合わせて、データベース付きの環境を構築できるんです。


ワークフローの活用

順次実行

テスト → ビルド → デプロイの順番:

version: 2.1

jobs:
  test:
    docker:
      - image: cimg/node:18.0
    steps:
      - checkout
      - run: npm ci
      - run: npm test

  build:
    docker:
      - image: cimg/node:18.0
    steps:
      - checkout
      - run: npm ci
      - run: npm run build
      - persist_to_workspace:
          root: .
          paths:
            - dist

  deploy:
    docker:
      - image: cimg/node:18.0
    steps:
      - attach_workspace:
          at: .
      - run: ./deploy.sh

workflows:
  version: 2
  build_and_deploy:
    jobs:
      - test
      - build:
          requires:
            - test
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: main

requiresで依存関係を指定すると、前のジョブが成功した場合のみ実行されます。

並列実行

複数のテストを同時実行:

version: 2.1

jobs:
  unit_test:
    docker:
      - image: cimg/node:18.0
    steps:
      - checkout
      - run: npm ci
      - run: npm run test:unit

  integration_test:
    docker:
      - image: cimg/node:18.0
    steps:
      - checkout
      - run: npm ci
      - run: npm run test:integration

  lint:
    docker:
      - image: cimg/node:18.0
    steps:
      - checkout
      - run: npm ci
      - run: npm run lint

workflows:
  version: 2
  test_workflow:
    jobs:
      - unit_test
      - integration_test
      - lint

3つのジョブが同時に実行されて、時間を大幅に短縮できます。

承認ステップ

手動承認後にデプロイ:

workflows:
  version: 2
  build_test_deploy:
    jobs:
      - test
      - build:
          requires:
            - test
      - hold:
          type: approval
          requires:
            - build
      - deploy:
          requires:
            - hold

holdジョブで、人間の承認を待ちます。本番デプロイ前のチェックポイントとして便利ですね。


Orbsの活用

Orbsとは

Orbsは、再利用可能な設定パッケージです。

公式やコミュニティが提供する便利な機能を、簡単に追加できるんです。

Orbsの使い方

基本構文:

version: 2.1

orbs:
  node: circleci/node@5.0
  slack: circleci/slack@4.10

jobs:
  test:
    executor: node/default
    steps:
      - checkout
      - node/install-packages
      - run: npm test
      - slack/notify:
          event: fail
          template: basic_fail_1

workflows:
  test_and_notify:
    jobs:
      - test

Node.jsのセットアップとSlack通知が、たった数行で実装できました。

人気のOrbs

AWS関連:

orbs:
  aws-cli: circleci/aws-cli@3.1
  aws-s3: circleci/aws-s3@3.0
  aws-ecr: circleci/aws-ecr@8.2

通知系:

orbs:
  slack: circleci/slack@4.10
  discord: antonioned/discord@0.1

言語・ツール:

orbs:
  node: circleci/node@5.0
  python: circleci/python@2.1
  docker: circleci/docker@2.2
  kubernetes: circleci/kubernetes@1.3

デプロイ:

orbs:
  heroku: circleci/heroku@2.0
  gcp: circleci/gcp@3.0

Orbsを使えば、複雑な設定も簡単に書けるんですよ。


キャッシュの活用

キャッシュの重要性

依存関係のインストールは時間がかかります。

キャッシュを使えば、前回ダウンロードしたファイルを再利用して、大幅な高速化ができるんです。

キャッシュの基本

保存:

- save_cache:
    key: deps-{{ checksum "package-lock.json" }}
    paths:
      - node_modules

復元:

- restore_cache:
    keys:
      - deps-{{ checksum "package-lock.json" }}
      - deps-

checksumで、ファイルの内容が変わったら新しいキャッシュを作成します。

複数のキャッシュキー

フォールバック戦略:

- restore_cache:
    keys:
      - deps-v1-{{ checksum "package-lock.json" }}
      - deps-v1-{{ .Branch }}
      - deps-v1-

完全一致がなければ、部分一致を探してくれるので便利です。

Pythonの例

- restore_cache:
    keys:
      - pip-{{ checksum "requirements.txt" }}

- run:
    name: Install dependencies
    command: pip install -r requirements.txt

- save_cache:
    key: pip-{{ checksum "requirements.txt" }}
    paths:
      - ~/.cache/pip

キャッシュを使うと、2回目以降のビルドが数倍速くなることもありますよ。


アーティファクトとテスト結果

アーティファクトの保存

アーティファクトは、ビルドで生成されたファイルのことです。

- run:
    name: Build
    command: npm run build

- store_artifacts:
    path: dist
    destination: build-output

ビルド済みファイルやログを保存しておくと、後で確認できて便利なんです。

テスト結果の保存

テスト結果を特別な形式で保存できます。

- run:
    name: Run tests
    command: |
      npm test -- --ci --reporters=default --reporters=jest-junit
    environment:
      JEST_JUNIT_OUTPUT_DIR: ./test-results

- store_test_results:
    path: ./test-results

- store_artifacts:
    path: ./test-results

CircleCIのUIで、テスト結果が見やすく表示されるようになります。


環境変数とシークレット管理

環境変数の設定

設定ファイル内:

jobs:
  deploy:
    docker:
      - image: cimg/node:18.0
    environment:
      NODE_ENV: production
      LOG_LEVEL: info
    steps:
      - run: echo $NODE_ENV

CircleCI UI経由:
プロジェクト設定 → Environment Variables

ここで設定した値は、すべてのビルドで利用できます。

シークレット情報の管理

絶対にやってはいけないこと:

# NG: パスワードを直接書く
- run: aws s3 cp file.txt s3://bucket --password=secret123

正しい方法:

# OK: 環境変数を使う
- run: aws s3 cp file.txt s3://bucket --password=$AWS_PASSWORD

機密情報は必ずCircleCI UIの環境変数として設定しましょう。

Contextsの活用

Contextを使うと、複数のプロジェクトで環境変数を共有できます。

workflows:
  deploy_workflow:
    jobs:
      - deploy:
          context: aws-production

Organization Settings → Contexts で設定します。


並列実行とテスト分割

並列実行の設定

大量のテストがある場合、分割して並列実行すると速くなります。

version: 2.1

jobs:
  test:
    docker:
      - image: cimg/node:18.0
    parallelism: 4
    steps:
      - checkout
      - run: npm ci
      - run:
          name: Run tests
          command: |
            TESTFILES=$(circleci tests glob "tests/**/*.test.js" | circleci tests split --split-by=timings)
            npm test $TESTFILES
      - store_test_results:
          path: test-results

workflows:
  test_workflow:
    jobs:
      - test

parallelism: 4で、4つのコンテナで並列実行されます。

テスト分割の種類

タイミングベース:

circleci tests split --split-by=timings

過去の実行時間を見て、均等に分割します。

ファイル名ベース:

circleci tests split --split-by=name

ファイル名でアルファベット順に分割します。

ファイルサイズベース:

circleci tests split --split-by=filesize

ファイルサイズで分割します。

並列実行を使えば、30分かかっていたテストが10分で終わることもあるんですよ。


Docker操作とビルド

Dockerイメージのビルド

version: 2.1

jobs:
  build_and_push:
    docker:
      - image: cimg/base:stable
    steps:
      - checkout
      - setup_remote_docker:
          version: 20.10.14

      - run:
          name: Build Docker image
          command: |
            docker build -t myapp:${CIRCLE_SHA1} .

      - run:
          name: Push to Docker Hub
          command: |
            echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin
            docker push myapp:${CIRCLE_SHA1}

workflows:
  build_workflow:
    jobs:
      - build_and_push

setup_remote_dockerで、Docker操作ができるようになります。

Docker Layerキャッシング

Docker Layer Caching(DLC)を使うと、イメージビルドが高速化されます。

- setup_remote_docker:
    version: 20.10.14
    docker_layer_caching: true

注意: Performanceプラン以上で利用可能です。


スケジュール実行

定期実行の設定

毎日決まった時間にビルドを実行できます。

version: 2.1

workflows:
  nightly:
    triggers:
      - schedule:
          cron: "0 0 * * *"
          filters:
            branches:
              only:
                - main
    jobs:
      - test
      - build

cron形式:

  • 0 0 * * *:毎日0時
  • 0 12 * * 1-5:平日の12時
  • 0 */4 * * *:4時間ごと

定期的な統合テストや、nightly buildに便利ですね。


トラブルシューティング

問題1:ビルドが遅い

原因:

  • キャッシュが効いていない
  • 並列実行していない
  • 重いDockerイメージ

解決策:

キャッシュの確認:

- restore_cache:
    keys:
      - deps-{{ checksum "package-lock.json" }}

並列実行の導入:

parallelism: 4

軽量イメージの使用:

docker:
  - image: cimg/node:18.0  # 公式の軽量イメージ

問題2:テストが不安定

症状:
時々成功、時々失敗する(Flaky Test)

原因:

  • タイムアウト設定が短い
  • 非同期処理の待機不足
  • 並列実行での競合

解決策:

タイムアウトの延長:

- run:
    name: Run tests
    command: npm test
    no_output_timeout: 30m

リトライ設定:

- run:
    name: Run tests
    command: npm test
    when: always

問題3:環境変数が反映されない

確認すべきこと:

  1. CircleCI UIで設定されているか
  2. スペルミスがないか
  3. Contextが正しく指定されているか

デバッグ:

- run:
    name: Debug env vars
    command: |
      echo "NODE_ENV: $NODE_ENV"
      printenv | grep MY_VAR

問題4:SSH接続でデバッグ

ビルドが失敗したとき、実際の環境に入って確認できます。

CircleCI UI:

  1. 失敗したビルドを開く
  2. 「Rerun job with SSH」をクリック
  3. 表示されたSSHコマンドを実行
ssh -p 64535 ubuntu@54.123.45.67

実際の環境で、コマンドを試せるので便利ですよ。


ベストプラクティス

1. 小さく保つ

各ジョブは独立して動作するように設計しましょう。

良い例:

  • testジョブ
  • buildジョブ
  • deployジョブ

悪い例:

  • すべてを1つのジョブに詰め込む

2. キャッシュを積極的に使う

依存関係は必ずキャッシュしましょう。

- restore_cache
- run: install dependencies
- save_cache

この3ステップは定型パターンです。

3. Orbsで車輪の再発明を避ける

よくある処理は、Orbsを使いましょう。

orbs:
  node: circleci/node@5.0

jobs:
  test:
    executor: node/default
    steps:
      - node/install-packages  # 自動でキャッシュ付き
      - run: npm test

4. 通知を設定する

失敗したらすぐ気づけるよう、Slack通知などを設定しましょう。

orbs:
  slack: circleci/slack@4.10

jobs:
  deploy:
    steps:
      - run: ./deploy.sh
      - slack/notify:
          event: fail
          custom: |
            {
              "text": "デプロイが失敗しました!"
            }

5. ブランチごとに挙動を変える

workflows:
  build_and_test:
    jobs:
      - test
      - deploy:
          requires:
            - test
          filters:
            branches:
              only: main

mainブランチだけデプロイする、といった制御が可能です。

6. ワークスペースで共有

ジョブ間でファイルを共有するには、ワークスペースを使います。

- persist_to_workspace:
    root: .
    paths:
      - dist

# 別のジョブで
- attach_workspace:
    at: .

まとめ

CircleCIは、高速で柔軟なCI/CDを実現する強力なプラットフォームです。

この記事のポイント:

  • CircleCIは高速実行と柔軟な設定が特徴
  • .circleci/config.ymlで設定する
  • Docker完全対応で環境構築が簡単
  • ワークフローで複雑なパイプラインを構築可能
  • Orbsで再利用可能な設定を簡単に追加
  • キャッシュと並列実行で大幅な高速化
  • 無料プランでも十分実用的
  • 環境変数でシークレット情報を安全に管理
  • テスト分割で大規模テストも高速実行

最初は設定ファイルの書き方に慣れが必要かもしれません。

でも、基本的なパターンを覚えてしまえば、あとは応用するだけで様々なプロジェクトに対応できますよ。

まずはシンプルな設定から始めて、徐々に機能を追加していくのがおすすめです。

CircleCIを使えば、手作業から解放されて、本当に価値のある開発作業に集中できるようになります。

さあ、あなたのプロジェクトにもCircleCIを導入して、開発体験を劇的に向上させてみませんか?自動化の力を実感できるはずですよ!

コメント

タイトルとURLをコピーしました