Von Code Sentinel, Technical Project Manager bei Java Fleet Systems Consulting
Für dich und die Java Fleet Community


Was du in den nächsten 8 Minuten lernst

Nach diesem Beitrag kannst du:

  • ✅ Verstehen, was CI/CD wirklich bedeutet (ohne Marketing-Buzzwords)
  • ✅ Deine erste automatisierte Pipeline mit GitHub Actions bauen
  • ✅ Die gleiche Pipeline in Jenkins umsetzen (Enterprise-Realität)
  • ✅ Entscheiden, welches Tool für deine Situation passt
  • ✅ Nie wieder manuell deployen müssen (Freitag 18:30 Uhr gehört der Vergangenheit an)

Dein größter Gewinn heute: Du baust in 10 Minuten eine Pipeline, die dir Stunden pro Woche spart und nachts ruhig schlafen lässt.


👋 Moin! Code Sentinel hier

Schön, dass du dabei bist!

Erinnerst du dich an Nova’s Git-Serie vom Oktober? Branches, Commits, Pull Requests – sie hat Git gemeistert. Und Elyndra’s Maven-Serie vom September? Build-Management, Dependencies, Profiles – alles sitzt. Und meine Docker-Serie, die gerade zu Ende ging? Container, Images, Production-Readiness.

Seitdem haben mir Stefan aus Berlin, Anna aus München und Sarah geschrieben – alle mit demselben Problem:

„Code Sentinel, ich habe Git. Ich habe Maven. Ich habe Docker. Aber jedes Mal wenn ich deploye, mache ich das manuell. Git push, dann SSH zum Server, dann Git pull, dann mvn package, dann Docker build… und dann ist es 19:00 Uhr und ich habe Kopfschmerzen.“

Und weißt du was? Ich kenne das Problem. Gestern stand Oliver (unser DevOps Engineer) neben mir, während ich für einen Kunden ein Deployment machte. Um 17:45 Uhr. „Gleich fertig“, sagte ich. Um 18:30 Uhr waren wir immer noch dabei. Oliver meinte nur trocken: „Mit Pipeline wären wir längst fertig.“ Er hatte recht.

Das Problem: Manuelle Prozesse sind fehleranfällig, zeitraubend und nervig.

Die Lösung: CI/CD – Continuous Integration und Continuous Deployment.

Lass uns das heute gemeinsam aufsetzen! 🔧


🎯 Das große Bild: Was ist CI/CD wirklich?

Kurz gesagt:

  • CI (Continuous Integration): Jeder Git-Push löst automatisch Build und Tests aus
  • CD (Continuous Deployment): Erfolgreiche Builds werden automatisch deployed

Noch kürzer: Die Maschine macht die Wiederholungen. Du machst das Denken.

Das Problem ohne CI/CD:

Stell dir vor, es ist Freitag, 16:45 Uhr. Du willst ein neues Feature deployen.

# Dein manueller Prozess (der Albtraum):
1. ✅ git push origin main
2. ⏰ ssh user@production-server
3. ⏰ cd /app && git pull
4. ⏰ mvn clean package
5. ❌ Build fails - falsche Java-Version auf Server!
6. 😰 Java-Version updaten (20 Minuten)
7. ⏰ mvn clean package (wieder)
8. ⏰ docker build -t app .
9. ❌ Docker build fails - Typo im Dockerfile
10. 😫 Dockerfile fixen, nochmal committen, nochmal pushen
11. 🔄 Zurück zu Schritt 2...

# Es ist jetzt 18:30. 
# Du hast Kopfschmerzen. 
# Lisa wartet. 
# Das Feature ist immer noch nicht live.

Die Lösung mit CI/CD:

Gleiche Situation, mit Pipeline:

# Dein automatisierter Prozess (die Erlösung):
1. ✅ git push origin main

# Pipeline übernimmt (automatisch):
2. ✅ Checkout Code (10 Sekunden)
3. ✅ Setup Java 21 (Cache - 5 Sekunden)
4. ✅ Maven Build (2 Minuten)
5. ✅ Run Tests (1 Minute)
6. ✅ Docker Build (3 Minuten)
7. ✅ Security Scan (1 Minute)
8. ✅ Deploy to Dev (30 Sekunden)

# Zeit: 7 Minuten, 45 Sekunden
# Du machst inzwischen Kaffee
# Feierabend um 17:00
# Feature ist live
# Keine Kopfschmerzen
# Lisa ist happy

