Design wechseln

GitHub Actions Einstieg: YAML-Workflow-Grundlagen und Trigger-Konfiguration

Easton editorial illustration: one large YAML workflow card driving three job stages

Der rote Fehler auf dem Bildschirm ist so grell, dass man am liebsten die Tastatur durch die Wand werfen würde.

Der Code läuft lokal einwandfrei – sobald Sie zu GitHub pushen, bricht alles zusammen. Die YAML-Datei haben Sie sechsmal geändert, jedes Mal wegen Einrückungsproblemen. Warum ist das schwieriger als Programmieren?

GitHub Actions selbst ist gar nicht so kompliziert. Schwierig sind die Dokumente: Hunderte Seiten Konfigurationsreferenz auf einmal – da wird einem schwindelig. Dieser Artikel erklärt die Kernstruktur eines YAML-Workflows auf die einfachste Art.

Sie lernen:

  • Die vier Kernfelder einer YAML-Datei und ihre konkrete Funktion
  • Konfiguration und Einsatzszenarien von 8 gängigen Triggern
  • Eine vollständige Workflow-Vorlage zum direkten Kopieren
  • Fallen, in die ich selbst getappt bin – und wie Sie sie vermeiden

Bereit? Dann legen wir los.

YAML-Workflow-Datei: vier Kernfelder

Ehrlich gesagt: Als ich GitHub Actions zum ersten Mal sah, wirkten die YAML-Dateien unter .github/workflows wie Hieroglyphen. Einrückungen, Doppelpunkte – ein falsches Leerzeichen, und alles bricht.

Später wurde klar: Es gibt eigentlich nur vier Kernbereiche. Verstehen Sie diese, ist der Rest optional.

name: Dem Workflow einen Namen geben

Das einfachste Feld – und doch übersehen es viele (ich eingeschlossen) am Anfang.

name: CI for Node.js App

name ist der Titel, den Sie auf der GitHub-Actions-Seite sehen. Nach dem Push öffnen Sie den Actions-Tab im Repository – genau diese Zeile steht dort.

Ein Tipp: Projektname + Funktionsbeschreibung. Zum Beispiel MyApp CI oder Backend Deploy. Bei vielen Workflows finden Sie sofort den richtigen.

Das Feld ist optional. Fehlt es, nutzt GitHub den Dateinamen. Ich rate davon ab – Dateinamen sind oft Abkürzungen und wenig aussagekräftig.

on: Wann auslösen

8
gängige Trigger
GitHub Actions unterstützt Dutzende Trigger; in der Praxis sind push, pull_request, schedule und workflow_dispatch am häufigsten

on ist der „Schalter“ des Workflows. Sie sagen GitHub, unter welchen Bedingungen er laufen soll.

Die einfachste Form:

on: push

Bedeutung: Bei jedem Push wird ausgelöst.

In echten Projekten brauchen Sie meist feinere Steuerung – zum Beispiel nur bei Push auf main:

on:
  push:
    branches: [main]

Oder zusätzlich bei Pull Requests:

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

Trigger sind das Herzstück von GitHub Actions; einen ganzen Abschnitt widmen wir 8 gängigen Szenarien. Merken Sie sich: on legt den Auslösezeitpunkt fest.

jobs: Was erledigt werden soll

jobs ist der Hauptteil – hier definieren Sie konkrete Aufgaben.

Ein Workflow kann mehrere Jobs enthalten; standardmäßig laufen sie parallel. Jeder Job braucht eine Laufzeitumgebung über runs-on:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # ... Schrittliste

Obiger Code definiert einen Job build, der auf der neuesten Ubuntu-Version von GitHub läuft.

Bei mehreren Jobs steuern Sie Abhängigkeiten mit needs:

jobs:
  test:
    runs-on: ubuntu-latest
    # ... Testschritte

  deploy:
    needs: test  # wartet, bis test fertig ist
    runs-on: ubuntu-latest
    # ... Deploy-Schritte

deploy startet erst nach test. Schlägt test fehl, läuft deploy nicht.

steps: Konkrete Ausführungsschritte

steps sind die kleinsten Einheiten innerhalb eines Jobs – Befehle oder Actions nacheinander.

Zwei Schreibweisen:

1. Befehle mit run:

steps:
  - name: Install dependencies
    run: npm ci

  - name: Run tests
    run: npm test

Hinter run steht der Terminalbefehl – wie lokal.

2. Actions mit uses aufrufen:

steps:
  - name: Checkout code
    uses: actions/checkout@v4

  - name: Setup Node.js
    uses: actions/setup-node@v4
    with:
      node-version: '20'

