GitHub Actions Matrix-Builds

GitBeginner
Jetzt üben

Einführung

Bei der Softwareentwicklung ist es entscheidend sicherzustellen, dass Ihr Code in verschiedenen Umgebungen korrekt funktioniert. Beispielsweise sollte eine Node.js-Bibliothek auf mehreren Versionen von Node.js (z. B. v18, v20, v22) getestet werden.

Anstatt für jede Version separate Jobs zu erstellen, bietet GitHub Actions eine Matrix-Strategie (Matrix Strategy). Diese ermöglicht es Ihnen, eine Reihe von Variablen zu definieren, und GitHub Actions erstellt automatisch einen Job für jede Kombination dieser Variablen.

In diesem Lab aktualisieren Sie Ihren Workflow, um Ihre Tests parallel über drei verschiedene Versionen von Node.js auszuführen.

Dieses Lab baut auf dem Repository auf, das Sie in den vorherigen Labs erstellt haben. Sie werden mit dem Repository github-actions-demo arbeiten.

Workflow anpassen, um die Strategiematrix einzubeziehen

Das Schlüsselwort strategy wird verwendet, um die Build-Matrix zu konfigurieren. Wir definieren eine Matrix mit einem einzigen Schlüssel node-version.

  1. Klicken Sie auf Ihrer GitHub-Repository-Seite für github-actions-demo auf die grüne Schaltfläche Code.
  2. Stellen Sie sicher, dass der Reiter HTTPS ausgewählt ist, und kopieren Sie die URL. Sie sollte wie https://github.com/your-username/github-actions-demo.git aussehen.
  3. Öffnen Sie das Terminal in der LabEx-Umgebung. Der Standardpfad ist ~/project.
  4. Verwenden Sie den Befehl git clone, um das Repository herunterzuladen. Ersetzen Sie your-username durch Ihren tatsächlichen GitHub-Benutzernamen.
cd ~/project
git clone https://github.com/your-username/github-actions-demo.git

Beispielausgabe:

Cloning into 'github-actions-demo'...
remote: Enumerating objects: X, done.
remote: Counting objects: 100% (X/X), done.
remote: Total X (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (X/X), done.
  1. Navigieren Sie in das geklonte Repository:
cd ~/project/github-actions-demo
  1. Erstellen Sie eine neue Workflow-Datei .github/workflows/matrix-build.yml mithilfe des WebIDE-Editors. Sie finden die Datei im Dateiexplorer auf der linken Seite unter project/github-actions-demo/.github/workflows/.

  2. Beginnen Sie mit der Erstellung der grundlegenden Workflow-Struktur. Fügen Sie den Workflow-Namen und den Trigger hinzu:

name: Matrix Build

on: [push]
  1. Fügen Sie nun den jobs-Abschnitt mit einer grundlegenden Build-Job-Struktur hinzu:
jobs:
  build:
    runs-on: ubuntu-latest
  1. Fügen Sie die Matrix-Strategie hinzu. Dies ist der Schlüsselteil, der es ermöglicht, den Job mit mehreren Node.js-Versionen auszuführen:
strategy:
  matrix:
    node-version: [18, 20, 22]

Dies definiert eine Matrixvariable node-version mit drei Werten. GitHub Actions erstellt für jeden Wert einen separaten Job.

  1. Fügen Sie den steps-Abschnitt hinzu. Fügen Sie zuerst den Checkout-Schritt hinzu:
steps:
  - uses: actions/checkout@v4
  1. Fügen Sie den Node.js-Setup-Schritt hinzu. Beachten Sie, wie wir ${{ matrix.node-version }} verwenden, um auf den aktuellen Matrixwert zu verweisen:
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: ${{ matrix.node-version }}
  1. Fügen Sie den Schritt zum Installieren der Abhängigkeiten hinzu:
- name: Install dependencies
  run: npm install
  1. Fügen Sie den Build-Schritt hinzu, der das Artifact-Verzeichnis erstellt:
- name: Build project
  run: |
    mkdir dist
    echo "This is the build artifact" > dist/build.txt
  1. Fügen Sie den Testschritt hinzu:
- name: Run tests
  run: npm test
  1. Fügen Sie abschließend den Schritt zum Hochladen des Artifacts hinzu. Beachten Sie, wie der Artifact-Name die Matrixversion enthält, um jedes Artifact eindeutig zu machen:
- name: Upload build artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-assets-${{ matrix.node-version }}
    path: dist

Ihre vollständige Datei sollte nun wie folgt aussehen:

name: Matrix Build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20, 22]

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: |
          mkdir dist
          echo "This is the build artifact" > dist/build.txt
      - name: Run tests
        run: npm test
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: build-assets-${{ matrix.node-version }}
          path: dist

Erklärung

  • strategy: Definiert die Build-Strategie.
  • matrix: Definiert die Matrixvariablen.
  • node-version: Dies ist ein von uns gewählter Variablenname. Wir haben ihm ein Array von Werten [18, 20, 22] zugewiesen. GitHub Actions wird den Job build dreimal ausführen, einmal für jeden Wert.
  • ${{ matrix.node-version }}: Diese Syntax ermöglicht den Zugriff auf den aktuellen Matrixwert in Ihren Schritten.

