Teil 5 – GitHub Actions: CI/CD in der Praxis

Warum CI/CD so wichtig ist

Früher war es üblich, Software nur alle paar Wochen oder Monate zu veröffentlichen. Tests liefen manuell, Builds wurden von Hand erstellt. Das führte zu:

  • langen Feedbackzyklen
  • fehleranfälligen Deployments
  • Frust bei Entwicklern und Nutzern

👉 Die Lösung: Continuous Integration (CI) und Continuous Deployment (CD).

  • CI bedeutet: Jeder Commit wird automatisch getestet und gebaut.
  • CD bedeutet: Änderungen werden automatisch ausgeliefert – entweder auf Testsysteme (Delivery) oder direkt in Produktion (Deployment).

Mit GitHub Actions hat GitHub CI/CD direkt in die Plattform integriert – ohne externe Tools wie Jenkins oder Travis.


Was sind GitHub Actions?

GitHub Actions sind Automatisierungen, die bei bestimmten Ereignissen ausgelöst werden.

  • Sie bestehen aus Workflows (geschrieben in YAML).
  • Sie laufen in GitHubs Infrastruktur (virtuelle Maschinen, Container).
  • Es gibt einen Marketplace mit tausenden fertigen Actions (z. B. für Docker, AWS, Node.js).

👉 Vorteil: Alles ist direkt im Repository integriert – Code, PRs, Tests, Deployments.


Aufbau eines Workflows

Ein Workflow liegt im Repo im Ordner:

.github/workflows/

Minimales Beispiel

name: CI

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run a one-line script
        run: echo "Hello, GitHub Actions!"

Erklärung:

  • Trigger: Bei jedem Push.
  • Job: Läuft auf ubuntu-latest.
  • Steps:
    • Code auschecken.
    • Skript ausführen.

👉 Ergebnis: Automatischer „Hello World“-Lauf bei jedem Push.


CI-Pipeline mit Tests

Ein häufiges Szenario: Tests automatisch bei jedem Commit ausführen.

Beispiel für Node.js

name: Node.js CI

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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      - run: npm install
      - run: npm test

👉 Jetzt werden bei jedem Push oder PR automatisch:

  1. Node.js installiert
  2. Dependencies geladen
  3. Tests ausgeführt

Multi-Plattform-Tests

Viele Projekte müssen auf verschiedenen Betriebssystemen laufen. Mit matrix geht das:

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
    steps:
      - uses: actions/checkout@v3
      - run: echo "Running on ${{ matrix.os }}"

👉 Das Projekt wird parallel auf Ubuntu, Windows und macOS getestet.


CD: Automatisches Deployment

CI ist gut, aber oft will man auch automatisch deployen.

Beispiel: Deployment auf GitHub Pages

name: Deploy to GitHub Pages

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build
        run: npm run build
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./dist

👉 Ergebnis: Bei jedem Push auf main wird die Website neu gebaut und auf GitHub Pages veröffentlicht.


Secrets und Sicherheit

Viele Deployments brauchen Zugangsdaten (z. B. AWS Keys, API-Tokens).
Diese gehören nie in den Code, sondern in GitHub Secrets:

  1. In Repo → Settings → Secrets → New Repository Secret.
  2. Im Workflow nutzen: with: api_key: ${{ secrets.AWS_ACCESS_KEY }}

👉 Secrets sind verschlüsselt und sicher.


GitHub Actions Marketplace

Im Marketplace gibt es tausende fertige Actions, z. B.:

  • actions/setup-node → Node.js installieren
  • docker/build-push-action → Docker-Images bauen und pushen
  • actions/cache → Dependencies cachen
  • github/codeql-action → Sicherheitsscans

👉 Damit muss man nicht jedes Skript selbst schreiben.


Beispiel: Komplettes Workflow-Szenario

Ein Projekt soll bei jedem Commit:

  1. Linting laufen lassen.
  2. Tests ausführen.
  3. Docker-Image bauen und in Docker Hub pushen.
name: CI/CD Pipeline

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install dependencies
        run: npm install
      - name: Run Linter
        run: npm run lint
      - name: Run Tests
        run: npm test
      - name: Build Docker image
        run: docker build -t myapp:latest .
      - name: Push to Docker Hub
        uses: docker/build-push-action@v4
        with:
          push: true
          tags: username/myapp:latest

👉 Damit ist das Projekt immer getestet und sofort als Docker-Image verfügbar.


Best Practices für GitHub Actions

  1. Workflows klein halten
    • Lieber mehrere kleine Jobs als ein riesiger.
  2. Caching nutzen
    • Dependencies cachen, um Builds zu beschleunigen.
  3. Secrets sicher verwalten
    • Niemals Zugangsdaten ins Repo pushen.
  4. Tests vor Deployments
    • Nur deployen, wenn Tests bestehen.
  5. PR-Checks
    • Workflows auch auf PRs laufen lassen, um fehlerhaften Code zu blockieren.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert