Avant, parallel:matrix permettait de lancer la même tâche sur plusieurs versions. Mais impossible de référencer UN job spécifique de la matrice dans un needs. Toute la matrice formait un bloc indivisible.

GitLab 16.7 a changé ça. Maintenant, tu peux needs un job précis de la matrice. Et ça débloque des pipelines plus propres.

Avant : le workaround

# ❌ Avant GitLab 16.7 : impossible de référencer un job de la matrice
test:
  parallel:
    matrix:
      - PYTHON: ["3.9", "3.10", "3.11"]
  script: pytest

deploy:
  needs: ["test"]  # Attend TOUS les jobs de la matrice
  script: ./deploy.sh

Après : des needs chirurgicaux

# ✅ GitLab 16.7+ : on cible un job précis
test:
  parallel:
    matrix:
      - PYTHON: ["3.9", "3.10", "3.11"]
  script: pytest

deploy_39:
  needs: ["test: [3.9]"]
  script: ./deploy-py39.sh

deploy_latest:
  needs: ["test: [3.11]"]
  script: ./deploy-pylatest.sh

Le job deploy_39 attend UNIQUEMENT test: [3.9]. Il n’attend pas les tests Python 3.10 et 3.11. Résultat : le déploiement peut partir dès que sa version est validée, sans attendre les autres.

Format des noms de jobs matrix

nom_du_job: [valeur1, valeur2]
  • test: [3.9] → le job test avec PYTHON=3.9
  • build: [linux, amd64] → le job build avec OS=linux, ARCH=amd64
  • test: [3.11] → si une seule variable dans la matrice

Le piège

Si ta matrice a PLUSIEURS variables, tu dois toutes les spécifier :

test:
  parallel:
    matrix:
      - PYTHON: ["3.10", "3.11"]
        DJANGO: ["4.2", "5.0"]

# ✅ Cibler le job Python 3.11 + Django 5.0
needs: ["test: [3.11, 5.0]"]

# ❌ Ne matche rien (il manque DJANGO)
needs: ["test: [3.11]"]

L’ordre des valeurs dans [val1, val2] suit l’ordre de déclaration dans la matrice : PYTHON puis DJANGO.

Deux jobs matrixés qui se couplent

Le vrai cas d’usage de cette feature : deux jobs qui sont TOUS LES DEUX en parallel:matrix, et le deuxième attend un job précis du premier.

build:
  parallel:
    matrix:
      - ARCH: [amd64, arm64]
  script: ./build.sh --arch $ARCH

test:
  parallel:
    matrix:
      - ARCH: [amd64, arm64]
  needs: ["build: [$ARCH]"]
  script: ./test.sh --arch $ARCH

test: [amd64] attend uniquement build: [amd64]. test: [arm64] attend build: [arm64]. Chaque job de la deuxième matrice avance indépendamment, sans attendre les autres combinaisons.