Next:
Impressum
Github Actions
1
Impressum
2
Einleitung
2.1
Warum noch ein Automatisierungstool?
2.2
Der deklarative Ansatz
2.3
Das Ökosystem macht den Unterschied
2.4
Für wen ist dieses Material gedacht?
3
Konzepte und Terminologie
3.1
Workflows – Die Orchestrierungsebene
3.2
Events – Der Auslösemechanismus
3.3
Jobs – Logische Arbeitseinheiten
3.4
Steps – Die konkrete Arbeit
3.5
Actions – Wiederverwendbare Bausteine
3.6
Runner – Die Ausführungsumgebung
3.7
Das Zusammenspiel verstehen
4
CI/CD mit GitHub Actions
4.1
Continuous Integration – Früh und oft integrieren
4.2
Die Anatomie einer CI-Pipeline
4.3
Branch-Protection und Status Checks
4.4
Continuous Deployment – Der Weg in die Produktion
4.5
Deployment-Strategien und Rollout-Control
4.6
Environments und Approval Gates
4.7
Die CI/CD-Pipeline als Ganzes
4.8
Parallelität und Concurrency Control
4.9
Monitoring und Rollback-Strategien
4.10
Der kulturelle Aspekt
5
Workflow-Anatomie
5.1
Die vier Ebenen der Hierarchie
5.2
Der Auslösemechanismus: Events und Trigger
5.3
Der Workflow-Lebenszyklus
5.4
Jobs: Parallelität und Abhängigkeiten
5.5
Steps und Actions: Wo die Arbeit geschieht
5.6
Das Zusammenspiel verstehen
6
Daten im Workflow
6.1
Drei Arten von Variablen
6.2
Das Kontext-System
6.2.1
Der github-Kontext: Workflow-Metadaten
6.2.2
Der env-Kontext: Umgebungsvariablen im Ausdruck
6.2.3
Der job-Kontext: Laufzeitinformationen
6.2.4
Der steps-Kontext: Daten zwischen Steps teilen
6.2.5
Der needs-Kontext: Job-Abhängigkeiten nutzen
6.3
Ausdrücke: Daten dynamisch verarbeiten
6.3.1
Operatoren und Funktionen
6.3.2
Status-Funktionen
6.4
Secrets: Vertrauliche Daten schützen
6.4.1
Secret-Scoping und Precedence
6.4.2
Das GITHUB_TOKEN-Secret
6.5
Naming Conventions und Limits
6.6
Praktische Muster
6.7
Anti-Patterns vermeiden
7
Das Action-Ökosystem
7.1
Die drei Action-Typen
7.1.1
Docker Container Actions: Kontrolle über die Umgebung
7.1.2
JavaScript Actions: Geschwindigkeit und Portabilität
7.1.3
Composite Actions: Workflow-Fragmente wiederverwenden
7.2
Marketplace-Navigation: Actions finden und bewerten
7.2.1
Im Editor suchen
7.2.2
Bewertungskriterien für Third-Party Actions
7.2.3
Offizielle Actions als Baseline
7.3
Versionierung und Pinning: Stabilität vs. Updates
7.3.1
Tags: Convenient, aber beweglich
7.3.2
Commit SHAs: Maximal sicher, wartungsintensiv
7.3.3
Branches: Bleeding Edge, nur für Entwicklung
7.3.4
Dependabot für Action-Updates
7.4
Trust und Sicherheit: Risiken minimieren
7.4.1
Das Threat Model
7.4.2
Schutzmaßnahmen
7.4.3
CODEOWNERS für Workflow-Schutz
7.5
Eigene Action vs. bestehende nutzen: Die Entscheidungsmatrix
7.5.1
Wann bestehende Action nutzen
7.5.2
Wann eigene Action schreiben
7.5.3
Entscheidungstabelle
7.6
Praktische Muster und Anti-Patterns
7.6.1
Pattern: Action-Wrapper für konsistente Config
7.6.2
Pattern: Local Actions für Repo-spezifische Logik
7.6.3
Anti-Pattern: Blind updating zu latest
7.6.4
Anti-Pattern: Action-Fragmentierung
7.6.5
Anti-Pattern: Actions als Complexity-Dump
7.7
Der Lifecycle einer Action im Projekt
8
Jobs orchestrieren
8.1
Job-Abhängigkeiten: Sequenzen bauen mit needs
8.1.1
Mehrere Abhängigkeiten: Fan-In-Pattern
8.1.2
Daten zwischen Jobs teilen: Outputs und der needs-Kontext
8.1.3
Bedingte Fortsetzung: always() und failure()
8.2
Matrix-Strategien: Variationen parallel ausführen
8.2.1
Mehrdimensionale Matrizen: Kartesisches Produkt
8.2.2
Exclude: Ungewollte Kombinationen vermeiden
8.2.3
Include: Spezielle Kombinationen hinzufügen
8.2.4
Dynamische Matrizen: fromJSON() und Outputs
8.3
Fehlerbehandlung und Parallelität steuern
8.3.1
fail-fast: Abbrechen bei erstem Fehler
8.3.2
max-parallel: Parallelität begrenzen
8.3.3
continue-on-error: Optionale Jobs in Matrizen
8.4
Concurrency: Workflow-Runs begrenzen
8.4.1
Job-Level Concurrency
8.4.2
Concurrency-Groups clever nutzen
8.5
Bedingte Ausführung: if-Bedingungen auf Job-Ebene
8.5.1
Kontexte in if-Bedingungen
8.5.2
Bedingte Jobs basierend auf Changes
8.5.3
if mit Status-Funktionen kombiniert
8.6
Praktische Orchestrierungsmuster
8.6.1
Multi-Stage-Pipeline mit Fan-Out und Fan-In
8.6.2
Matrix mit bedingten Deployments
8.6.3
Dynamic Matrix für Monorepo
8.6.4
Kombinierte Concurrency und Matrix
9
Artefakte und Caching
9.1
Artefakte: Output zwischen Jobs weitergeben
9.1.1
Die Anatomie eines Artefakts
9.1.2
Immutability und ihre Konsequenzen
9.1.3
Datenaustausch zwischen Jobs
9.1.4
Glob-Patterns und Excludes
9.1.5
Compression-Level tunen
9.1.6
Retention und Lifecycle
9.1.7
Artifact-Outputs und Traceability
9.2
Dependency Caching: Dependencies nicht zweimal laden
9.2.1
Warum Caching?
9.2.2
Cache-Keys: Die Anatomie
9.2.3
Restore-Keys: Fuzzy Matching
9.2.4
Cache-Limits und Eviction
9.2.5
Granulares Caching mit restore und save
9.2.6
Setup-Actions mit integriertem Caching
9.3
Artefakte vs. Caching: Die Entscheidungsmatrix
9.4
Performance-Patterns für die Praxis
9.4.1
Pattern 1: Layered Caching für Monorepos
9.4.2
Pattern 2: Matrix-optimiertes Caching
9.4.3
Pattern 3: Conditional Artifact Upload
9.4.4
Pattern 4: Cache-Warming für selbst-gehostete Runner
9.4.5
Pattern 5: Cache-Keys mit Zeitkomponente
9.5
Praktische Hinweise und Stolpersteine
10
Workflows wiederverwenden
10.1
Reusable Workflows: Pipeline-Templates auf Job-Ebene
10.1.1
Das Konzept
10.1.2
Aufruf und Parameterübergabe
10.1.3
Secrets: Explizit oder inherit
10.1.4
Outputs: Daten zurückgeben
10.1.5
Matrix-Strategien mit Reusable Workflows
10.1.6
Verschachtelung und Limits
10.2
Composite Actions: Step-Sequenzen kapseln
10.2.1
Der Unterschied zu Reusable Workflows
10.2.2
Lokale vs. Shared Composite Actions
10.2.3
Inputs, Outputs und Environment
10.2.4
Was Composite Actions nicht können
10.3
Die Entscheidungsmatrix
10.4
Praktische Patterns
10.4.1
Pattern 1: Reusable Workflow mit lokalem Setup
10.4.2
Pattern 2: Composite Action als Wrapper
10.4.3
Pattern 3: Multi-Stage mit Reusable Workflows
10.4.4
Pattern 4: Dynamic Reusable Workflow Selection
10.5
Versionierung und Lifecycle-Management
10.5.1
Semantic Versioning für Shared Actions
10.5.2
Deprecation-Strategy
10.5.3
Breaking Changes kommunizieren
10.6
Wartbarkeit und Skalierung
10.6.1
Monorepo für Shared Workflows
10.6.2
Testing von Reusable Workflows
10.6.3
Dependency Management
10.7
Die richtige Abstraktion wählen
11
Deployment-Konzepte
11.1
Environments: Logische Deployment-Targets
11.1.1
Das Konzept
11.1.2
Environment-URLs: Statisch und dynamisch
11.2
Protection Rules: Das Sicherheitsnetz
11.2.1
Required Reviewers
11.2.2
Wait Timer
11.2.3
Deployment Branch Policies
11.2.4
Custom Deployment Protection Rules
11.3
Environment Secrets und Variables
11.3.1
Der Unterschied zu Repository Secrets
11.3.2
Environment Variables für Non-Secret-Config
11.4
Concurrency für serielle Deployments
11.4.1
Das Problem
11.4.2
Die Lösung: Deployment Concurrency
11.4.3
Environment-spezifische Concurrency Groups
11.4.4
Cancel-in-Progress für Non-Production
11.5
OIDC: Credential-freie Cloud-Authentifizierung
11.5.1
Das Problem mit Long-Lived Credentials
11.5.2
Die Lösung: OpenID Connect (OIDC)
11.5.3
OIDC in der Praxis: AWS
11.5.4
OIDC Token Claims
11.6
Multi-Environment-Workflows
11.6.1
Das klassische Pattern: Dev → Staging → Production
11.6.2
Conditional Production Deployment
11.6.3
Matrix-Deployments für Multi-Region
11.7
Deployment Tracking und History
11.7.1
Die Deployments-UI
11.7.2
Deployment Status API
11.7.3
Rollback-Strategien
11.8
Praktische Patterns und Anti-Patterns
11.8.1
Pattern 1: Approval + Automated Smoke Tests
11.8.2
Pattern 2: Canary mit Wait Timer
11.8.3
Anti-Pattern 1: Production ohne Protection Rules
11.8.4
Anti-Pattern 2: Secrets im Workflow-Code
11.8.5
Anti-Pattern 3: Parallel Production Deployments
11.9
Ein vollständiges Beispiel
11.10
Monitoring und Observability
11.10.1
Workflow-Runs in der UI beobachten
11.10.2
Log-Download und Retention
11.10.3
Debug-Logging aktivieren
11.10.4
Workflow Commands und Annotations
11.10.5
Checks API und programmatische Annotations
11.10.6
Job Summaries
11.10.7
REST API für Monitoring-Automation
12
Repository & Account Settings
12.1
Grundlegende Actions-Steuerung
12.2
Granulare Freigabe externer Actions
12.3
Organisationsrichtlinien und Vererbung
12.4
Actions aus privaten Repositories teilen
12.5
GITHUB_TOKEN und Scope-Restriktionen
12.6
Fork Pull Requests und externe Beiträge
12.7
Private Repositories und Fork-Workflows
12.8
Commit-SHA-Pinning erzwingen
12.9
Cache- und Artifact-Retention
13
Billing und Quotas
13.1
Minutes und das Multiplier-System
13.2
Plan-abhängige Kontingente
13.3
Spending Limits und Kostenkontrolle
13.4
Matrix-Builds und exponentielle Kostenentwicklung
13.5
Parallelität und Concurrency-Limits
13.6
Cache Storage und Artifact Retention
13.7
Realistische Kostenszenarien
14
GitHub Runner
14.1
Von GitHub gehostete Runner: Verwaltete Infrastruktur
14.1.1
Betriebssysteme und Plattformen
14.2
Standard- und Larger-Runner: Die Leistungsklassen
14.3
Vorinstallierte Software: Die Runner-Ausstattung
14.3.1
Transparenz durch Workflow-Logs
14.4
Custom Images: Maßgeschneiderte Runner-Umgebungen
14.5
Infrastruktur und Netzwerk
14.5.1
Netzwerkanforderungen
14.6
Workflow-Kontinuität und Timeouts
14.7
Sicherheit durch etc/hosts
14.8
Private Netzwerke: Runner mit Zugriff auf interne Ressourcen
14.8.1
API-Gateway mit OIDC
14.8.2
WireGuard-Netzwerküberlagerung
14.8.3
Azure VNET für GitHub-gehostete Runner
14.9
Praktische Überlegungen
15
GitHub managed Runner in der Praxis
15.1
Runner-Auswahl mit runs-on
15.2
Multi-Plattform-Workflows
15.3
Verfügbare Runner einsehen
15.4
Aktive und wartende Jobs überwachen
15.5
Zusätzliche Software installieren
15.5.1
Linux-Runner: apt-get und snap
15.5.2
macOS-Runner: Homebrew
15.5.3
Windows-Runner: Chocolatey
15.6
Performance-Überlegungen bei Software-Installation
15.7
Shell-Auswahl und plattformübergreifende Scripts
15.8
Debugging: Workflow läuft, aber wo?
15.9
Grenzen und Einschränkungen
16
Self hosted Runner in der Praxis
16.1
Wichtige Sicherheitsüberlegung
16.2
Runner hinzufügen
16.2.1
Runner auf Repository-Ebene hinzufügen
16.2.2
Runner auf Organisations-Ebene
16.3
Runner als Systemdienst konfigurieren
16.4
Labels: Runner organisieren und gezielt ansprechen
16.4.1
Workflows auf selbst-gehostete Runner lenken
16.4.2
Benutzerdefinierte Labels erstellen
16.4.3
Labels in Workflows kombinieren
16.4.4
Standard-Labels deaktivieren
16.5
Runner-Gruppen: Zugriffskontrolle und Organisation
16.5.1
Warum Runner-Gruppen?
16.5.2
Runner-Gruppe erstellen
16.5.3
Runner einer Gruppe zuweisen
16.5.4
Runner-Gruppen in Workflows verwenden
16.6
Verfügbare Runner und aktuelle Jobs einsehen
16.7
Hooks: Skripts vor und nach Jobs ausführen
16.7.1
Anwendungsfälle
16.7.2
Hook-Typen
16.7.3
Hooks konfigurieren
16.7.4
Hooks in Workflow-Logs sehen
16.7.5
Timeout-Handling
16.8
Container-Anpassung für fortgeschrittene Szenarien
16.8.1
Die vier Container-Befehle
16.8.2
Beispiel: Kubernetes statt Docker
16.8.3
Wann ist das nützlich?
16.9
Monitoring und Problembehandlung
16.9.1
Runner-Status prüfen
16.9.2
Netzwerk-Konnektivität testen
16.9.3
TLS-Zertifikat-Probleme
16.9.4
Log-Dateien analysieren
16.9.5
journalctl für systemd-Services
16.9.6
Automatische Updates überwachen
16.9.7
Docker-spezifische Probleme
16.10
Runner entfernen
16.10.1
Temporäres Deaktivieren
16.10.2
Permanentes Entfernen
16.10.3
Runner für Wiederverwendung vorbereiten
16.11
Best Practices für den Produktivbetrieb
17
Eigene Actions entwickeln: JavaScript Actions
17.1
Warum eigene Actions?
17.2
Die drei Action-Typen
17.3
Anatomie einer JavaScript Action
17.3.1
Die action.yml
17.3.2
Der Einstiegspunkt
17.4
Das Actions Toolkit
17.4.1
@actions/core
im Detail
17.4.2
@actions/github
für API-Zugriff
17.5
Eine vollständige Action entwickeln
17.5.1
Projektstruktur
17.5.2
action.yml
17.5.3
package.json
17.5.4
src/config.js
17.5.5
src/labeler.js
17.5.6
src/index.js
17.6
Bundling mit ncc
17.6.1
Build-Workflow
17.7
TypeScript Actions
17.7.1
tsconfig.json
17.7.2
TypeScript mit ncc
17.7.3
Typisierter Code
17.8
Externe Prozesse ausführen
17.9
Tool-Caching
17.10
Pre- und Post-Scripts
17.11
Fehlerbehandlung und Debugging
17.11.1
Strukturierte Fehlerbehandlung
17.11.2
Debug-Modus
17.12
Unit Testing
17.12.1
Mocking von
@actions/core
17.13
Veröffentlichung und Versionierung
17.13.1
Semantic Versioning
17.13.2
Release-Workflow
17.13.3
Marketplace-Veröffentlichung
17.14
Verwendung der fertigen Action
18
Eigene Actions entwickeln: Docker Actions
18.1
Wann Docker Actions?
18.1.1
Die Trade-offs
18.2
Anatomie einer Docker Action
18.2.1
Die action.yml für Docker
18.2.2
Dockerfile-Grundstruktur
18.2.3
Der Entrypoint
18.3
Input und Output Handling
18.3.1
Inputs: Drei Wege
18.3.2
Outputs: Der GITHUB_OUTPUT-Mechanismus
18.3.3
Environment Files
18.4
Workspace und Dateizugriff
18.4.1
Das /github/workspace-Verzeichnis
18.4.2
Weitere gemountete Verzeichnisse
18.4.3
Auf Event-Daten zugreifen
18.5
Vollständiges Beispiel: License Checker
18.5.1
Projektstruktur
18.5.2
action.yml
18.5.3
Dockerfile
18.5.4
requirements.txt
18.5.5
entrypoint.sh
18.5.6
src/main.py
18.5.7
src/scanner.py
18.5.8
src/reporter.py
18.6
Pre-built Images
18.6.1
Vorteile vorgebauter Images
18.6.2
Image-Publishing-Workflow
18.7
Performance-Optimierung
18.7.1
Multi-Stage Builds
18.7.2
Schlanke Base Images
18.7.3
Layer-Caching optimieren
18.8
Debugging von Docker Actions
18.8.1
Lokales Testen
18.8.2
Debug-Entrypoint
18.8.3
Container-Shell für Debugging
18.9
Plattform-Einschränkungen
18.10
Verwendung der License Checker Action
19
Eigene Actions entwickeln: Composite Actions
19.1
Wann Composite Actions?
19.2
Anatomie der action.yml
19.2.1
Minimale Struktur
19.2.2
Vollständige Struktur mit allen Optionen
19.3
Inputs: Parameter für Flexibilität
19.3.1
Input-Definition
19.3.2
Input-Zugriff in Steps
19.3.3
Input-Validierung
19.3.4
Boolean-Inputs: Die Tücken
19.4
Outputs: Daten zurückgeben
19.4.1
Output-Definition und -Erzeugung
19.4.2
Multiline-Outputs
19.4.3
Output-Verwendung im Workflow
19.5
Shell-Handling
19.5.1
Verfügbare Shells
19.5.2
Cross-Platform-Actions
19.5.3
Error-Handling mit Shell-Optionen
19.6
Andere Actions einbinden
19.6.1
Wrapper-Pattern
19.7
Dateien und der Workspace
19.7.1
Zugriff auf Repository-Dateien
19.7.2
Mitgelieferte Dateien in der Action
19.8
Logging und Debugging
19.8.1
Workflow Commands
19.8.2
Debug-Mode in Actions
19.8.3
Fehler mit Kontext
19.9
Praktisches Beispiel: Python-Projekt-Setup
19.10
Lokale Actions vs. Shared Actions
19.10.1
Lokale Actions (Repository-intern)
19.10.2
Shared Actions (Repository-übergreifend)
19.10.3
Versionierungsstrategie
19.11
Grenzen von Composite Actions
19.11.1
Secrets-Handling: Der Workaround
19.12
Testing von Composite Actions
19.12.1
Lokales Testing mit act
19.12.2
Test-Workflow für Actions
19.13
Checkliste für produktionsreife Composite Actions
20
Workflow-Grundlagen und Event-Modell
20.1
Events – der Puls von GitHub Actions
20.1.1
Was ist ein Event?
20.1.2
Die wichtigsten Event-Typen
20.1.3
Activity Types – Feinsteuerung für Events
20.1.4
Filter für Events – Branches, Paths und Tags
20.1.5
Special Case:
workflow_dispatch
20.1.6
Das Konzept der Event-Metadaten
20.2
Runner – wo Workflows ausgeführt werden
20.2.1
GitHub-Hosted Runners
20.2.2
Self-Hosted Runners
20.2.3
Vergleich: GitHub-Hosted vs. Self-Hosted
20.3
Die Workflow-Syntax – YAML-Struktur verstehen
20.3.1
Anatomie eines Workflows
20.3.2
Environment Variables und Secrets
20.3.3
Conditionals – if-Bedingungen
20.4
Unser erstes Projekt: Badge Generator
20.4.1
Projektziel
20.4.2
Repository-Setup
20.4.3
Code-Qualitätsprüfung mit GitHub Actions
20.4.4
Was passiert hier?
20.4.5
Filter in Aktion
20.4.6
Erweiterung: Matrix-Testing
20.5
Lokale Entwicklung vs. GitHub Actions
20.6
Debugging von Workflows
20.6.1
Schnelle Debug-Hilfe
20.7
Rückblick
21
Jobs, Steps und Failure-Handling
21.1
Jobs – Parallelität und Orchestrierung
21.1.1
Parallele Ausführung als Standard
21.1.2
Job-Abhängigkeiten mit
needs
21.1.3
Fan-Out / Fan-In – Komplexe Dependency-Graphen
21.2
Matrix-Strategien – skalierbare Parallelität
21.2.1
Grundlagen einer Matrix
21.2.2
Multi-Dimensionale Matrizen
21.2.3
include
– zusätzliche Kombinationen
21.2.4
exclude
– unerwünschte Kombinationen entfernen
21.2.5
fail-fast
– Fehlerverhalten steuern
21.2.6
max-parallel
– Parallelität begrenzen
21.2.7
Experimentelle Matrix-Jobs mit
continue-on-error
21.3
Failure-Handling – robuste Workflows bauen
21.3.1
continue-on-error
auf Step-Level
21.3.2
Conditionals – Fehler intelligent handhaben
21.3.3
Step-Outputs für differenzierte Fehlerbehandlung
21.3.4
Job-Dependencies mit bedingter Ausführung
21.4
Job-Outputs – Daten zwischen Jobs weitergeben
21.4.1
Job-Outputs definieren
21.4.2
Limits und Best Practices
21.4.3
Dynamische Matrizen aus Job-Outputs
21.5
Praxis: Multi-OS Testing für badge-gen
21.6
Praxis: Parallele Security-Scans
21.7
Edge-Cases und häufige Fehler
21.7.1
Problem: Matrix-Job wartet auf Fehler
21.7.2
Problem:
needs
mit
if
funktioniert nicht wie erwartet
21.7.3
Problem:
continue-on-error
und Branch Protection
21.7.4
Problem: Job-Outputs mit Secrets
21.8
Rückblick
22
Secrets, Variables und Permissions
22.1
GITHUB_TOKEN – der automatische Workflow-Zugang
22.1.1
Was ist GITHUB_TOKEN?
22.1.2
Default-Permissions – zu großzügig oder zu restriktiv?
22.1.3
Permissions granular setzen
22.1.4
Verfügbare Permission-Scopes
22.1.5
Permissions auf Workflow-Level vs. Job-Level
22.1.6
Was GITHUB_TOKEN NICHT kann
22.2
Secrets – sensitive Daten schützen
22.2.1
Secret-Hierarchie: Repository, Organization, Environment
22.2.2
Secret-Limits und Naming
22.2.3
Secret-Redaction in Logs
22.2.4
Secrets in Forks – Security-Modell
22.2.5
Secrets vs. Variables – wann was?
22.3
Environments – Deployment-Kontrolle
22.3.1
Environment erstellen
22.3.2
Required Reviewers – manuelle Freigabe
22.3.3
Wait Timer – zeitgesteuerte Verzögerung
22.3.4
Deployment Branches – Branch-Protection
22.3.5
Custom Deployment Protection Rules
22.4
Praxis: GitHub Pages Deployment mit Minimal-Permissions
22.4.1
Naiver Ansatz (zu viele Rechte)
22.4.2
Besserer Ansatz (Least Privilege)
22.5
Praxis: Environment-basiertes Deployment-System
22.5.1
Environment-Setup
22.5.2
Workflow mit Environment-Strategie
22.5.3
OIDC statt Long-Lived Secrets
22.6
Edge-Cases und Häufige Fehler
22.6.1
Problem: Secret wird trotz Maskierung geloggt
22.6.2
Problem: Permission denied beim Checkout
22.6.3
Problem: Environment-Secret nicht verfügbar
22.6.4
Problem: GITHUB_TOKEN kann nicht in anderen Repo pushen
22.6.5
Problem: Secrets in strukturierten Daten
22.7
Security Best Practices
23
Workflow-Optimierung – Caching und Debugging
23.1
Caching – Zeit ist Geld
23.1.1
Wie GitHub Actions Caching funktioniert
23.1.2
actions/cache – die Basis-Action
23.1.3
Cache-Key-Design – das Wichtigste
23.1.4
hashFiles() – automatische Invalidierung
23.1.5
restore-keys – intelligente Fallbacks
23.1.6
Cache-Limits und Eviction
23.2
Setup-Actions mit integriertem Caching
23.2.1
setup-python mit Dependency-Caching
23.2.2
setup-node mit npm/yarn/pnpm
23.2.3
setup-java mit Maven/Gradle
23.3
Praxis: Python Dependency Caching für badge-gen
23.3.1
Naiver Ansatz (keine Optimierung)
23.3.2
Optimierter Ansatz (mit Caching)
23.3.3
Multi-OS Caching
23.4
Advanced Caching: Docker Layer Caching
23.4.1
Problem: Docker ohne Caching
23.4.2
Lösung: docker/build-push-action mit GHA Cache
23.5
Lokales Testing mit act
23.5.1
Was ist act?
23.5.2
Installation
23.5.3
Grundlegende Nutzung
23.5.4
Runner-Image auswählen
23.5.5
Secrets und Variables lokal
23.5.6
Limitierungen von act
23.5.7
Praxis-Beispiel: badge-gen lokal testen
23.6
Debug-Logging – wenn Workflows mysterös fehlschlagen
23.6.1
Step Debug Logging
23.6.2
Runner Diagnostic Logging
23.6.3
Re-run mit Debug-Logging
23.6.4
Debug-Strategie: Systematisch einkreisen
23.7
Praxis: Vollständig optimierter CI-Workflow
23.8
Performance-Tuning: Best Practices
23.8.1
1. Caching-Strategie
23.8.2
2. Job-Parallelisierung
23.8.3
3. Concurrency-Control
23.8.4
4. Conditional Execution
23.8.5
5. Matrix-Strategie optimieren
23.9
Edge-Cases und Troubleshooting
23.9.1
Problem: Cache restore dauert ewig
23.9.2
Problem: Cache nicht invalidiert bei Dependency-Update
23.9.3
Problem: act schlägt lokal fehl, aber auf GitHub funktioniert es
23.9.4
Problem: Debug-Logging zeigt Secrets
24
Repository-Automatisierung – Code-Modifikation durch Workflows
24.1
Git-Operationen aus Workflows
24.1.1
Das Fundament: GITHUB_TOKEN Permissions
24.1.2
Manuelle Git-Operationen
24.1.3
Besserer Ansatz: Dedicated Actions
24.1.4
Security: Infinite Loop Prevention
24.1.5
Pull Requests vs. Direct Push
24.1.6
Praxis-Beispiel: Auto-Format für badge-gen
24.2
Conventional Commits – die Basis für Automation
24.2.1
Format-Spezifikation
24.2.2
Konvention → Semantic Version
24.2.3
Tooling für Conventional Commits
24.3
Automatisches Versioning
24.3.1
Semantic Version aus Git-History berechnen
24.3.2
Dry-Run Pattern: Version berechnen, später taggen
24.3.3
Version in Dateien schreiben
24.4
Changelog-Generierung
24.4.1
Aus Conventional Commits generieren
24.4.2
Template-basierte Generierung
24.4.3
Conventional Changelog Action (All-in-One)
24.4.4
Changelog in GitHub Release
24.5
Praxis: Vollautomatischer Release-Workflow
24.5.1
Workflow-Struktur
24.5.2
Implementierung
24.5.3
Was passiert bei Push zu main?
24.5.4
Erweitert: Pre-Release für develop-Branch
24.6
Edge-Cases und Best Practices
24.6.1
Problem: Concurrency bei parallelen Pushes
24.6.2
Problem: Protected Branches blockieren Auto-Commits
24.6.3
Problem: Commits triggern weitere Workflows trotz [skip ci]
24.6.4
Problem: Version-File in falscher Struktur
24.6.5
Best Practice: Pre-Commit Hooks für Conventional Commits
24.6.6
Best Practice: Semantic Release für Maximale Automation
24.7
Vergleich: Verschiedene Automation-Levels
24.8
Security-Überlegungen
24.8.1
1. Auto-Commits auf Pull Requests
24.8.2
2. Token-Scope minimieren
24.8.3
3. Signed Commits (Advanced)
25
Das Actions-Ökosystem – Wiederverwendbarkeit und Sicherheit
25.1
Reusable Workflows – ganze Workflows wiederverwenden
25.1.1
Das Konzept
25.1.2
Einen Reusable Workflow erstellen
25.1.3
Einen Reusable Workflow aufrufen
25.1.4
Inputs und Secrets
25.1.5
Outputs zurückgeben
25.1.6
Limitierungen
25.1.7
Wann Reusable Workflows nutzen?
25.2
Custom Actions – eigene Bausteine erstellen
25.2.1
Die drei Action-Typen
25.2.2
Composite Actions
25.2.3
Composite Action: Wichtige Details
25.2.4
JavaScript Actions
25.2.5
Docker Actions
25.2.6
Vergleich: Reusable Workflows vs. Composite Actions
25.3
Praxis: Zentrale Workflow-Bibliothek
25.3.1
Repository-Struktur
25.3.2
Beispiel: CI-Workflow für Python-Projekte
25.3.3
Verwendung in badge-gen
25.4
Security: Third-Party Actions absichern
25.4.1
Das Risiko
25.4.2
SHA-Pinning – die einzige sichere Methode
25.4.3
SHA finden
25.4.4
Best Practice: SHA + Kommentar
25.4.5
Dependabot für automatische Updates
25.4.6
Weitere Security-Maßnahmen
25.4.7
Automatisches SHA-Pinning
25.5
Edge-Cases und Troubleshooting
25.5.1
Problem: Reusable Workflow findet Secrets nicht
25.5.2
Problem: Composite Action kann keine anderen Actions aufrufen
25.5.3
Problem: Matrix in Reusable Workflow
25.5.4
Problem: Lokale Action im Reusable Workflow
25.5.5
Problem: GITHUB_TOKEN Permissions in Nested Workflows
25.6
Architektur-Empfehlungen
25.6.1
Kleine Organisation (1-5 Repos)
25.6.2
Mittlere Organisation (5-20 Repos)
25.6.3
Große Organisation (20+ Repos)
25.6.4
Versioning-Strategie für Shared Workflows
26
Deployment-Strategien – von der Pipeline in die Produktion
26.1
Environments – mehr als nur Labels
26.1.1
Das Konzept
26.1.2
Environment erstellen
26.1.3
Environment in Jobs referenzieren
26.1.4
Environment Secrets und Variables
26.2
Protection Rules – Deployments absichern
26.2.1
Required Reviewers
26.2.2
Wait Timer
26.2.3
Deployment Branches
26.2.4
Custom Deployment Protection Rules
26.3
Deployment-Muster
26.3.1
Sequentielles Multi-Environment Deployment
26.3.2
Matrix Deployment
26.3.3
Rollback-Strategie
26.4
Praxis: badge-gen auf GitHub Pages deployen
26.4.1
GitHub Pages mit Actions
26.4.2
Repository konfigurieren
26.4.3
Der Deployment-Workflow
26.4.4
Erklärung der Schlüsselkomponenten
26.4.5
Alternative: peaceiris/actions-gh-pages
26.5
Praxis: badge-gen auf PyPI veröffentlichen
26.5.1
Trusted Publishing – der moderne Weg
26.5.2
PyPI konfigurieren
26.5.3
GitHub Environment erstellen
26.5.4
Der Publish-Workflow
26.5.5
Warum zwei separate Jobs?
26.5.6
TestPyPI für Testläufe
26.5.7
Release-Workflow komplett
26.6
Deployment-Historie und Rollbacks
26.6.1
Deployment-Historie einsehen
26.6.2
Manueller Rollback via Re-run
26.6.3
Rollback via Revert-Commit
26.7
Edge-Cases und Troubleshooting
26.7.1
Problem: Environment Secrets nicht verfügbar
26.7.2
Problem: Deployment wartet ewig
26.7.3
Problem: Pages-Deployment schlägt fehl
26.7.4
Problem: PyPI Trusted Publishing funktioniert nicht
26.7.5
Problem: Concurrency bricht Deployments ab
26.8
Best Practices
26.8.1
Environment-Namenskonvention
26.8.2
Permissions minimieren
26.8.3
Secrets isolieren
26.8.4
Deployment-Fenster via Scheduled Workflows
26.8.5
Monitoring nach Deployment
27
Das Gesamtbild – badge-gen in der Praxis
27.1
Die vollständige Repository-Struktur
27.2
Die vier Workflows im Detail
27.2.1
1. CI-Workflow – die Qualitätssicherung
27.2.2
2. Release-Workflow – Versionierung und Changelog
27.2.3
3. Publish-Workflow – PyPI-Veröffentlichung
27.2.4
4. Pages-Workflow – Badge-Showcase
27.3
Wie die Workflows zusammenspielen
27.3.1
Der typische Entwickler-Workflow
27.4
Unterstützende Konfigurationen
27.4.1
Dependabot – Automatische Updates
27.4.2
CODEOWNERS – Review-Zuständigkeiten
27.4.3
Environment-Konfiguration
27.5
Checkliste für neue Projekte
27.5.1
Phase 1: Repository Setup
27.5.2
Phase 2: CI-Workflow
27.5.3
Phase 3: Release-Automatisierung
27.5.4
Phase 4: Deployment
27.5.5
Phase 5: Wartung
27.6
Wartung und Monitoring
27.6.1
Workflow-Laufzeiten überwachen
27.6.2
Billing im Blick behalten
27.6.3
Benachrichtigungen einrichten
27.6.4
Regelmäßige Wartungsaufgaben
27.7
Typische Probleme im Alltag
27.7.1
“CI ist grün, aber lokal schlägt’s fehl”
27.7.2
“Der Workflow läuft nicht”
27.7.3
“Secrets sind leer”
27.7.4
“Caching funktioniert nicht”
27.7.5
“Deployment wartet ewig”
27.8
Das fertige Bild
28
Appendix: Referenztabellen
28.1
Workflow-Trigger (on)
28.2
Job-Level Configuration
28.3
Step-Level Configuration
28.4
GITHUB_TOKEN Permissions
28.5
GitHub-Hosted Runner Labels
28.5.1
Public Repositories (kostenlos, unbegrenzt)
28.5.2
Private Repositories (Minutes-basiert)
28.6
Shell-Optionen
28.7
Glob-Pattern für Filter
28.8
Expression-Funktionen (Status Checks)
28.9
Concurrency-Konfiguration
28.10
Matrix-Strategy
28.11
Context-Verfügbarkeit
28.12
Workflow Commands (Runtime)
28.13
Wichtige Limits
28.14
Reusable Workflows
28.15
Debug-Logging aktivieren
29
Appendix: Workflow Events Referenz
29.1
Repository Events (Code & Branches)
29.2
Pull Request Events
29.3
Issue & Discussion Events
29.4
Project & Label Events
29.5
Release & Package Events
29.6
CI/CD Status Events
29.7
Scheduled Events
29.8
Manual & External Trigger Events
29.9
Workflow Orchestration Events
29.10
Sonstige Events
29.11
Activity Types Übersicht
29.12
Event-Kontext-Verhalten
29.13
Wichtige Einschränkungen
29.14
Fork-Verhalten
30
Appendix: GitHub Actions Context & Expressions Referenz
30.1
Überblick: Context-Modell
30.2
github Context – zentrale Felder
30.3
Event-spezifischer Zugriff (Beispiele)
30.4
Expression-Syntax
30.5
Operatoren
30.6
Wichtige Funktionen
30.7
steps Context
30.8
needs Context (Job-Orchestrierung)
30.9
matrix Context
30.10
secrets Context
30.11
Typische Patterns
30.12
Einschränkungen