コンテンツにスキップ

GitHub Actions Matrix Strategy で実現する並列CI/CD最適化術

この記事の対象者

  • 複数環境でのテスト実行に時間がかかって困っている中級者

この記事のポイント

  1. Matrix戦略による並列ビルド設定
  2. 動的Matrixによる効率的な条件分岐
  3. ビルド時間の80%削減

なぜこの問題が今重要か

従来の逐次的なCI/CDパイプラインでは、Node.js・Python・Goなど複数言語環境のテストに15分以上かかることが一般的。Matrix戦略により、これを3分以内に短縮可能。

解決ステップ概要

ステップ内容到達指標
1基本Matrix設定3環境並列化
2動的Matrix生成条件付き実行
3fail-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

次に読む(関連1〜2本)