Das ist der Unterschied. Das ist CI/CD.


🔧 Hands-On: Deine erste Pipeline

Wir nutzen das Persons-API-Projekt aus meiner Docker-Serie. Du erinnerst dich? Spring Boot + PostgreSQL + Docker. Perfekt für CI/CD.

Tool-Entscheidung: GitHub Actions oder Jenkins?

Kurze Antwort: Beide. Ich zeige dir beide.

Warum?

  • GitHub Actions: Modern, einfach, Cloud-native. Perfekt für neue Projekte.
  • Jenkins: Enterprise-Standard, seit 2011 in Production. Die Realität in 70% der Firmen.

Welches zuerst? Egal. Pick one. Verstehe es. Das andere ist dann einfach.


🚀 Option 1: GitHub Actions

Setup in 5 Minuten:

Schritt 1: Datei erstellen

# In deinem Projekt-Root:
mkdir -p .github/workflows
cd .github/workflows
touch ci.yml

Schritt 2: Pipeline definieren

# .github/workflows/ci.yml
name: CI Pipeline - Persons API

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

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    # Step 1: Code holen (Nova's Git!)
    - name: Checkout code
      uses: actions/checkout@v4
    
    # Step 2: Java Setup (Elyndra's JDK!)
    - name: Set up JDK 21
      uses: actions/setup-java@v4
      with:
        java-version: '21'
        distribution: 'temurin'
        cache: 'maven'
    
    # Step 3: Build (Elyndra's Maven!)
    - name: Build with Maven
      run: mvn clean verify
    
    # Step 4: Docker Build (Meine Serie!)
    - name: Build Docker image
      run: docker build -t persons-api:${{ github.sha }} .
    
    # Step 5: Security Check
    - name: Run Trivy security scan
      uses: aquasecurity/trivy-action@master
      with:
        image-ref: persons-api:${{ github.sha }}
        format: 'sarif'
        output: 'trivy-results.sarif'

Schritt 3: Committen und pushen

git add .github/workflows/ci.yml
git commit -m "feat: Add CI pipeline"
git push origin main

# 🎉 Pipeline startet automatisch!

Was passiert jetzt?

  1. GitHub erkennt den Push
  2. Pipeline startet automatisch
  3. Ubuntu-Container wird hochgefahren
  4. Dein Code wird geclont
  5. Java 21 wird installiert
  6. Maven baut dein Projekt
  7. Tests laufen durch
  8. Docker-Image wird gebaut
  9. Security-Scan prüft Vulnerabilities
  10. Ergebnis: ✅ oder ❌

Du schaust zu. Oder machst Kaffee. Beides gut.

Wo siehst du die Ergebnisse?

GitHub → Dein Repo → Actions Tab

Dort siehst du:
- ✅ Erfolgreiche Builds (grün)
- ❌ Fehlgeschlagene Builds (rot)
- ⏳ Laufende Builds (orange)
- 📊 Build-Logs (für Debugging)

🏢 Option 2: Jenkins (Enterprise-Realität)

„Aber Code Sentinel“, höre ich dich sagen, „wir haben bei uns Jenkins seit 2015. Migration zu GitHub Actions? Kein Budget, keine Zeit.“

Kenne ich. Habe ich letzte Woche beim Kunden gehört. Genau dieselben Worte.

Hier ist Jenkins. Gleiche Pipeline. Andere Syntax.

Setup (etwas länger, aber lohnt sich):

Schritt 1: Jenkins installieren (Docker-based, schnellster Weg)

# Jenkins als Container starten
docker run -d \
  --name jenkins \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:lts-jdk21

# Initial Admin Password holen
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

# Browser öffnen: http://localhost:8080
# Password eingeben, Setup durchlaufen

Schritt 2: Plugins installieren

Jenkins → Manage Jenkins → Manage Plugins → Available

Installiere:
- ✅ Git Plugin
- ✅ Maven Integration
- ✅ Docker Pipeline
- ✅ Pipeline Utility Steps

Schritt 3: Jenkinsfile erstellen

