Forgejo Pipelines · Workshop Lektion 9 / matrix

strategy:matrix

Einen Job über viele Varianten laufen lassen – ohne ihn zu kopieren.

Warum das zählt
Die Tasks-API soll auf mehreren Python-Versionen laufen. Statt drei fast identische Jobs zu pflegen, schreibst du einen – und eine Matrix vervielfacht ihn automatisch. Das hält die Pipeline kurz und deckt trotzdem breit ab.

Ein Job, viele Varianten

.forgejo/workflows/ci.yaml (Auszug)
  test:
    runs-on: docker
    strategy:
      matrix:
        python: ["3.10", "3.11", "3.12"]
      fail-fast: false      # nicht alle abbrechen bei 1 Fehler
      max-parallel: 2        # höchstens 2 gleichzeitig
    container: python:${{ matrix.python }}-slim
    steps:
      - uses: actions/checkout@v4
      - run: pip install -r requirements.txt && pytest -q

Forgejo erzeugt daraus drei Läufe des Jobs – test (3.10), test (3.11), test (3.12). In jedem steht der aktuelle Wert als ${{ matrix.python }} bereit.

Mehrere Achsen kombinieren

      matrix:
        python: ["3.11", "3.12"]
        os: [docker, lxc]      # 2 x 2 = 4 Läufe

Zwei Achsen ergeben das Kreuzprodukt (hier 4 Kombinationen). Mit include: fügst du Sonderfälle hinzu, mit exclude: nimmst du einzelne Kombinationen wieder heraus.

fail-fast steuert das Abbruchverhalten Standardmässig (fail-fast: true) bricht Forgejo die übrigen Matrix-Läufe ab, sobald einer fehlschlägt. Für vollständige Testabdeckung über alle Versionen setzt du fail-fast: false – dann läufst du jede Variante zu Ende.

Parallelen: GitLab CI ↔ Forgejo Actions

GitLab CI

parallel: matrix:

Variablen je Kombination

Zugriff über $VARIABLE

Forgejo Actions

strategy: matrix:

fail-fast & max-parallel

Zugriff über ${{ matrix.* }}

Übungen für Teilnehmende

Übung 1 · Zählen

Frage: Eine Matrix hat python: [3.11, 3.12] und db: [postgres, sqlite]. Wie viele Job-Läufe entstehen?

Lösung anzeigen

Vier – das Kreuzprodukt 2 × 2. Mit exclude: könntest du einzelne Kombinationen wieder entfernen.

Übung 2 · Selbst schreiben

Aufgabe: Erweitere die Python-Matrix um "3.13" und stelle sicher, dass alle Versionen zu Ende laufen, auch wenn eine fehlschlägt.

Lösung anzeigen
    strategy:
      matrix:
        python: ["3.10", "3.11", "3.12", "3.13"]
      fail-fast: false

Kurz prüfen (aus dem Kopf)

Wie liest du den aktuellen Matrix-Wert im Job?

Was bewirkt fail-fast: false?

Primärquelle zum Lesen Forgejo Docs – Reference, Abschnitt strategy.matrix (include/exclude, fail-fast, max-parallel).
Ich bin dein Teacher. Kreuzprodukt zu gross oder ein Sonderfall mit include? Schick mir die Achsen – wir trimmen die Matrix gemeinsam.
← Lektion 8 · Container Registry Lektion 10 · Environments & Deployments →