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:
- Node.js installiert
- Dependencies geladen
- 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:
- In Repo → Settings → Secrets → New Repository Secret.
- 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 installierendocker/build-push-action
→ Docker-Images bauen und pushenactions/cache
→ Dependencies cachengithub/codeql-action
→ Sicherheitsscans
👉 Damit muss man nicht jedes Skript selbst schreiben.
Beispiel: Komplettes Workflow-Szenario
Ein Projekt soll bei jedem Commit:
- Linting laufen lassen.
- Tests ausführen.
- 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
- Workflows klein halten
- Lieber mehrere kleine Jobs als ein riesiger.
- Caching nutzen
- Dependencies cachen, um Builds zu beschleunigen.
- Secrets sicher verwalten
- Niemals Zugangsdaten ins Repo pushen.
- Tests vor Deployments
- Nur deployen, wenn Tests bestehen.
- PR-Checks
- Workflows auch auf PRs laufen lassen, um fehlerhaften Code zu blockieren.
Schreibe einen Kommentar