GitHub Actions 第4回 matrix と needs

1つの Node.js だけでなく、18 と 20 で両方 OK か確認したい場面があります。手で2回やるのは面倒 → GitHub Actions の matrix 機能で自動展開。

2025年9月9日 ・ GitHub Actions

第4回 複数バージョンを同時に試す:matrix と needs の最初の一歩

(対象: テスト + secrets + キャッシュを触った人)


この記事でできるようになること

  • matrix(組み合わせ展開)で複数バージョンを一度にテスト
  • needs でジョブの実行順を決める
  • 並列と順番制御の違いを理解
  • concurrency(重複防止)の入口を知る
  • シンプルな “ビルド → テスト →(ダミー)デプロイ” の流れを作る

1. 複数バージョンを試したい理由

1つの Node.js だけでなく、18 と 20 で両方 OK か確認したい場面があります。手で2回やるのは面倒 → GitHub Actions の matrix 機能で自動展開。


2. matrix の最小例

name: matrix-sample
on: [push]
jobs:
	test:
		runs-on: ubuntu-latest
		strategy:
			matrix:
				node: [18, 20]
		steps:
			- uses: actions/checkout@v4
			- uses: actions/setup-node@v4
				with:
					node-version: ${{ matrix.node }}
			- run: node -v
			- run: echo "テスト(仮) for ${{ matrix.node }}"

ポイント:

  • matrix.node に [18,20] → 2バージョン分 “別ジョブ” として並列実行
  • ${{ matrix.node }} でその回の値を参照

[図7 挿入予定]

  • Alt: "node:18 と node:20 の2つの箱が並列で走っている図"
  • キャプション案: 図7: matrix が 2 つのテストジョブを生成

3. needs で順番を決める

ビルド → テスト → デプロイ の流れをシンプルに表現。

name: flow-sample
on: [push]
jobs:
	build:
		runs-on: ubuntu-latest
		steps:
			- run: echo "(仮) ビルド処理"
	test:
		runs-on: ubuntu-latest
		needs: build
		steps:
			- run: echo "(仮) テスト処理"
	deploy:
		runs-on: ubuntu-latest
		needs: test
		steps:
			- run: echo "(仮) デプロイ処理"

ポイント:

  • build が失敗したら test / deploy は実行されない
  • needs で “前の結果が成功したら進む” 依存関係

[図8 挿入予定]

  • Alt: "build → test → deploy と矢印でつながる直線"
  • キャプション案: 図8: needs による直列実行

4. 並列と順番の組み合わせ

  1. test を matrix で複数バージョン
  2. すべて成功したら deploy
name: matrix-and-deploy
on: [push]
jobs:
	test:
		runs-on: ubuntu-latest
		strategy:
			matrix:
				node: [18, 20]
		steps:
			- uses: actions/checkout@v4
			- uses: actions/setup-node@v4
				with:
					node-version: ${{ matrix.node }}
			- run: echo "テストOK version=${{ matrix.node }}"
	deploy:
		runs-on: ubuntu-latest
		needs: test
		steps:
			- run: echo "全部成功したのでデプロイ(仮)"

挙動:

  • 2つの test ジョブが並列
  • 両方緑なら deploy が実行
  • どれか赤なら deploy はスキップ

5. concurrency(重複防止)軽く紹介

同じブランチで “前のデプロイがまだ走っているのに次を開始” すると無駄。入口例:

concurrency:
	group: deploy-${{ github.ref }}
	cancel-in-progress: true

これをワークフローの name: の下あたりに置くと、同じ group の古い実行を止めて最新だけ残せる。詳細は発展テーマ。


6. よくあるつまずき

症状 原因 対策
matrix の1つだけ失敗 その条件でバグ 失敗ログを個別ジョブで確認
deploy が動かない needs の前ジョブ失敗 test 全部の結果を見る
ジョブ数が想定超過 matrix の組み合わせが多い バージョン数を一旦減らす

7. ミニ課題

ここまでOK:

  1. matrix で 2バージョン同時テストを動かした
  2. needs で build → test → deploy の順番を再現

余裕チャレンジ:

  1. OS も追加(os: [ubuntu-latest, windows-latest])して組み合わせを増やす
  2. 失敗するバージョンだけ echo でエラーを出し挙動を観察
  3. concurrency を試し、連続 push の古い実行がキャンセルされるか確認

8. Q&A

Q. matrix を3軸にしたら? → 組み合わせが一気に増えるので注意。 Q. needs を複数指定できる? → needs: [build, lint] のように配列可。 Q. 途中だけ再実行したい → GitHub UI の “Rerun jobs” 機能を確認(変更される場合あり)。


9. まとめ

  • matrix で複数条件を一気に検証
  • needs でジョブの依存を表現
  • 並列(早く幅広く試す)と 直列(安全な流れ)の組み合わせが基礎
  • concurrency で重複実行ロスを減らす入口を知った

次回予告: cron(決まった時間)・通知・権限(permissions) 最小化で“運用っぽさ”へ。


(終) 第4回

Automation CI