ソフトウェア開発で「CI/CD」を導入しようと考えたとき、どのツールを選べばいいか迷いますよね。
「GitHub Actionsは知ってるけど、CircleCIって何が違うの?」「設定が難しそう…」と感じている方も多いはずです。
実は、CircleCIは高速実行と柔軟な設定が特徴の、世界中の開発チームに愛用されている強力なCI/CDプラットフォームなんです。FacebookやSpotifyなど、大規模サービスでも採用されている実績があるんですよ。
この記事では、CircleCIの基礎知識から実践的な設定方法まで、初心者の方にも分かりやすく解説していきます。
具体的な設定例をたくさん見ながら、あなたのプロジェクトにもCircleCIを導入してみましょう!
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にプッシュすると、自動的にビルドとテストが実行されます。
典型的な流れ:
- 開発者がコードをプッシュ
- CircleCIが変更を検知
- 自動的にビルド環境を起動
- テストを実行
- 結果を通知
すべて自動なので、手作業は一切不要なんです。
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を始めるには、以下が必要です:
- GitHubまたはBitbucketのアカウント
- プロジェクトリポジトリ
- CircleCIアカウント(GitHubで簡単登録)
プロジェクトの追加
手順:
- CircleCI(https://circleci.com/)にアクセス
- GitHub/Bitbucketでサインイン
- 「Set Up Project」をクリック
- 対象リポジトリを選択
これだけで、基本的な連携は完了です。
設定ファイルの作成
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:環境変数が反映されない
確認すべきこと:
- CircleCI UIで設定されているか
- スペルミスがないか
- Contextが正しく指定されているか
デバッグ:
- run:
name: Debug env vars
command: |
echo "NODE_ENV: $NODE_ENV"
printenv | grep MY_VAR
問題4:SSH接続でデバッグ
ビルドが失敗したとき、実際の環境に入って確認できます。
CircleCI UI:
- 失敗したビルドを開く
- 「Rerun job with SSH」をクリック
- 表示された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を導入して、開発体験を劇的に向上させてみませんか?自動化の力を実感できるはずですよ!

コメント