GitHub Actions Matrix Strategy で実現する並列CI/CD最適化術¶
この記事の対象者
- 複数環境でのテスト実行に時間がかかって困っている中級者
この記事のポイント¶
- Matrix戦略による並列ビルド設定
- 動的Matrixによる効率的な条件分岐
- ビルド時間の80%削減
なぜこの問題が今重要か¶
従来の逐次的なCI/CDパイプラインでは、Node.js・Python・Goなど複数言語環境のテストに15分以上かかることが一般的。Matrix戦略により、これを3分以内に短縮可能。
解決ステップ概要¶
| ステップ | 内容 | 到達指標 |
|---|---|---|
| 1 | 基本Matrix設定 | 3環境並列化 |
| 2 | 動的Matrix生成 | 条件付き実行 |
| 3 | fail-fast最適化 | エラー時即停止 |
ステップ1: 基本Matrix設定¶
複数のNode.jsバージョンでテストを並列実行する設定:
jobs:
test:
strategy:
matrix:
node: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- run: npm test
これで6つの組み合わせ(3 Node × 2 OS)が並列実行される。
ステップ2: 動的Matrix生成¶
変更されたファイルに応じて必要なテストのみ実行:
jobs:
prepare:
outputs:
matrix: ${{ steps.set.outputs.matrix }}
steps:
- id: set
run: |
if [[ "${{ github.event.head_commit.message }}" == *"[python]"* ]]; then
echo "matrix={\"language\":[\"python\"]}" >> $GITHUB_OUTPUT
else
echo "matrix={\"language\":[\"node\",\"python\",\"go\"]}" >> $GITHUB_OUTPUT
fi
test:
needs: prepare
strategy:
matrix: ${{ fromJSON(needs.prepare.outputs.matrix) }}
ステップ3: fail-fast最適化¶
1つでも失敗したら全体を即停止し、無駄な実行を防ぐ:
strategy:
fail-fast: true
matrix:
include:
- { lang: node, cmd: "npm test" }
- { lang: python, cmd: "pytest" }
- { lang: go, cmd: "go test ./..." }
よくある落とし穴と対処¶
| 症状 | 原因 | 即時対処 |
|---|---|---|
| Matrixが6個までしか並列化されない | デフォルト制限 | max-parallel: 10 追加 |
| Windows環境だけ遅い | パス区切り文字 | ${{ runner.os == 'Windows' && '\\' \|\| '/' }} |
| 特定組み合わせでエラー | 環境依存 | exclude: で除外設定 |
詳細設定(高度最適化)
### キャッシュ戦略との組み合わせ- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ matrix.os }}-${{ matrix.node }}-${{ hashFiles('**/package-lock.json') }}
- if: matrix.os == 'ubuntu-latest'
run: npm run lint