Speichern Sie die Datei (Strg+S oder Cmd+S) nach den Änderungen.

Setup-Node und Artefaktname an den Matrix-Kontext anpassen

Die Definition der Matrix ist nur die halbe Miete; wir müssen den Schritten auch mitteilen, dass sie den aktuellen Wert aus der Matrix verwenden sollen. Dies geschieht mithilfe des ${{ matrix.node-version }}-Kontexts.

Wir müssen auch sicherstellen, dass die von jedem parallelen Job hochgeladenen Artefakte eindeutige Namen haben, da sie sich sonst gegenseitig überschreiben.

  1. Überprüfen Sie in .github/workflows/matrix-build.yml, ob der Schritt Use Node.js die Matrix-Variable verwendet:
- name: Use Node.js
  uses: actions/setup-node@v4
  with:
    node-version: ${{ matrix.node-version }}
  1. Überprüfen Sie, ob der Schritt Upload build artifact die Matrix-Version im Artefakt-Namen enthält:
- name: Upload build artifact
  uses: actions/upload-artifact@v4
  with:
    name: build-assets-${{ matrix.node-version }}
    path: dist
  1. Ihre vollständige Workflow-Datei sollte wie folgt aussehen:
name: Matrix Build

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20, 22]

    steps:
      - uses: actions/checkout@v4
      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: |
          mkdir dist
          echo "This is the build artifact" > dist/build.txt
      - name: Run tests
        run: npm test
      - name: Upload build artifact
        uses: actions/upload-artifact@v4
        with:
          name: build-assets-${{ matrix.node-version }}
          path: dist

Speichern Sie die Datei (Strg+S oder Cmd+S).

Commiten, pushen und parallele Jobs beobachten

Sehen wir uns die Matrix in Aktion an, indem wir Ihre Änderungen auf GitHub committen.

  1. Stellen Sie sicher, dass Sie sich im Repository-Verzeichnis befinden:
cd ~/project/github-actions-demo
  1. Stagen Sie die Änderungen:
git add .
  1. Committen Sie die Änderungen:
git commit -m "Add matrix strategy for Node.js versions"
  1. Pushen Sie die Änderungen in das Remote-Repository auf GitHub:
git push

Hinweis zur Authentifizierung:
Wenn Sie git push ausführen, werden Sie von der WebIDE automatisch zur Authentifizierung aufgefordert. Befolgen Sie diese detaillierten Schritte:

  1. Ein Popup erscheint mit der Meldung: "The extension 'GitHub' wants to sign in using GitHub." Klicken Sie auf Allow.
  2. Es erscheint eine neue Benachrichtigung. Klicken Sie auf "Copy&Continue to GitHub" und anschließend im nächsten Dialog auf "Open".
  3. Melden Sie sich in dem sich öffnenden Browserfenster bei Ihrem GitHub-Konto an und geben Sie den kopierten Autorisierungscode ein. Nach Bestätigung der Autorisierung schließt sich die Seite automatisch.
  4. Warten Sie einige Sekunden, und Sie werden sehen, wie das Terminal den Push-Vorgang erfolgreich abschließt.

Datenschutzhinweis: Die WebIDE wird zu Authentifizierungszwecken vollen Zugriff auf Ihr GitHub-Konto anfordern. Sie müssen sich keine Sorgen um Datenschutzbedenken machen – die LabEx VM wird sofort zerstört, nachdem Sie das aktuelle Lab abgeschlossen haben, und Ihre Anmeldeinformationen sowie Autorisierungsinformationen werden nicht gespeichert.

Dieser Authentifizierungsprozess erfordert keine manuelle Konfiguration von Benutzername oder Personal Access Token.

Überprüfung auf GitHub

  1. Besuchen Sie Ihr Repository auf GitHub in einem Webbrowser.
  2. Klicken Sie auf den Tab Actions.
  3. Klicken Sie auf den neuesten Workflow-Lauf.
  4. In der linken Seitenleiste (oder in der Hauptgraphenansicht) sehen Sie nun drei separate Jobs, die unter der Gruppe build aufgelistet sind:
    • build (18)
    • build (20)
    • build (22)
  5. Diese werden parallel (oder nahezu parallel) ausgeführt. Sie können auf jeden einzelnen klicken, um zu sehen, dass Use Node.js die spezifisch angeforderte Version eingerichtet hat.
GitHub Actions matrix builds

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man die Matrix-Strategie (Matrix Strategy) in GitHub Actions verwendet. Sie haben:

  1. Eine Matrix mit mehreren Node.js-Versionen mithilfe von strategy: matrix definiert.
  2. Ihre Workflow-Schritte aktualisiert, um die Version dynamisch aus dem Matrix-Kontext (${{ matrix.node-version }}) zu verwenden.
  3. Sichergestellt, dass die Artefakt-Namen für jeden Matrix-Job eindeutig waren.

Diese leistungsstarke Funktion ermöglicht es Ihnen, Ihr Projekt mit sehr geringer Code-Duplizierung gegen eine breite Palette von Konfigurationen zu validieren.