Kontext & Motivation
In modernen Software-Teams ist Continuous Integration der Standard — jeder Code-Commit muss automatisch gebaut, getestet und analysiert werden, bevor er in die Produktion gelangt. Manuelle Prozesse sind fehleranfällig, langsam und nicht reproduzierbar.
Ziel dieses Projekts war es, eine vollständige CI-Pipeline auf AWS EC2 aufzubauen — von der Infrastruktur bis zur Slack-Benachrichtigung — und dabei industrielle Standards wie Quality Gates und versionierte Artefakte umzusetzen.
Pipeline
GitHub → Jenkins → SonarQube → Nexus → Slack
Infrastruktur
3 AWS EC2 Instanzen — Jenkins, Nexus, SonarQube
Werkzeuge
Jenkins, Maven, SonarQube, Nexus, GitHub, Slack
Standard
Quality Gate — kein Artefakt ohne bestandene Code-Analyse
1 — Pipeline Flow
Push
Trigger
Build
Tests
Analyse
Analyse
Gate
Upload
Notification
2 — AWS EC2 Infrastruktur
Die CI-Pipeline läuft auf 3 dedizierten EC2 Instanzen mit getrennten Security Groups.
Jenkins EC2
OS: Ubuntu 24.04
Tools: Jenkins, Java 17, Maven 3.9.9
SG: jenkins-sg
Port: 8080
Zugriff: http://PUBLIC_IP:8080
Nexus EC2
OS: Amazon Linux 2023
Tools: Nexus Repository Manager 3
SG: nexus-sg
Port: 8081
Zugriff: http://PUBLIC_IP:8081
SonarQube EC2
OS: Ubuntu 24.04
Tools: SonarQube, PostgreSQL, Nginx
SG: sonar-sg
Port: 80 (Nginx)
Zugriff: http://PUBLIC_IP
Nexus Repository Struktur
| Repository | Typ | Zweck |
|---|---|---|
| profile-release | hosted | Stabile Release-Artefakte |
| profile-snapshot | hosted | Snapshot-Versionen (Dev) |
| pro-maven-central | proxy | Cache für Maven Central |
| pro-maven-group | group | Zentraler Einstiegspunkt für Maven |
3 — Jenkinsfile
Die Pipeline ist vollständig als Code definiert — reproduzierbar und versioniert in GitHub.
pipeline {
agent any
tools {
maven "MAVEN3"
jdk "OracleJDK17"
}
environment {
NEXUSIP = 'NEXUS_PRIVATE_IP'
NEXUSPORT = '8081'
RELEASE_REPO = 'profile-release'
NEXUS_LOGIN = 'nexuslogin'
SONARSERVER = 'sonarserver'
SONARSCANNER = 'sonarscanner'
}
stages {
stage('Build') { ... }
stage('Test') { ... }
stage('Checkstyle') { ... }
stage('Sonar Analysis') { ... }
stage('Quality Gate') { ... }
stage('UploadArtifact') { ... }
}
post {
always { slackSend(...) }
}
}
Artefakt-Versionierung
Jedes Artefakt wird eindeutig versioniert — kein Überschreiben möglich :
version: "${env.BUILD_ID}-${env.BUILD_TIMESTAMP}"
→ Beispiel: profileapp-36-26-01-20_23:46.war
4 — Fehler & Lösungen
Reale Fehler die während des Projekts aufgetreten sind und wie ich sie gelöst habe.
SSH Host Key Verification Failed
Lösung
# Als jenkins user auf der EC2 sudo su - jenkins ssh -T git@github.com # "yes" eingeben → GitHub wird in known_hosts gespeichert
5 — Ergebnisse
SonarQube Quality Gate — PASSED
SonarQube Dashboard
Nexus — Artefakt hochgeladen
6 — Zusammenfassung
| Komponente | Tool | Status |
|---|---|---|
| CI Orchestration | Jenkins auf AWS EC2 | ✅ |
| Build & Dependencies | Maven + Nexus Proxy | ✅ |
| Unit Tests | JUnit via Maven | ✅ |
| Code Style | Checkstyle | ✅ |
| Code Quality | SonarQube | ✅ |
| Quality Gate | SonarQube → Jenkins | ✅ |
| Artefakt Management | Nexus Repository | ✅ |
| Automatischer Trigger | GitHub Webhook | ✅ |
| Team Notification | Slack | ✅ |
Demonstrierte Kompetenzen
7 — Ausblick
-
1
CD — Continuous Deployment
Erweiterung der Pipeline um eine Deployment-Stage — automatisches Deployment des Artefakts auf Tomcat/EC2 oder Elastic Beanstalk nach erfolgreichem CI. -
2
Docker Integration
Docker-Image aus dem WAR-Artefakt bauen und in DockerHub veröffentlichen — Basis für Container-basiertes Deployment. -
3
Kubernetes Deployment
Den Docker-Container in einem Kubernetes-Cluster deployen — Skalierbarkeit und Hochverfügbarkeit. -
4
Infrastructure as Code mit Terraform
Die gesamte AWS-Infrastruktur (EC2, Security Groups, VPC) als Terraform-Code definieren — vollständig reproduzierbar und versioniert.