GitHub Actions: CI/CD Pipeline einfach erklärt
Lernen Sie, wie Sie mit GitHub Actions automatisierte Build-, Test- und Deployment-Pipelines erstellen. Praxisnahe Beispiele für Node.js, Python und Docker.

GitHub Actions: CI/CD für Einsteiger
GitHub Actions automatisiert Ihren gesamten Software-Entwicklungsprozess. Builds, Tests, Deployments – alles direkt in GitHub. Diese Anleitung zeigt Ihnen den Einstieg.
Was ist CI/CD?
Continuous Integration (CI): Automatisches Bauen und Testen bei jedem Push.
Continuous Deployment (CD): Automatisches Deployment nach erfolgreichem Test.
Vorteile:
- Fehler früh erkennen
- Konsistente Builds
- Schnellere Releases
- Weniger manuelle Arbeit
Ihr erster Workflow
Erstellen Sie .github/workflows/ci.yml:
name: CI on: push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Run tests run: npm test
Was passiert hier?
- Trigger bei Push und Pull Request auf main
- Ubuntu-Runner wird gestartet
- Repository wird ausgecheckt
- Node.js wird installiert
- Dependencies werden installiert
- Tests werden ausgeführt
Workflow-Syntax verstehen
Trigger (on)
on: # Bei jedem Push push: # Nur bestimmte Branches push: branches: [main, develop] # Bei Tags push: tags: ['v*'] # Pull Requests pull_request: branches: [main] # Zeitgesteuert (Cron) schedule: - cron: '0 0 * * *' # Täglich um Mitternacht # Manuell auslösbar workflow_dispatch: # Bei Release release: types: [published]
Jobs und Steps
jobs: build: runs-on: ubuntu-latest steps: - name: Step 1 run: echo "Hello" test: runs-on: ubuntu-latest needs: build # Wartet auf build steps: - name: Step 1 run: echo "Testing" deploy: runs-on: ubuntu-latest needs: [build, test] # Wartet auf beide if: github.ref == 'refs/heads/main' steps: - name: Deploy run: echo "Deploying"
Praxisbeispiele
Node.js Projekt mit Tests
name: Node.js CI on: push: branches: [main] pull_request: jobs: test: runs-on: ubuntu-latest strategy: matrix: node-version: [18, 20, 22] steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' - run: npm ci - run: npm run build --if-present - run: npm test lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - run: npm ci - run: npm run lint
Python mit pytest
name: Python CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.11' cache: 'pip' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install pytest pytest-cov - name: Run tests with coverage run: pytest --cov=src --cov-report=xml - name: Upload coverage uses: codecov/codecov-action@v4 with: file: ./coverage.xml
Docker Build und Push
name: Docker on: push: branches: [main] tags: ['v*'] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push uses: docker/build-push-action@v5 with: context: . push: true tags: | username/app:latest username/app:${{ github.sha }} cache-from: type=gha cache-to: type=gha,mode=max
Deployment zu Vercel
name: Deploy to Vercel on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Deploy to Vercel uses: amondnet/vercel-action@v25 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} vercel-args: '--prod'
Deployment zu Server via SSH
name: Deploy to Server on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Deploy via SSH uses: appleboy/ssh-action@v1.0.0 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /var/www/app git pull origin main npm ci npm run build pm2 restart app
Secrets und Umgebungsvariablen
Secrets einrichten
Repository → Settings → Secrets and variables → Actions → New repository secret
Secrets verwenden
steps: - name: Use secret env: API_KEY: ${{ secrets.API_KEY }} run: | curl -H "Authorization: Bearer $API_KEY" https://api.example.com
Umgebungsspezifische Secrets
jobs: deploy: runs-on: ubuntu-latest environment: production # Nutzt production-Secrets steps: - name: Deploy env: DATABASE_URL: ${{ secrets.DATABASE_URL }} run: ./deploy.sh
Caching für schnellere Builds
npm Cache
- uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' # Automatisches Caching!
Manuelles Caching
- name: Cache dependencies uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} restore-keys: | ${{ runner.os }}-pip-
Artifacts speichern
Build-Artifacts hochladen
- name: Build run: npm run build - name: Upload artifact uses: actions/upload-artifact@v4 with: name: build path: dist/ retention-days: 5
Artifacts in anderem Job nutzen
jobs: build: runs-on: ubuntu-latest steps: - run: npm run build - uses: actions/upload-artifact@v4 with: name: build path: dist/ deploy: needs: build runs-on: ubuntu-latest steps: - uses: actions/download-artifact@v4 with: name: build path: dist/ - run: ./deploy.sh
Matrix Builds
Testen Sie auf mehreren Plattformen/Versionen gleichzeitig:
jobs: test: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] node: [18, 20, 22] exclude: - os: macos-latest node: 18 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - run: npm test
Bedingte Ausführung
jobs: deploy: if: github.event_name == 'push' && github.ref == 'refs/heads/main' notify: if: failure() # Nur bei Fehler needs: [build, test]
Wiederverwendbare Workflows
Workflow definieren
# .github/workflows/reusable-test.yml name: Reusable Test Workflow 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
Workflow aufrufen
# .github/workflows/ci.yml name: CI on: [push] jobs: test: uses: ./.github/workflows/reusable-test.yml with: node-version: '20'
Fehlersuche und Debugging
Debug-Logging aktivieren
Repository → Settings → Secrets → Add:
ACTIONS_RUNNER_DEBUG=trueACTIONS_STEP_DEBUG=true
Lokales Testen mit act
# act installieren (macOS) brew install act # Workflow lokal ausführen act push
Best Practices
- Caching nutzen – Spart Build-Zeit
- Secrets nie hart codieren – Immer Repository Secrets
- Concurrency limitieren – Verhindert parallele Deployments
- Timeout setzen – Hängende Jobs stoppen
- Spezifische Versionen –
@v4statt@latest
jobs: deploy: runs-on: ubuntu-latest timeout-minutes: 10 concurrency: group: production cancel-in-progress: false
Fazit
GitHub Actions ist ein mächtiges CI/CD-Tool, das direkt in GitHub integriert ist. Starten Sie mit einfachen Workflows und erweitern Sie schrittweise.
Bei komplexeren DevOps-Anforderungen unterstützt Balane Tech Sie gerne bei der Einrichtung professioneller CI/CD-Pipelines.


