Jenkins ist eine in Java geschriebene, webbasierte Software zur kontinuierlichen Integration (Continuous Integration).
Dieser Artikel enthält eine Anleitung, wie man Jenkins installiert und Tomcat als Application Server verwendet. Tomcat liefert nur an localhost die Inhalte aus, als Schnittstelle nach aussen wird Nginx als Reverse Proxy eingesetzt.
Mit Hilfe dieser Anleitung hat man in weniger als 30 Minuten seinen Jenkins mit Tomcat über nginx am Laufen. Mit etwas Übung und ohne größere Komplikationen ist das Ganze sogar in nur wenigen Minuten lauffähig.
Welche Vorteile hat die Kombination Tomcat und Nginx?
- Der Einsatz von Tomcat ist ein stabiler und robuster Application Server
- Man kann mehrere Java Anwendungen auf einer Server Instanz über einen Dienst ausliefern (anstelle jede Anwendung als Standalone zu betreiben)
- Durch den Einsatz von Nginx können parallel zu den Java Anwendungen auch andere Projekte über Port 80 ausgeliefert werden
- Nginx ermöglicht den einfachen Einsatz von SSL und Zugriffssteuerung
- Der Einsatz von mehreren Server Instanzen “hinter” nginx ist möglich (z.B. mehrere Tomcat Nodes)
Was sind die Voraussetzungen und konkreten Ziele dieser Anleitung?
- Debian Squeeze wird als Betriebssystem vorausgesetzt
- Jenkins als CI Server installiert
- Tomcat6 als Anwendungsserver installiert
- Nginx als Reverse Proxy und über SSL betrieben
- Zugriff nur über SSL möglich. Anfragen auf Port 80 werden an Port SSL weitergeleitet
- Zugriff auf Jenkins nur über Nginx möglich
- Zielurl für Jenkins (kann und muss natürlich individuel angepasst werden): https://apps.meinedomain.de/jenkins
Installation und Konfiguration von Tomcat, Jenkins und Nginx
Die Installation und Konfiguration der drei Programme ist relativ einfach. Zuerst erweitern wir die APT Sources mit den dotdeb.org Paketen, damit eine aktuelle Nginx Version vorliegt. Dazu sind folgende Befehle erforderlich:
echo "deb http://packages.dotdeb.org stable all" >> /etc/apt/sources.list # Quelle eintragen
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 89DF5277 # Paketsignierung eintragen
Auch für Jenkins müssen wir ein Repository einbinden:
echo "deb http://pkg.jenkins-ci.org/debian binary/" >> /etc/apt/sources.list # Quelle eintragen
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | apt-key add - # Paketsignierung eintragen
Nun lesen wir die Paketquellen neu ein und installieren die benötigen Debian Pakete:
apt-get update
apt-get install jenkins nginx-full tomcat6 tomcat6-admin
Um in Tomcat die War Datei einzubinden, wird die Datei /etc/tomcat6/Catalina/localhost/jenkins.xml mit folgenden Inhalt angelegt:
<Context docBase="/var/lib/tomcat7/webapps/jenkins.war" privileged="true" allowLinking="true" crossContext="true">
<Environment name="JENKINS_HOME" value="/var/lib/jenkins/" type="java.lang.String"/>
</Context>
Jenkins wird standardmässig so installiert, dass er als Standalone ohne zusätzlichen Anwendungsserver läuft. Um dies zu ändern, geht man wie folgt vor:
service jenkins stop
Den Service stoppen und dann die Konfigurationsdatei /etc/default/jenkins bearbeiten und folgende Werte ändern:
JENKINS_USER=tomcat6
RUN_STANDALONE=false
Benutzer anpassen
Da wir Jenkins mit Tomcat betreiben wollen, muss der Benutzer zu den Jenkins Dateien angepasst werden:
chown -R tomcat6:adm /var/lib/jenkins
Nun setzen wir auf die WAR Datei, die über das Debian Paket bereitgestellt wird, einen symbolischen Link.
ln -s /usr/share/jenkins/jenkins.war /var/lib/tomcat7/webapps/jenkins.war
Vorteile dieser Variante
Natürlich hätte man das einfacher haben können, ohne dass man das Debian Paket installiert, die Änderungen am Standalone Jenkins durchführen muss, indem man einfach die WAR Datei direkt in das Verzeichnis kopiert hätte (diese wird auf https://www.jenkins.org angeboten). Der riesige Vorteil in der hier beschrieben Variante ist allerdings, dass man keine manuellen Update von Jenkins vornehmen muss. Diese werden nun automatisch mit jedem Systemupdate (apt-get upgrade) eingespielt - und Jenkins bringt im Durchschnitt 3-4 Updates im Monat!
Die nginx Konfiguration wird in die Datei /etc/nginx/sites-available/jenkins.conf erstellt:
server {
listen 443 ssl;
server_name apps.meinedomain.de;
access_log /var/log/nginx/apps.access.log;
root /var/www;
index index.php index.html;
ssl_certificate /etc/ssl/certs/meinedomain.crt;
ssl_certificate_key /etc/ssl/private/meinedomain.key;
location /jenkins {
root /var/lib/jenkins;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://jenkins;
proxy_redirect http:// https://;
add_header Pragma "no-cache";
}
}
# Redirect port 80 to 443
server {
listen 80;
server_name apps.meinedomain.de;
rewrite ^ https://apps.meinedomain.de/ permanent;
access_log /var/log/nginx/apps.access.log;
}
# Upstream server for jenkins
upstream jenkins {
server 127.0.0.1:8080 fail_timeout=0;
}
Nun muss die Konfiguration noch aktiviert werden, damit diese beim Start von Nginx mit berücksichtigt wird:
ln -s /etc/nginx/sites-available/apps.conf /etc/nginx/sites-enabled/apps.conf
Komfortabler geht es mit nginx_ensite (analog zu Apaches a2ensite)
Jetzt noch ein Restart von Nginx:
service nginx restart
und Jenkins sollte unter der URL
https://apps.meinedomain.de/jenkins/
erreichbar sein.
War die Installation erfolgreich und die oben genannte URL funktioniert, dann sieht der Loginbereich folgendermaßen aus. Hat es nicht geklappt, bitte diese Anleitung nochmal genau durchgehen. Taucht das Problem abermals auf, freue ich mich über Feedback per Kommentarfunktion.
Die AlphaNodes GmbH bietet verschiedene Services zur Webentwicklung an. Gerne unterstützen wir Dich bei verschiedenen Aufgaben, die rund um die Projektentwicklung und -pflege anfallen.