// Jenkinsfile (im Projekt-Root)
pipeline {
    agent any
    
    tools {
        maven 'Maven-3.9'
        jdk 'JDK-21'
    }
    
    environment {
        DOCKER_IMAGE = "persons-api"
    }
    
    stages {
        stage('Checkout') {
            steps {
                // Nova's Git - automatisch von Jenkins
                checkout scm
                echo "✅ Code checked out from ${env.BRANCH_NAME}"
            }
        }
        
        stage('Build with Maven') {
            steps {
                // Elyndra's Maven
                sh 'mvn clean verify'
            }
            post {
                always {
                    // Test-Reports für Jenkins UI
                    junit '**/target/surefire-reports/*.xml'
                }
            }
        }
        
        stage('Docker Build') {
            steps {
                script {
                    // Mein Docker
                    def imageTag = "${env.BUILD_NUMBER}-${env.GIT_COMMIT.take(7)}"
                    sh """
                        docker build -t ${DOCKER_IMAGE}:${imageTag} .
                        docker tag ${DOCKER_IMAGE}:${imageTag} ${DOCKER_IMAGE}:latest
                    """
                }
            }
        }
        
        stage('Security Scan') {
            steps {
                script {
                    // Trivy-Scan
                    sh """
                        trivy image --severity HIGH,CRITICAL \
                            --exit-code 1 \
                            ${DOCKER_IMAGE}:latest
                    """
                }
            }
        }
    }
    
    post {
        failure {
            // Mail bei Fehler
            mail to: 'team@java-fleet.com',
                 subject: "Build Failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                 body: "Check Jenkins: ${env.BUILD_URL}"
        }
        success {
            echo "✅ Build successful! Ready for deployment."
        }
    }
}

Schritt 4: Job in Jenkins erstellen

1. New Item → Multibranch Pipeline
2. Name: persons-api
3. Branch Sources → Git → URL eingeben
4. Script Path: Jenkinsfile
5. Save

Pipeline läuft! 🎉


🤔 GitHub Actions vs Jenkins: Welches passt zu dir?

Quick Decision Tree:

START
  ↓
Neues Projekt oder Legacy?
  ↓
[Neu] → Cloud OK? → [Ja] → GitHub Actions ✅
        ↓
       [Nein] → On-Premise nötig? → Jenkins ✅
  
[Legacy] → Jenkins vorhanden? → [Ja] → Jenkins ✅
           ↓
          [Nein] → Team-Skill? → [Junior] → GitHub Actions ✅
                               ↓
                              [Senior] → Beide möglich, pick one

Die ehrliche Vergleichstabelle:

KriteriumGitHub ActionsJenkinsCode Sentinel’s Take
Setup-Zeit5 Minuten ⚡2 Stunden 🐢Actions klar vorn
LernkurveFlach 📊Steil 📈Actions einfacher
Enterprise-FeaturesBasis ⭐⭐⭐Komplett ⭐⭐⭐⭐⭐Jenkins etablierter
Kosten (SaaS)Free + $$$N/A
Kosten (Self-Hosted)Nicht möglichServer + MaintenanceJenkins = Kontrolle
Plugin-ÖkosystemWachsendGigantischJenkins mehr Optionen
Cloud-NativeJa ✅Mit ArbeitActions native
Compliance/AuditOKExzellentJenkins für Regulated

Meine persönliche Meinung:

„Wenn du die Wahl hast: GitHub Actions. Schneller, einfacher, moderner.
Wenn du sie nicht hast: Jenkins ist seit 2011 battle-tested und wird noch 2031 laufen.
Wenn du beides lernen willst: Diese Serie! 😉“

Oliver würde hinzufügen: „Und wenn du Cloud-native willst, nimm Actions. Für On-Premise bleibt Jenkins King. Ich manage beides täglich – beide haben ihre Berechtigung.“


⚠️ Wenn’s schief geht (und es wird schiefgehen)

Typische Fehler und Lösungen:

Problem 1: „Maven dependencies not found“

# ❌ Fehlt Cache
- name: Set up JDK 21
  uses: actions/setup-java@v4
  with:
    java-version: '21'
    distribution: 'temurin'
    # cache: 'maven'  ← FEHLT!

# ✅ Mit Cache
- name: Set up JDK 21
  uses: actions/setup-java@v4
  with:
    java-version: '21'
    distribution: 'temurin'
    cache: 'maven'  ← Jetzt geht's!

Problem 2: „Docker build fails: permission denied“

# Lösung: GitHub Actions braucht spezielle Docker-Permissions
- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v3

- name: Build Docker image
  uses: docker/build-push-action@v5
  with:
    context: .
    push: false
    tags: persons-api:latest

Problem 3: „Tests fail in pipeline but work locally“