uses ist der Trumpf von GitHub Actions: fertige Actions anderer nutzen. actions/checkout@v4 checkt den Code aus, actions/setup-node@v4 richtet Node.js ein.

with übergibt Parameter – node-version: '20' bedeutet: Node.js 20 verwenden.

Vier Felder – einfacher als gedacht?

Trigger im Detail: 8 gängige Szenarien

Wie erwähnt legt on den Zeitpunkt fest. GitHub Actions kennt Dutzende Trigger; in der Praxis reichen wenige.

Eine Übersichtstabelle:

TriggerTypisches SzenarioKonfigurationsbeispiel
pushCode-Push auf Branchon: push: branches: [main]
pull_requestPR erstellt oder aktualisierton: pull_request: types: [opened, synchronize]
scheduleZeitgesteuert (Cron)on: schedule: - cron: '0 0 * * *'
workflow_dispatchManuellon: workflow_dispatch: inputs: env: ...
workflow_callWiederverwendbarer Workflowon: workflow_call: inputs: ...
releaseRelease-Eventon: release: types: [published]
issuesIssue-Eventon: issues: types: [opened, labeled]
repository_dispatchExternes Eventon: repository_dispatch: types: [deploy]

Die wichtigsten im Detail:

push: Der Basis-Trigger

push ist meist der erste Trigger – ausgelöst bei Push auf einen Branch.

Einfache Konfiguration:

on: push

Problem: Jeder Push auf jedem Branch löst aus. Bei 20 Branches und vielen Entwicklern verbrauchen Sie schnell das Free-Kontingent.

Sinnvoller: Branches einschränken:

on:
  push:
    branches: [main, develop]

Oder mit Wildcards:

on:
  push:
    branches:
      - 'main'
      - 'release/**'  # passt auf release/v1.0, release/v2.0 usw.

pull_request: Wächter vor dem Merge

pull_request löst bei Erstellung oder Update eines PR aus – typisch für Tests und Linting.

on:
  pull_request:
    branches: [main]

Mit types feiner steuern:

on:
  pull_request:
    types: [opened, synchronize, reopened]
  • opened: PR neu erstellt
  • synchronize: neuer Commit im PR
  • reopened: PR wieder geöffnet

So laufen Workflows nur in diesen Fällen – weniger verschwendete Minuten.

schedule: Zeitgesteuerte Jobs

schedule nutzt Cron-Ausdrücke – z. B. täglich um Mitternacht testen:

on:
  schedule:
    - cron: '0 0 * * *'  # täglich UTC 0 Uhr

Cron hat 5 Felder: Minute, Stunde, Tag, Monat, Wochentag.

Häufige Zeiten:

  • 0 0 * * *: täglich UTC 0 Uhr (8 Uhr morgens Peking / 1 Uhr nachts MEZ im Winter)
  • 0 */6 * * *: alle 6 Stunden
  • 30 2 * * 1: montags UTC 2:30

Achtung: GitHub nutzt UTC. Für 9 Uhr morgens Peking-Zeit setzen Sie UTC 1 Uhr (0 1 * * *).

workflow_dispatch: Manuell starten

Manchmal soll nicht automatisch, sondern per Klick laufen – dafür ist workflow_dispatch da.

on:
  workflow_dispatch:
    inputs:
      environment:
        description: 'Deployment-Umgebung'
        required: true
        default: 'staging'
        type: choice
        options:
          - staging
          - production

Danach erscheint auf der Actions-Seite „Run workflow“ – mit wählbaren Parametern.

Besonders praktisch beim Deploy: Tests automatisch, Deploy manuell.

workflow_call: Workflows wiederverwenden

Bei komplexer Logik oder gleichem Ablauf in mehreren Repositories wird ein Workflow über workflow_call wiederverwendbar.

Wiederverwendbaren Workflow definieren:

# .github/workflows/ci.yml
on:
  workflow_call:
    inputs:
      node-version:
        required: true
        type: string

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node-version }}
      - run: npm ci && npm test

In einem anderen Workflow aufrufen:

# .github/workflows/main.yml
on: push

jobs:
  call-ci:
    uses: ./.github/workflows/ci.yml
    with:
      node-version: '20'

Eine CI-Logik, überall gleich – Änderung an einer Stelle, überall wirksam.

Die übrigen Trigger (release, issues, repository_dispatch) sind seltener – Details in der GitHub-Dokumentation.

Praxis: Ihre erste Workflow-Vorlage

Genug Theorie – probieren wir es aus.

