無料ユーザも使える!GitLab 18.6 の CI/CD 新機能 ─ parallel:matrix でジョブ依存関係が劇的にスッキリ
はじめに
2025年11月20日にリリースされた GitLab 18.6 には、無料プランのユーザもすぐに使える CI/CD 機能の強化が含まれています。
今回は、その中でも特に嬉しいアップデートである needs:parallel:matrix における動的ジョブ依存関係のサポート にフォーカスして解説します。複数プラットフォーム・複数環境向けのビルドやデプロイパイプラインを書いている方には、ぜひ知っておいてほしい機能です。
対象バージョンとプラン
| 項目 | 内容 |
|---|---|
| 対象バージョン | GitLab 18.6(2025年11月20日リリース) |
| 対象プラン | Free / Premium / Ultimate(無料ユーザも使えます!) |
| 利用環境 | GitLab.com / GitLab Self-Managed / GitLab Dedicated |
| ステータス | GitLab 18.6 で導入 |
これまでの課題
parallel:matrix を使うと、複数の変数の組み合わせで並列ジョブを簡単に生成できます。しかし、後続ジョブが前のジョブに needs で依存しようとすると、全組み合わせを手動で列挙しなければなりませんでした。
たとえば、PROVIDER: [aws, gcp] と STACK: [monitoring, app1, app2] の組み合わせ(6通り)すべてについて、個別に依存関係を記述する必要があったのです。
組み合わせが増えるほど設定は複雑化し、ミスが起きやすくなっていました。
GitLab 18.6 の新機能: マトリクス式 $[[ matrix.VARIABLE ]]
GitLab 18.6 では、マトリクス式 と呼ばれる新しい構文 $[[ matrix.VARIABLE ]] が導入されました。
これにより、「自分自身が持つ parallel:matrix の変数値を、依存先の指定にそのまま使う」という 1対1のダイナミックなジョブ依存関係 を宣言的に書けるようになりました。
構文
needs:
- job: some-job
parallel:
matrix:
- VARIABLE: ['$[[ matrix.VARIABLE ]]']
具体例: ビルドとテストを 1対1 で対応させる
linux:build:
stage: build
script: echo "Building..."
parallel:
matrix:
- PROVIDER: [aws, gcp]
STACK: [monitoring, app1, app2]
linux:test:
stage: test
script: echo "Testing..."
parallel:
matrix:
- PROVIDER: [aws, gcp]
STACK: [monitoring, app1, app2]
needs:
- job: linux:build
parallel:
matrix:
- PROVIDER: ['$[[ matrix.PROVIDER ]]']
STACK: ['$[[ matrix.STACK ]]']
このように書くだけで、GitLab が自動的に以下の依存関係を解決してくれます。
-
linux:test: [aws, monitoring]はlinux:build: [aws, monitoring]に依存 -
linux:test: [aws, app1]はlinux:build: [aws, app1]に依存 -
linux:test: [gcp, app2]はlinux:build: [gcp, app2]に依存 - ...(全6通り自動解決)
全組み合わせを手書きする必要がなくなります。
YAML アンカーと組み合わせてさらにスッキリ
YAML アンカー(& / *)を使えば、parallel:matrix の定義を使い回すことができます。
stages:
- compile
- test
- deploy
.build_matrix: &build_matrix
parallel:
matrix:
- OS: ["ubuntu", "alpine"]
ARCH: ["amd64", "arm64"]
VARIANT: ["slim", "full"]
compile_binary:
stage: compile
script:
- echo "Compiling for $OS-$ARCH-$VARIANT"
<<: *build_matrix
integration_test:
stage: test
script:
- echo "Testing $OS-$ARCH-$VARIANT"
<<: *build_matrix
needs:
- job: compile_binary
parallel:
matrix:
- OS: ['$[[ matrix.OS ]]']
ARCH: ['$[[ matrix.ARCH ]]']
VARIANT: ['$[[ matrix.VARIANT ]]']
deploy_artifact:
stage: deploy
script:
- echo "Deploying $OS-$ARCH-$VARIANT"
<<: *build_matrix
needs:
- job: integration_test
parallel:
matrix:
- OS: ['$[[ matrix.OS ]]']
ARCH: ['$[[ matrix.ARCH ]]']
VARIANT: ['$[[ matrix.VARIANT ]]']
この設定では、2 OS × 2 ARCH × 2 VARIANT = 8通り × 3ステージ = 計24ジョブ が生成され、それぞれのステージ間で 1対1 の依存関係が自動的に設定されます。
一部の値のみに絞った依存関係も可能
マトリクス式は、固定値と組み合わせることもできます。
stages:
- prepare
- build
.full_matrix: &full_matrix
parallel:
matrix:
- PLATFORM: ["linux", "windows", "macos"]
VERSION: ["16", "18", "20"]
.platform_only: &platform_only
parallel:
matrix:
- PLATFORM: ["linux", "windows", "macos"]
prepare_env:
stage: prepare
script:
- echo "Preparing $PLATFORM with Node.js $VERSION"
<<: *full_matrix
build_project:
stage: build
script:
- echo "Building on $PLATFORM"
<<: *platform_only
needs:
- job: prepare_env
parallel:
matrix:
- PLATFORM: ['$[[ matrix.PLATFORM ]]']
VERSION: ["18"] # Node.js 18 の準備ジョブにだけ依存
この例では:
-
prepare_envはPLATFORM×VERSION= 3 × 3 = 9ジョブ 生成されます -
build_projectはPLATFORMのみ = 3ジョブ 生成されます - 各
build_projectジョブは、自分と同じPLATFORMかつVERSION: "18"のprepare_envジョブにだけ依存します
こうすることで、プラットフォームは動的に対応させながら、バージョンは特定のものだけに絞るといった柔軟な依存関係が組めます。
注意点(現時点での制約)
現時点での制約として、以下の点に注意してください。
- コンパイル時のみ解決: 変数の展開はパイプライン生成時に行われます。ジョブの実行中には解決されません。
- 文字列置換のみ: 複雑なロジックや変換はできません。
- マトリクス識別子のみ参照可能: CI/CD 変数や inputs は参照できません。
-
自ジョブのマトリクスのみ参照可能:
$[[ matrix.VARIABLE ]]で参照できるのは、その式を書いたジョブ自身のparallel:matrix設定の変数だけです。他のジョブのマトリクス変数は参照できません。 - 将来の仕様変更に注意: 新しい機能のため、今後のバージョンで仕様が変わる可能性があります。実装の詳細や議論は issue 423553 で確認できます。
まとめ
GitLab 18.6 の $[[ matrix.VARIABLE ]] 構文により、parallel:matrix を使ったパイプラインの記述が大幅にシンプルになりました。
- 組み合わせの全列挙が不要になる
- YAML アンカーと組み合わせて DRY な設定が書ける
- 無料プランのユーザも今すぐ使える
マルチプラットフォームビルドやマルチ環境デプロイを行っているチームは、ぜひ試してみてください。GitLab CI/CD にはまだまだ便利な機能がたくさんあります。ぜひ公式ドキュメントも合わせてチェックして、パイプラインをさらに磨いていきましょう。