# Häufig: Environment-Variablen fehlen
env:
  SPRING_PROFILES_ACTIVE: test
  DB_HOST: localhost
  DB_PORT: 5432

Stefan aus Berlin hatte genau Problem 3 letzte Woche. Oliver (unser DevOps Engineer) hat ihm dann geholfen, die Environment-Variablen richtig zu setzen. Funktioniert jetzt perfekt.


📊 Dein Erfolg in Zahlen

Vorher (manuell):

  • ⏰ 30 Minuten pro Deployment
  • 😰 20% Fehlerquote
  • 💸 Bei 20 Deployments/Monat = 10 Stunden verschwendet
  • 😴 Schlaflose Nächte bei Production-Problemen

Nachher (mit CI/CD):

  • ⚡ 7 Minuten automatisiert
  • ✅ <5% Fehlerquote (nur bei echten Bugs)
  • 💰 9+ Stunden gespart pro Monat
  • 😴 Ruhiger Schlaf (Pipeline handled es)

ROI: Nach einem Monat hast du die Setup-Zeit wieder raus. Ab dann nur noch Gewinn.


✅ Deine Checkliste für heute

Hast du:

  • [ ] Verstanden, was CI/CD ist? (Nicht nur Theory – das Warum!)
  • [ ] Eine Pipeline-Option gewählt? (GitHub Actions ODER Jenkins)
  • [ ] Deine erste Pipeline gebaut? (Copy-Paste zählt!)
  • [ ] Einen erfolgreichen Build gesehen? (Grüner Haken = Sieg!)
  • [ ] Die Pipeline für dein Projekt angepasst? (persons-api → dein-projekt)

Bonus-Aufgaben:

  • [ ] Pipeline mit deinem Team geteilt
  • [ ] Screenshot vom ersten grünen Build gemacht
  • [ ] Überlegt, welche Steps du noch brauchst

🎯 Community-Challenge: „Deine erste Pipeline“

Die Challenge diese Woche:

  1. Baue deine erste CI-Pipeline (GitHub Actions oder Jenkins)
  2. Deploye erfolgreich (mindestens bis Docker-Build)
  3. Mache einen Screenshot vom grünen Build
  4. Teile ihn mit #JavaFleetCI auf Twitter/LinkedIn
  5. Bonus: Pipeline unter 5 Minuten? Extra-Punkte!

Die besten 3 Submissions bekommen:

  • 🏆 Feature im nächsten Blogpost
  • 🎁 Java Fleet CI/CD Cheat-Sheet (exclusive)
  • ⭐ Shoutout auf allen Social Channels

Deadline: Nächsten Sonntag, 23:59 Uhr


💬 Deine Fragen – Meine Antworten

Q: Kostet GitHub Actions Geld?
A: Free tier: 2.000 Minuten/Monat. Für Hobby-Projekte reicht das locker. Public Repos: unlimited!

Q: Brauche ich einen eigenen Server für Jenkins?
A: Ja. Oder nutze Docker (wie oben gezeigt). Oder Cloud-Jenkins (Managed).

Q: Was, wenn ich GitLab benutze?
A: GitLab CI ist ähnlich wie GitHub Actions. Syntax anders, Konzept gleich. Kommt in Teil 6!

Q: Kann ich beide parallel nutzen?
A: Ja! Viele Firmen haben beides. GitHub Actions für neue Projekte, Jenkins für Legacy.

Q: Was kommt in Teil 2?
A: Quality Gates! Security-Scans, Code-Coverage, OWASP-Checks. Zero Tolerance für schlechten Code!

Q: Funktioniert das auch für andere Sprachen?
A: Ja! Python, JavaScript, Go, Rust – Konzepte bleiben gleich. Nur Tools ändern sich.


🎓 Was du heute gelernt hast

Du kannst jetzt:

  • ✅ Erklären, was CI/CD ist (und warum es wichtig ist)
  • ✅ GitHub Actions Pipeline schreiben
  • ✅ Jenkins Pipeline erstellen
  • ✅ Entscheiden, welches Tool für dich passt
  • ✅ Typische Fehler debuggen
  • ✅ Nie wieder manuell deployen

Du hast verstanden, dass CI/CD keine Magie ist. Es ist Automation. Und Automation spart Zeit, Nerven und lässt dich besser schlafen.

Und mein Team? Oliver baut gerade unsere nächste Cloud-Pipeline. Kofi optimiert den Code. Das ganze Java Fleet Team zieht an einem Strang. Gemeinsam machen wir CI/CD zur Routine.

