TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

CircleCIを活用した複数OS上でのテスト実行方法

CircleCIで始めるクロスOS自動テスト:LinuxmacOSWindowsを一括検証!

近年、クロスプラットフォームなソフトウェア開発が当たり前となり、アプリケーションの品質を保証するには複数のOS環境での自動テストが欠かせません。特にNode.js、PythonC++などの汎用的な言語では、OS依存の動作差異がバグの温床になることもしばしば。

この記事では、CI/CDプラットフォーム「CircleCI」を活用して、LinuxmacOSWindowsの複数OS上でテストを自動実行する方法を詳しく解説します。環境ごとの注意点や、実際のconfig.ymlの記述例、実用上の工夫まで、実践的に学びましょう。


1. なぜOS別にテストするのか?

クロスOSテストの意義

  • パスの違い(スラッシュとバックスラッシュ)
  • ファイルパーミッションの扱い
  • ソケットやファイルロックの挙動
  • 文字コードや改行コードの差異
  • 依存ライブラリのビルド方法やパッケージ名

これらは、WindowsLinuxmacOSでしばしば異なる挙動を示します。特にnpmやpipなどのエコシステムを使った場合、プラットフォーム依存のトラブルは日常茶飯事です。


2. CircleCIの実行環境について

CircleCIは、次の3種類の実行環境(executor)をサポートしています:

Executor 対応OS 特徴
docker Linux 高速でキャッシュも効く
machine Linux/Windows VMベースで柔軟なカスタマイズ可
macos macOS Xcode環境付き、iOS開発に対応

3. 実践:クロスOS対応のconfig.ymlを作ってみる

ここでは、Node.jsアプリケーションを例に、複数のOS + バージョンでマトリクステストを構成するconfig.ymlを紹介します。

version: 2.1

executors:
  linux:
    docker:
      - image: cimg/node:<<parameters.node_version>>
  macos:
    macos:
      xcode: 14.2.0
  windows:
    machine:
      image: windows-server-2019-vs2019:stable

jobs:
  test:
    parameters:
      os:
        type: enum
        enum: [linux, macos, windows]
      node_version:
        type: string
    executor: <<parameters.os>>
    steps:
      - checkout
      - run:
          name: Node.jsバージョン確認
          command: node -v
      - run:
          name: テスト実行
          command: npm test

workflows:
  version: 2
  test_matrix:
    matrix:
      parameters:
        os: [linux, macos, windows]
        node_version: ["14.17.0", "16.13.0"]
    jobs:
      - test:
          os: <<matrix.os>>
          node_version: <<matrix.node_version>>

この構成で実現できること:

  • Linux / macOS / Windows のそれぞれで
  • Node.js の2つのバージョン(例: 14.17.0と16.13.0)
  • 計6通りの組み合わせで並列に自動テスト!

4. 各OSごとの注意点

macOS

  • macos executor は 有料プランのみ対応
  • Xcodeのバージョンを指定する必要あり
  • 初回起動が重めなので キャッシュ設定が重要

Windows

  • machine executor を使う(Dockerは非対応)
  • PowerShellやcmdベースのコマンドに注意
  • ビルド時間が長くなる傾向あり(特にnpm install)

Linux

  • docker executor が高速・軽量でおすすめ
  • キャッシュ機構(save_cache / restore_cache)が使いやすい

5. Tips:高速化とコスト最適化

並列実行の活用

CircleCIでは、ジョブをマトリクス化することで 並列に実行 できます。これにより時間短縮が可能ですが、プランに応じて同時実行数の制限があるため注意。

キャッシュの利用

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

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

6. まとめ

比較項目 Linux (docker) macOS (macos) Windows (machine)
実行速度
安定性
コスト 無料プランOK 有料のみ 有料のみ
運用難易度

CircleCIのマトリクス機能を使えば、クロスOSテストの自動化は思ったより簡単に実現できます。オープンソース開発やチーム開発、ライブラリの配布を行うプロジェクトでは、必ず取り入れたいテスト戦略です。


参考リンク

参考書籍