Vollständiger CI-Workflow für ein Node.js-Projekt – direkt kopierbar:

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # 1. Code auschecken
      - name: Checkout code
        uses: actions/checkout@v4

      # 2. Node.js einrichten
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      # 3. Abhängigkeiten installieren
      - name: Install dependencies
        run: npm ci

      # 4. Tests ausführen
      - name: Run tests
        run: npm test

So geht’s

Schritt 1: Im Projektroot .github/workflows anlegen (falls noch nicht vorhanden).

Schritt 2: Darin ci.yml erstellen und obigen Code einfügen.

Schritt 3: Committen und zu GitHub pushen.

Danach im Actions-Tab sollte der Workflow laufen.

Zeile für Zeile

  • name: CI – Name auf der Actions-Seite
  • on: push: branches: [main] – Push auf main löst aus
  • on: pull_request: branches: [main] – PR gegen main ebenfalls
  • jobs: build: – Job mit ID build
  • runs-on: ubuntu-latest – neuestes Ubuntu von GitHub
  • actions/checkout@v4 – Code auf die VM holen
  • actions/setup-node@v4 – Node.js konfigurieren
  • npm ci – Abhängigkeiten (schneller und reproduzierbarer als npm install)
  • npm test – Tests starten

Kein Node.js-Projekt? Mittlere Schritte anpassen – z. B. Python:

steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-python@v5
    with:
      python-version: '3.11'
  - run: pip install -r requirements.txt
  - run: pytest

Muster: Code holen → Umgebung → Dependencies → Tests.

Häufige Konfigurationsfehler

Fallen, in die ich getappt bin – damit Sie es nicht müssen.

Checkliste zum Abgleichen:

FehlersymptomMögliche UrsacheLösung
Workflow startet nichtBranch-Filter falschbranches prüfen, Groß-/Kleinschreibung beachten
YAML-Parse-FehlerTab-EinrückungNur Leerzeichen, kein Tab
Secrets wirken nichtFalscher ScopeSecrets auf Job- oder Step-Ebene setzen
Job-Abhängigkeit scheitertneeds falschjob-id exakt schreiben, case-sensitive
Workflow sehr langsamKein Cacheactions/cache für Dependencies
BerechtigungsfehlerGITHUB_TOKEN zu schwachpermissions im Job setzen

Fehler 1: Falsche Einrückung

Der häufigste Fehler – ohne Wettbewerb.

YAML reagiert empfindlich auf Einrückung: Leerzeichen, kein Tab. Pro Ebene in GitHub Actions üblicherweise 2 Leerzeichen.

# Falsch: Einrückung durcheinander
jobs:
  build:
  runs-on: ubuntu-latest  # sollte 4 Leerzeichen haben
# Richtig
jobs:
  build:
    runs-on: ubuntu-latest  # 4 Leerzeichen

In VS Code oder WebStorm: „Tab fügt Leerzeichen ein“ aktivieren – spart Ärger.

Fehler 2: Falscher Branch-Name

Branch-Namen sind case-sensitive. main und Main sind verschiedene Branches.

# Branch heißt main
on:
  push:
    branches: [Main]  # falsch – löst nicht aus

# Richtig
on:
  push:
    branches: [main]

Unsicher? Auf GitHub im Repository nachsehen oder lokal git branch ausführen.

Fehler 3: job-id falsch geschrieben

Bei mehreren Jobs mit Abhängigkeit muss needs die job-id exakt treffen.

jobs:
  test:
    runs-on: ubuntu-latest
    # ...

  deploy:
    needs: Test  # falsch – Großschreibung passt nicht
    runs-on: ubuntu-latest
# Richtig
jobs:
  test:
    runs-on: ubuntu-latest

  deploy:
    needs: test  # klein, wie oben
    runs-on: ubuntu-latest

Fehler 4: Secrets auf falscher Ebene

GitHub Secrets gibt es auf Repository- und Environment-Ebene. Referenz: ${{ secrets.XXX }}.

# Falsch: secrets ohne ${{ }}
jobs:
  build:
    runs-on: ubuntu-latest
    env:
      API_KEY: secrets.MY_KEY
# Richtig
jobs:
  build:
    runs-on: ubuntu-latest
    env:
      API_KEY: ${{ secrets.MY_KEY }}

Secrets sind verschlüsselt – im Log sehen Sie den Wert nicht. Prüfen, ob gesetzt:

- name: Debug
  run: echo "API_KEY is set: ${{ secrets.MY_KEY != '' }}"

Kein Leak des Keys, aber Sie sehen, ob er leer ist.

GitHub Actions vs. andere CI/CD-Tools