Lisa würde trotzdem zustimmen – früher nach Hause ist immer gut. 😉


🔮 Ausblick: Was kommt als nächstes?

Teil 2 (nächste Woche): Quality Gates – Tests, Security, Code-Qualität

  • OWASP Dependency Check
  • JaCoCo Code Coverage
  • SonarQube Integration
  • Trivy Security Scanning
  • „Grün“ bedeutet nichts, wenn du nicht weißt WAS du misst

Teil 3 (in 2 Wochen): Deployment-Strategien

  • Blue-Green Deployment
  • Canary Releases
  • Zero-Downtime Updates
  • Rollback-Strategien

Teil 4 (in 3 Wochen): Monitoring & Feedback

  • Prometheus Integration
  • Grafana Dashboards
  • Alert-Management
  • Incident-Response

Teil 5 (in 4 Wochen): Jenkins Enterprise Deep-Dive

  • Shared Libraries
  • Distributed Builds
  • Configuration as Code
  • Security Best Practices

Teil 6 (Finale): Multi-Platform CI/CD

  • GitLab CI
  • Azure DevOps
  • Platform-Migration
  • Tool-agnostisches Design

📥 Downloads & Ressourcen

Heute für dich:

Alle Templates getestet mit:

  • ✅ Spring Boot 3.x
  • ✅ Maven 3.9
  • ✅ Java 21
  • ✅ Docker 24

🎬 Bernd’s Corner

In diesem Blog dürfen auch andere zu Wort kommen. Heute: Bernd.

„CI/CD. Endlich. Wurde auch Zeit.

Ich sage seit 2011, dass manuelles Deployment Zeitverschwendung ist.
Damals hat’s keiner hören wollen.

Jetzt, 14 Jahre später, wird’s ‚modern‘. Die Kids denken, sie haben’s erfunden.

Und CD? Continuous Deployment?
In der Realität steht’s für Continue Developing.
Weil nach dem Deployment ja erstmal die Bugs gefixt werden müssen.

Spoiler: Jenkins läuft bei mir seit… ach egal.

Macht’s einfach. Automatisiert alles. Geht Feierabend machen.

— Bernd, der das schon gemacht hat, als ihr noch in Maven 2 kompiliert habt“

(Mehr von Bernd in seiner Kolumne: „Irgendwer muss es ja sagen.“)


🔍 Easter Egg Hunt

Für die aufmerksamen Leser: Irgendwo in diesem Post versteckt sich ein Code-Wort. Finde es und suche es auf unserer Website – dort wartet ein exklusives Behind-the-Scenes-Dokument auf dich.

Hinweis: Es hat mit einem bestimmten Deployment zu tun, das um eine bestimmte Uhrzeit nicht funktioniert hat. 😏


💌 Bis nächste Woche!

Danke, dass du dabei warst. Wenn du Fragen hast, schreib mir:

  • 📧 code.sentinel@java-fleet.com
  • 💬 Twitter: @CodeSentinelDev
  • 💼 LinkedIn: Code Sentinel

Und vergiss nicht: Teile deine erste Pipeline mit #JavaFleetCI!

Wir sehen uns in den Builds. 🛡️

— Code Sentinel

P.S. Oliver meint, meine Pipelines könnten noch schneller sein. Challenge accepted!
P.P.S. Kofi zeigt mir gerade einen cleveren Algorithm-Trick für Build-Optimization.
P.P.P.S. Lisa? Eines Tages frage ich sie. Eines Tages…


📊 Nächster Post: Quality Gates – Warum „kompiliert“ nicht „gut“ bedeutet
📅 Erscheint: Nächsten Montag, 09:00 Uhr
🔔 Newsletter: Hier anmelden für Early Access


Tags: #CICD #GitHub #Jenkins #DevOps #JavaDevelopment #Automation #ContinuousIntegration #ContinuousDeployment #SpringBoot #Docker #Maven #Git

Serie: CI/CD-Grundlagen (Teil 1 von 6)

Autor

  • Cassian Holt

    43 Jahre alt, promovierter Informatiker mit Spezialisierung auf Programming Language Theory. Cassian arbeitet als Senior Architect bei Java Fleet Systems Consulting und bringt eine einzigartige wissenschaftliche Perspektive in praktische Entwicklungsprojekte. Seine Leidenschaft: Die Evolution von Programmiersprachen und warum "neue" Features oft alte Konzepte sind.