ToolBox Hub

GitHub Actions Tutorial: CI/CD für deine Projekte automatisieren in 2026

GitHub Actions Tutorial: CI/CD für deine Projekte automatisieren in 2026

Schritt-für-Schritt GitHub Actions Tutorial. Lerne, Tests, Builds und Deployments mit praktischen Workflow-Beispielen zu automatisieren.

17. März 20266 Min. Lesezeit

Warum CI/CD-Automatisierung unverzichtbar ist

Stelle dir vor: Dein Team hat 10 Entwickler und committet täglich Dutzende Male. Wenn nach jedem Code-Merge manuell Tests ausgeführt, gebaut und deployed werden müsste, wäre das nicht nur ineffizient, sondern fehleranfällig. Genau hier setzt CI/CD (Continuous Integration/Continuous Deployment) an.

GitHub Actions ist GitHubs natives CI/CD-Tool – vollständig kostenlos für öffentliche Repositories (unbegrenzt), für private Repositories mit 2.000 Freiminuten pro Monat. Es ist tief in GitHub integriert, einfach zu konfigurieren und leistungsstark. Im Jahr 2026 hat es sich als Standardwerkzeug für Entwicklungsteams etabliert.

Kernkonzepte

KonzeptErklärung
WorkflowVollständige Definition eines Automatisierungsprozesses (YAML-Datei)
EventAuslöser eines Workflows (push, PR, Timer usw.)
JobEine Ausführungseinheit im Workflow, läuft auf eigenem VM
StepEinzelne Operation in einem Job – Befehl oder Action
ActionWiederverwendbare Automatisierungseinheit, aus dem Marketplace abrufbar
RunnerVM, die den Workflow ausführt (GitHub-hosted oder selbst-gehostet)

Dein erster GitHub Actions Workflow

Workflow-Dateien müssen im Verzeichnis .github/workflows/ gespeichert sein:

# .github/workflows/hallo-welt.yml
name: Mein erster Workflow

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

jobs:
  begruessen:
    runs-on: ubuntu-latest
    steps:
      - name: Begrüßung ausgeben
        run: echo "Hallo, GitHub Actions!"

      - name: Laufzeitumgebung prüfen
        run: |
          echo "Betriebssystem: $(uname -a)"
          echo "Node.js-Version: $(node --version)"
          echo "Python-Version: $(python3 --version)"

Vollständiger CI/CD-Workflow für Node.js

# .github/workflows/node-ci.yml
name: Node.js CI/CD

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

jobs:
  test:
    name: Tests
    runs-on: ubuntu-latest

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

    steps:
      - name: Code auschecken
        uses: actions/checkout@v4

      - name: Node.js ${{ matrix.node-version }} einrichten
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      - name: Abhängigkeiten installieren
        run: npm ci

      - name: Linting ausführen
        run: npm run lint

      - name: Unit-Tests ausführen
        run: npm test -- --coverage

      - name: Abdeckungsbericht hochladen
        uses: codecov/codecov-action@v4
        if: matrix.node-version == '20.x'
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

  build:
    name: Build
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'npm'

      - run: npm ci
      - run: npm run build

      - name: Build-Artefakte hochladen
        uses: actions/upload-artifact@v4
        with:
          name: build-files
          path: dist/
          retention-days: 7

  deploy:
    name: Deployment auf Produktionsumgebung
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    environment: production

    steps:
      - uses: actions/checkout@v4

      - name: Build-Artefakte herunterladen
        uses: actions/download-artifact@v4
        with:
          name: build-files
          path: dist/

      - name: Auf Server deployen
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USER }}
          key: ${{ secrets.DEPLOY_SSH_KEY }}
          script: |
            cd /var/www/myapp
            git pull origin main
            npm ci --production
            pm2 restart myapp

Python-Projekt CI-Workflow