Vielleicht kennen Sie Jenkins, GitLab CI oder CircleCI. Wie schlägt sich GitHub Actions?

Vergleichstabelle:

KriteriumGitHub ActionsGitLab CIJenkinsCircleCI
KonfigurationYAMLYAMLGroovyYAML
HostingCloud-nativCloud/Self-hostedSelf-hostedCloud-nativ
IntegrationGitHub nativGitLab nativKonfiguration nötigKonfiguration nötig
LernkurveNiedrigNiedrigHochMittel
Free-Kontingent2.000 Min./Monat (privat)400 Min./MonatUnbegrenzt (self-hosted)6.000 Min./Monat
Public ReposUnbegrenztUnbegrenztUnbegrenztUnbegrenzt

Vorteile von GitHub Actions

1. Nahtlose Integration

Code liegt schon auf GitHub? GitHub Actions ist der naheliegendste Weg. Kein Webhook-Setup, kein eigener Server, keine Plugins. YAML-Datei anlegen, pushen, fertig.

2. Marketplace-Ökosystem

Tausende Actions im GitHub Marketplace – AWS, Azure, Google Cloud mit offiziellen Actions. Was Sie brauchen, existiert oft schon – per uses einbinden.

3. Free-Kontingent für Einzelentwickler

Public Repos unbegrenzt, private 2.000 Minuten monatlich – für persönliche Projekte und kleine Teams meist ausreichend.

Wann eher nicht GitHub Actions?

1. Code liegt nicht auf GitHub

GitLab oder Bitbucket? Nutzen Sie deren CI/CD. GitHub Actions per Webhook geht, ist aber umständlicher als die native Lösung.

2. Volle Kontrolle über die Laufzeitumgebung

Runner sind fest (Ubuntu/Windows/macOS) – eigene Software oder Spezial-Setup schwer. Jenkins mit self-hosted Runner ist flexibler.

3. Extreme Sicherheitsanforderungen

GitHub-hosted Runner sind VMs von GitHub. Bei hochsensiblen Projekten evtl. eigene CI – oder Kompromiss: self-hosted Runner.

Meine Empfehlung

Für die meisten Einzelentwickler und kleinen Teams:

  • Code auf GitHub → GitHub Actions
  • Code auf GitLab → GitLab CI
  • Hohe Individualisierung → Jenkins oder self-hosted Runner

Kein absolut bestes Tool – das Passende für Ihr Setup zählt.

Fazit

Damit wissen Sie, wie YAML-Workflows in GitHub Actions funktionieren.

Kernpunkte:

  • Vier Felder: name, on, jobs, steps
  • Acht Trigger – am meisten: push, pull_request, schedule
  • Kopierbare Vorlage: Code holen → Umgebung → Dependencies → Tests
  • Vier Fallen: Einrückung, Branch-Name, job-id, Secrets

Als Nächstes:

  1. Ersten Workflow im eigenen Projekt anlegen (Vorlage aus diesem Artikel anpassen)
  2. Fortgeschrittenen Artikel der Serie lesen: „GitHub Actions Cache-Strategie: CI/CD-Pipeline 5× beschleunigen“
  3. GitHub Marketplace durchstöbern – fertige Actions entdecken

Wer einmal Automatisierung schmeckt, will selten zurück.

FAQ

Welche Felder muss ein GitHub Actions Workflow mindestens haben?
Minimal reichen `on` (Trigger) und `jobs` (Aufgaben). `name` und `steps` sind optional, sollten aber gesetzt werden – der Workflow wird lesbarer.
Was ist der Unterschied zwischen push- und pull_request-Trigger?
`push` löst bei Push auf einen Branch aus – gut für Deploy. `pull_request` bei PR-Erstellung oder -Update – gut für Tests und Reviews. Üblich: beides kombinieren – PR testen, nach Merge deployen.
Tab oder Leerzeichen für YAML-Einrückung?
Nur Leerzeichen. YAML unterstützt keine Tabs. In VS Code „Tab fügt Leerzeichen ein“ aktivieren. Pro Ebene meist 2 Leerzeichen.
Wie hoch ist das Free-Kontingent? Was bei Überschreitung?
Private Repos: 2.000 Minuten pro Monat. Public Repos: unbegrenzt. Darüber hinaus zusätzliche Minuten kaufen oder self-hosted Runner nutzen – die zählen nicht ins Free-Kontingent.

9 Min. Lesezeit · Veröffentlicht am: 10. Apr. 2026 · Aktualisiert am: 30. Juli 2026

Kommentare

Melde dich mit GitHub an, um einen Kommentar zu hinterlassen

Easton BlogEaston Blog