🔗 Inhaltsverzeichnis
CI/CD PipelinesGitHub Actions, Jenkins & GitLab CI
Vollautomatisierte Deployment-Pipelines mit GitHub Actions, Jenkins und GitLab CI – Konzepte, Vergleich und Best Practices für moderne Softwareentwicklung.
💡 Was ist CI/CD?
Continuous Integration (CI) und Continuous Delivery/Deployment (CD) sind Praktiken, die darauf abzielen, den Softwareentwicklungsprozess durch Automatisierung zu beschleunigen und zu verbessern. Eine CI/CD-Pipeline automatisiert die Schritte von der Codeänderung bis zur Auslieferung an die Benutzer.
- Continuous Integration (CI): Entwickler integrieren Code regelmäßig in ein zentrales Repository. Jeder Push löst einen automatisierten Build und Test aus.
- Continuous Delivery (CD): Erweiterung von CI, bei der Codeänderungen automatisch in eine produktionsnahe Umgebung (Staging) deployed werden. Das Deployment in die Produktion erfolgt manuell.
- Continuous Deployment (CDP): Jede Codeänderung, die alle Tests besteht, wird automatisch in die Produktion deployed.
GitHub Actions
GitHub Actions ist eine CI/CD-Plattform, die direkt in GitHub integriert ist. Workflows werden in YAML-Dateien definiert und können auf Ereignisse im Repository reagieren (z.B. Push, Pull Request).
Beispiel Workflow (Node.js):
name: Node.js CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: '18.x'
- run: npm ci
- run: npm run build --if-present
- run: npm test
Vorteile:
- Tiefe Integration mit GitHub Repositories.
- Große Auswahl an fertigen Aktionen im Marketplace.
- Unterstützung für Linux, macOS, Windows, ARM und Container.
- Großzügige kostenlose Kontingente für öffentliche und private Repos.
⚙️ Jenkins
Jenkins ist ein weit verbreiteter, Open-Source Automatisierungsserver. Er ist extrem flexibel und erweiterbar durch tausende von Plugins. Pipelines können über die UI (klassisch) oder als Code (Jenkinsfile) definiert werden.
Beispiel Jenkinsfile (Declarative Pipeline):
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
stage('Deploy') {
steps {
echo 'Deploying...'
// Deploy-Schritte hier
}
}
}
}
Vorteile:
- Sehr hohe Flexibilität und Anpassbarkeit.
- Riesige Community und Plugin-Ökosystem.
- On-Premise oder Cloud-Deployment möglich.
- Unterstützt komplexe und verteilte Builds.
🦊 GitLab CI/CD
GitLab CI/CD ist tief in die GitLab-Plattform integriert und bietet eine umfassende DevOps-Lösung aus einer Hand. Pipelines werden in einer `.gitlab-ci.yml`-Datei im Repository definiert.
Beispiel .gitlab-ci.yml:
image: node:18
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- npm install
- npm run build
test_job:
stage: test
script:
- npm test
deploy_job:
stage: deploy
script:
- echo "Deploying application..."
# Deploy-Skripte hier
only:
- main # Nur auf dem main branch deployen
Vorteile:
- Nahtlose Integration in den GitLab-Workflow (Issues, Merge Requests, Registry).
- Eingebaute Container Registry und Kubernetes-Integration.
- Auto DevOps für automatische Pipeline-Erstellung.
- Verfügbar als SaaS (GitLab.com) oder Self-Managed.
🛠️ Werkzeuge im Vergleich
Kriterium | GitHub Actions | Jenkins | GitLab CI |
---|---|---|---|
Hosting | Cloud (GitHub) | Self-Managed / Cloud | Cloud (GitLab) / Self-Managed |
Konfiguration | YAML | Groovy (Jenkinsfile) / UI | YAML |
Integration | Sehr gut mit GitHub | Extrem viele Plugins | Sehr gut mit GitLab |
Kosten (Basis) | Kostenlos für Public Repos, Freemium für Private | Open Source (kostenlos) | Kostenlos für Public Repos, Freemium für Private |
🔢 Pipeline Phasen
Eine typische CI/CD-Pipeline besteht aus mehreren Phasen:
- Source: Code-Änderungen werden ins Repository gepusht.
- Build: Der Code wird kompiliert, Artefakte werden erstellt.
- Test: Automatisierte Tests (Unit, Integration, etc.) werden ausgeführt.
- Deploy (Staging): Die Anwendung wird in einer Testumgebung bereitgestellt.
- Deploy (Production): (Nach manueller oder automatischer Freigabe) Die Anwendung wird in der Produktionsumgebung bereitgestellt.
👍 Best Practices
- Pipeline as Code: Definiere Pipelines in versioniertem Code (z.B. YAML, Jenkinsfile).
- Schnelles Feedback: Optimiere Pipelines für kurze Durchlaufzeiten.
- Atomare Builds: Jeder Build sollte ein potenziell auslieferbares Inkrement sein.
- Umfassende Testautomatisierung: Vertrauen in die Pipeline durch gute Testabdeckung.
- Secrets Management: Sichere Verwaltung von Passwörtern und Schlüsseln.
- Monitoring: Überwache sowohl die Pipeline als auch die deployte Anwendung.
- Idempotente Deployments: Wiederholte Deployments sollten zum selben Ergebnis führen.
🛡️ DevSecOps in CI/CD
DevSecOps integriert Sicherheitspraktiken ("Security as Code") in jede Phase der CI/CD-Pipeline:
- Static Application Security Testing (SAST): Code-Analyse auf Schwachstellen.
- Software Composition Analysis (SCA): Überprüfung von Abhängigkeiten.
- Dynamic Application Security Testing (DAST): Tests der laufenden Anwendung.
- Container Image Scanning: Sicherheitsüberprüfung von Docker Images.
- Infrastructure as Code (IaC) Scanning: Überprüfung von Terraform, CloudFormation etc.