# .github/workflows/python-ci.yml
name: Python CI

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

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        python-version: ["3.11", "3.12", "3.13"]

    steps:
      - uses: actions/checkout@v4

      - name: Python ${{ matrix.python-version }} einrichten
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: 'pip'

      - name: Abhängigkeiten installieren
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
          pip install pytest pytest-cov black flake8 mypy

      - name: Code-Formatierung prüfen (black)
        run: black --check .

      - name: Code-Qualität prüfen (flake8)
        run: flake8 . --max-line-length=100

      - name: Typprüfung (mypy)
        run: mypy src/

      - name: Tests ausführen
        run: pytest tests/ -v --cov=src --cov-report=xml

      - name: Abdeckung hochladen
        uses: codecov/codecov-action@v4
        if: matrix.python-version == '3.12'

  docker:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - name: Bei Docker Hub anmelden
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Metadaten extrahieren
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: meinname/meine-app
          tags: |
            type=ref,event=branch
            type=sha,prefix=sha-
            type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

      - name: Docker-Image bauen und pushen
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

Secrets verwalten

Sensible Daten (API-Keys, Passwörter, SSH-Schlüssel) gehören niemals in den Code. GitHub Actions bietet sicheres Secret-Management.

Secrets hinzufügen

  1. Repository öffnen → Settings → Secrets and variables → Actions
  2. "New repository secret" klicken
  3. Name (z.B. DEPLOY_SSH_KEY) und Wert eingeben

Im Workflow verwenden

steps:
  - name: Secrets verwenden
    env:
      API_KEY: ${{ secrets.API_KEY }}
      DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
    run: |
      echo "API_KEY=$API_KEY" >> .env
      # Wichtig: Secrets niemals in Logs ausgeben!

Cache-Optimierung: Workflows beschleunigen

# npm-Abhängigkeiten cachen
- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'   # Eingebaute Cache-Unterstützung

# Oder manuell konfigurieren
- name: node_modules cachen
  uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

# Python pip-Cache
- uses: actions/setup-python@v5
  with:
    python-version: '3.12'
    cache: 'pip'

Guter Einsatz von Caches kann Workflow-Laufzeiten von Minuten auf Sekunden reduzieren.

Matrix-Builds: Multi-Umgebungs-Tests

strategy:
  matrix:
    os: [ubuntu-latest, windows-latest, macos-latest]
    node: [18, 20, 22]
    exclude:
      - os: windows-latest
        node: 18
  fail-fast: false  # Failure einer Kombination stoppt nicht andere

runs-on: ${{ matrix.os }}

Geplante Aufgaben

on:
  schedule:
    # Täglich um 01:00 Uhr UTC (02:00 MEZ)
    - cron: '0 1 * * *'
    # Jeden Montag um 09:00 Uhr UTC
    - cron: '0 9 * * 1'

Typische Anwendungsfälle für geplante Aufgaben:

  • Sicherheitslücken-Scans bei Abhängigkeiten
  • Datensicherungen
  • Performance-Benchmarks
  • Regelmäßige Datensynchronisation

Umgebungsschutz

Für Produktions-Deployments können Genehmigungsregeln konfiguriert werden:

deploy:
  environment:
    name: production
    url: https://meine-app.de
  # Genehmiger müssen in den Repository-Einstellungen konfiguriert sein

Empfehlenswerte Actions

ActionVerwendungszweck
actions/checkoutCode auschecken (immer nötig)
actions/setup-nodeNode.js-Umgebung konfigurieren
actions/setup-pythonPython-Umgebung konfigurieren
actions/cacheAbhängigkeiten cachen
actions/upload-artifactBuild-Artefakte hochladen
docker/build-push-actionDocker-Images bauen und pushen
appleboy/ssh-actionSSH-Remote-Deployment
codecov/codecov-actionCode-Coverage hochladen

Fazit

GitHub Actions ist eine zentrale Infrastrukturkomponente moderner Software-Entwicklung. Mit diesem Tutorial hast du gelernt:

  • Workflow-Grundstruktur und Kernkonzepte
  • Vollständige CI/CD-Pipelines für Node.js und Python
  • Secret-Management und Sicherheitspraktiken
  • Cache-Optimierung und Matrix-Builds
  • Geplante Aufgaben und Umgebungsschutz

Konfiguriere noch heute CI/CD für deine Projekte. Selbst die einfachste automatisierte Testsuite verbessert die Code-Qualität und Teamzusammenarbeit erheblich. Mit wachsender Erfahrung kannst du deine Automatisierungs-Pipeline kontinuierlich ausbauen und GitHub Actions zu deinem zuverlässigsten Automatisierungshelfer machen.

Verwandte Beiträge