こんにちは!日々の開発、本当にお疲れ様です。
新しい機能を実装して「よし、動いた!」とプルリクエストを出した瞬間のワクワク感、そしてその後の「CI(継続的インテグレーション)のビルド待ち」の時間の長さ……。あの待ち時間にコーヒーを淹れに行っているエンジニア、多いんじゃないでしょうか?
しかも、「Ubuntuでは動いたのに、Windowsのユーザーから『動かないよ』って言われた」「Python 3.10では問題ないのに、最新の3.12でエラーが出る……」なんて悪夢、経験したことありませんか?
すべてのOS、すべての言語バージョンで手元でテストするなんて、時間的にもマシンのスペック的にも不可能ですよね。
でも、ご安心ください。GitHub Actionsの「Matrix(マトリックス)戦略」をマスターすれば、この地獄のような環境検証地獄から一瞬で抜け出すことができます。
これをマスターすれば、あなたの開発ライフは劇的に、そして圧倒的に楽になりますよ。さあ、一緒にその扉を開けてみましょう!
—
1. Matrix戦略とは?(ツールの役割)
GitHub ActionsにおけるMatrix戦略とは、一言で言うと「組み合わせ爆発を、美しく並列処理するための魔法の構文」です。
通常、GitHub Actionsでワークフロー(自動化のレシピ)を書くとき、1つのジョブ(作業単位)は1つの環境で実行されます。もし「Ubuntu、macOS、Windows」×「Python 3.10, 3.11, 3.12」の全組み合わせ(3 × 3 = 9通り)をテストしようとすると、普通に書けば9つの設定ファイルをバラバラに用意しなければなりません。考えただけでも気が遠くなりますよね。
Matrix戦略を使えば、たった数行の変数の組み合わせを定義するだけで、GitHubが勝手に全パターンの仮想マシンを立ち上げ、裏側で一斉に(並列で)テストを走らせてくれるのです。
なぜこれが「テスト時間の短縮」になるのか?
「えっ、9個も同時に動かしたら逆に遅くなるんじゃ……?」いいえ、逆です。
逐次実行(1つずつ順番にテスト)していけば、もし1テストに2分かかるとしたら $9 \times 2 = 18分$ かかります。しかし、Matrixを使って9つの環境で完全並列に走らせれば、一番遅いジョブが完了する時間(実質約2分前後)で全ての検証が終わります。
カバレッジ(網羅性)を1ミリも妥協せず、実行時間は最小限に抑える。これこそが、プロのDevOpsエンジニアが使うスケーラブルなテスト戦略です。
—
2. 基礎セットアップ:最小限のMatrixを書いてみよう
百聞は一見にしかず。まずはシンプルな「Hello World」ならぬ「Matrix版動作確認」を見ていきましょう。
プロジェクトのルートディレクトリに `.github/workflows/test.yml` というファイルを作成します。これがGitHub Actionsのレシピになります。
name: Basic Matrix Test
1. どんなトリガー(きっかけ)でこのワークフローを動かすか
on:
push:
branches: [ “main” ]
pull_request:
branches: [ “main” ]
jobs:
test:
runs-on: ubuntu-latest # このジョブ自体のベース環境
# 2. ここがMatrix戦略の核心部分!
strategy:
matrix:
node-version: [18.x, 20.x, 22.x] # テストしたいNode.jsのバージョンをリスト化
steps:
# リポジトリのコードを仮想マシンの上にチェックアウトする
- name: Checkout Code
uses: actions/checkout@v4
# 指定したNode.jsのバージョンをセットアップ(Matrixの変数を動的に埋め込む)
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
# 動作確認のテストを実行
- name: Run Test
run: |
echo “現在テスト中のNode.jsバージョン: ${{ matrix.node-version }}”
node -v
この設定のポイント
- `${{ matrix.node-version }}` という記述に注目してください。ここに、リストで定義した `18.x` `20.x` `22.x` がそれぞれ代入され、3つの独立したジョブが同時に走り始めます。
- たったこれだけの記述で、複数バージョンの動作担保が自動化されてしまいます。最高にシンプルですよね。
—
3. 【応用】OS × 言語バージョンのクロスプラットフォーム検証
基礎が分かったところで、次は一歩進んだ実戦的な設定を解説します。
「Ubuntu」「macOS」「Windows」の3大OSと、「Python 3.10」「3.12」の2つの言語バージョンをすべて掛け合わせてテストする、いわゆる「クロスプラットフォーム検証」です。
name: Cross-Platform & Multi-Version Matrix
on:
push:
branches: [ “main” ]
jobs:
matrix-test:
# どのOSで動かすかをmatrixの変数から受け取る
runs-on: ${{ matrix.os }}
strategy:
# fail-fast: false にするのがプロの技。
# デフォルトでは、1つの環境でテストが失敗した瞬間に他の実行中のテストも強制終了されます。
# 「どのOSでエラーが出て、どのOSで成功しているか」を一覧で把握したいので、falseにするのが鉄則です。
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
python-version: [“3.10”, “3.12”]
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install Dependencies
run: |
python -m pip install –upgrade pip
# 必要に応じて依存関係をインストール
# pip install -r requirements.txt
- name: Run Pytest
run: |
echo “OS: ${{ matrix.os }} / Python: ${{ matrix.python-version }} でテスト実行中”
python -c “import sys; print(sys.version)”
# 実際のテストコマンド(例: pytest)をここに書く
# pytest
ここが知見:`fail-fast: false` の重要性
設定内でもコメントしましたが、`fail-fast: false` は絶対に覚えておいてください。
これが `true`(デフォルト)だと、例えば Windows環境のテストでしょぼいタイポ(誤字)によるエラーが起きた瞬間、まだ正常に動きそうだった Ubuntu や macOS のテストまで途中でキャンセルされてしまいます。「どこにバグが潜んでいるのか」の全体像を一度のCI実行で把握するために、マルチ環境のときは必ず `false` に設定しましょう。
—
4. さらに賢く!特定の組み合わせを除外・追加するテクニック(include / exclude)
「おっ、いい感じに網羅できたぞ」と思っても、現実のプロジェクトではこんなジレンマにぶつかります。
- 「Mac環境では、古いPython 3.10のテストはスキップしたい(時間がもったいない)」
- 「特定の実験的な組み合わせ(例:最新のWindows × 開発中の特定バージョン)だけに、追加の環境変数を渡したい」
こういうときに使うのが、Matrixの `exclude`(除外) と `include`(追加・拡張) です。
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: [“3.10”, “3.11”, “3.12”]
# 1. 特定の組み合わせをテスト対象から除外する
exclude:
- os: macos-latest
python-version: “3.10” # MacでのPython 3.10テストは不要なので除外!
# 2. 特定の組み合わせにだけ、カスタム変数を追加する
include:
- os: windows-latest
python-version: “3.12”
custom-flag: “–win-special-mode” # Windowsの最新版だけにフラグを追加
このように、ただ機械的に掛け算するだけでなく、プロジェクトの現実のコスト感に合わせてマトリックスをチューニングできるようになると、GitHub Actionsの使いこなしレベルが一気に「上級者」になります。
—
まとめ
今回は、GitHub ActionsのMatrix戦略について、基礎から実践的なクロスプラットフォーム検証、そしてプロが使うテクニックまでを解説しました。
- Matrix戦略を使えば、複数OS・複数言語のテストを完全並列化でき、網羅性を落とさずにテスト時間を劇的に短縮できる。
- マルチ環境のときは `fail-fast: false` を設定し、全環境の結果を漏れなく回収する。
- `exclude` や `include` を駆使して、無駄なテストコストを削りつつ、必要な特殊ケースをケアする。
これを導入すれば、「自分のローカルでは動いたのに!」というエンジニア特有のストレスから解放され、自信を持ってコードをmainブランチにマージできるようになります。
毎日の開発作業が、ほんの少し、でも確実に快適になりますよ。
あなたのCI/CDパイプラインが、今日もスムーズに、美しく回ることを祈っています!