Installation eines Jenkins Servers für (automatische) Build-Vorgänge eines Bitbucket Cloud Repository

Im folgenden Tutorial wird gezeigt, wie man Jenkins auf einem Debian Server installiert und einrichtet, sodass Java-Projekt sowohl mit mit dem Java-Tool javac als auch mit Maven Java Projekte automatisch durch Trigger wie mergen oder pushen auf einen Bitbucket Cloud Server oder manuell kompilieren kann. Zuerst wird die Einrichtung von Jenkins gezeigt und im Anschluss die Konfiguration in der Bitbucket Cloud. Benötigt wird hierfür ein Debian Server oder auch ein einfacher Raspberry Pi mit Raspbian.

Zuerst sollte man sich für die Befehle Administratorrechte auf dem Server beschaffen. Entweder direkt mit dem Benutzer root die Befehle ausführen oder mit folgendem Befehl (z.B. auf dem Raspberry Pi) root Rechte verschaffen:

sudo -i

Um Jenkins zu installieren muss zuerst Java installiert werden. Um zu schauen, ob Java installiert ist kann mit folgendem Befehl überprüft werden:

java –version

Sollte Java nicht installiert sein, kann es mit folgendem Befehl installiert werden:

apt-get install openjdk-8-jre

Um später Java Code compilieren zu können wird auch noch das Java Development Kit (JDK) benötigt:

apt-get install openjdk-8-jdk

Als nächstes sollte man den Server noch aktualisieren:

apt-get update
apt-get upgrade

Als nächstes muss ins Homeverzeichnis gewechselt werden und dort der Ordner Jenkins erstellt werden. Danach wechselt man in das Verzeichnis:

cd /home
mkdir Jenkins
cd Jenkins

Nun muss das Jenkins-Repository noch in den Paket-Manager eingetragen werden und danach die Liste geladen werden:

wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list
sudo apt-get update

Jetzt kann Jenkins installiert werden:

apt-get install jenkins

Nach der Installation kann Jenkins über die folgende URL erreicht werden:

http://domainname.de:8080

Die Einrichtung dauert noch eine Weile und im Browser wird darauf hingewiesen, dass Jenkins gestartet wird. Nach der vollständigen Einrichtung muss noch ein Passwort eingeben werden, welches man unter /var/lib/jenkins/initialAdminPassword oder /var/log/jenkins/jenkins.log findet:

cat /var/lib/jenkins/initialAdminPassword
cat /var/log/jenkins/jenkins.log

Danach wird noch ausgewählt, dass alle vorgeschlagenen Plugins installiert werden sollen und legt sich einen Admin Account an. Nun ist der Jenkins Server aufgesetzt. Starten, stoppen und neustarten kann man den Server folgendermaßen:

service jenkins start
service jenkins stop
service jenkins restart
# oder
http://domainname.de:8080/restart
http://domainname.de:8080/safeRestart

Updaten lässt sich Jenkins mit folgenden Befehlen:

apt-get update
apt-get install jenkins

Um nun Jenkins richtig nutzen zu können, müssen noch git und maven installiert werden:

apt-get install git-core
apt-get install maven

Anschließend benötigt man noch ein ein Plugin für Bitbucket. Dazu muss links unter Jenkins verwalten > Plugins Verwalten bei Verfügbar nach Bitbucket oben im Filter gesucht werden und installiert werden. Danach sollte Jenkins neugestartet werden.

Zurück auf der Startseite kann man nun links ein neues Element erstellen und wählt die erste Möglichkeit „Freestyle Projekt“ aus und gibt einen Namen an.

Bei Verwaltungssystem wählt man GIT aus und gibt dort die Bitbucket Repository URL an (HTTPS). Wenn das Repository privat ist, müssen noch die Benutzerdaten von Bitbucket eingegeben werden und ausgewählt werden. Bei Branch Specifier muss ausgewählt werden, welche Branches getrackt werden sollen.

Bei Build Auslöser muss „Build when a change is pushed to BitBucket“ ausgewählt werden. Nun hat man unterschiedliche Möglichkeiten, wie man bauen möchte. Entweder mit Maven oder mit javac:

  • Buildverfahren Maven: Maven hinzufügen und die Goals eintragen (z.B. „clean install“ in das Feld eintragen)
  • Buildverfahren javac: Shell ausführen auswählen und anschließend mit dem javac Befehl die Dateien kompilieren (z.B. javac /src/*.java)

Nun kann man noch weitere Shell Skripte hinzufügen, welche dann die Dateien in ein jar-Archiv packen, verschlüsseln, archivieren, filtern, durch den copy Befehl auf andere Server deployen und starten oder vieles mehr.

Im letzten Punkt kann man noch eine Erstellung eines Artifacts hinzufügen. Hier wieder auswählen welche Dateien behalten werden sollen (Alle Dateien mit „**/*.*“ auswählen).

Um das Projekt zu bauen, muss man im ausgewählten Projekt link noch auf „Jetzt bauen“ klicken und schon wird ein Buildvorgang gestartet. Im Build können sich die Artifacts angeschaut und heruntergeladen werden.

Um automatisch bei Triggern zu bauen muss im Bitbucket-Projekt unter Einstellungen > Webhooks noch ein Webhook hinzugefügt werden. Hierbei muss ausgewählt werden, wann dies geschieht und als URL folgendes eingetragen werden:

http://domainname.de:8080/bitbucket-hook

Nun werden bei den gesetzten Triggern ein Buildvorgang gestartet. Ich hoffe das Tutorial konnte bei einigen Problemen eine Hilfestellung geben.


Weitere Anmerkungen und Möglichkeiten

Einrichtung Reverse Proxy

Um einen Reverse-Proxy mit Apache2 einzurichten, muss man zuerst die neue Konfigurationsdatei erstellen. Hierfür wird vorausgesetzt, dass es schon Zertifikate wie von LetsEncrypt erstellt wurden:

nano /etc/apache2/sites-available/jenkins-le-ssl.conf

Dort wird folgender Inhalt eingefügt:

<VirtualHost *:80>
    ServerName jenkins.domain.de

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    RewriteEngine on
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

</VirtualHost>
<VirtualHost *:443>
    ServerName jenkins.domain.de

    SSLEngine On
    SSLCertificateFile    /etc/letsencrypt/live/domain/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/domain/privkey.pem

    ProxyRequests     Off
    ProxyPreserveHost On
    AllowEncodedSlashes NoDecode
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / http://localhost:8080/ nocanon
    ProxyPassReverse / http://localhost:8080/
    ProxyPassReverse / http://jenkins.domain.de/

    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Anschließend noch die Konfiguration anwenden bzw. updaten und Apache2 sowie Jenkins neustarten:

a2ensite site
service apache2 restart
service jenkins restart

Nun muss noch in der Jenkins Konfiguration die URL bei „Jenkins URL“ angepasst werden und gespeichert werden.

Nur über Reverse Proxy zugreifen

Falls ein Reverse Proxy eingerichtet hat und man sich nur noch über diesen verbinden soll, musst man die Jenkins-Konfiguration anpassen:

nano /etc/default/jenkins

Nun kann man hier hier den Eintrag unten anpassen. Optional kann hier auch der HTTPS-Port angegeben werden:

JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"

Es sollte bei einem Reverse-Proxy zudem noch der neue Pfad in der Konfiguration eingestellt werden (falls noch nicht geschehen):

Jenkins URL: URL

Locale ändern

Um alles in eine Sprache umzustellen, muss das Plugin „Locale“ installiert werden. Anschließend in der Jenkins-Konfiguration unter Locale folgenden Wert eintragen (für Englisch) und anschließend einen Haken bei „force this language“ setzen :

Default Language en_US

Buildstatus Badge für GitHub

Um in GitHub ein Badge für den Buildstatus einzubinden, muss das Plugin „Embeddable Build Status“ hinzugefügt werden und in der README.md folgende Zeile eingebunden werden:

[![Build Status](https://domain/buildStatus/icon?job=repo)](https://domain/job/repo/)

SSH Login für Bitbucket

Falls für die Identifikation in Bitbucket ein SSH-Key verwendet werden soll, kann dieser mit folgendem Befehl erstellt werden:

ssh-keygen -t RSA -b 4096 -C "mail@domain"

Nun navigieren wir zu dem Standard-Ordner, in dem die generierten Dateien liegen:

cd /root/.ssh/

Die generierten Schlüssel kann man mit folgendem Befehl anzeigen:

cat key
cat key.pub

In Jenkins wird nun der Private Schlüssel als Autorisierung eingefügt. Zudem wird die Respository-URL angepasst:

ssh://git@bitbucket.org/user/repo.git

Nun muss noch in Bitbucket bei den Webhooks die URL geändert werden, indem man dort die Benutzerdaten eines Jenkins-Admins mitgibt:

https://user:pw@domain/bitbucket-hook/

Branch zum Bauen auswählen

Um nur einen gewissen gewissen Branch zu bauen, kann dies in der Projektkonfiguration in Bitbucket eingestellt werden:

*/master

Beispielhaftes deployen und neustarten mit screen

Um eine von Maven erstellte Jar-Datei zu deployen, kann folgendes Skript verwendet werden:

cp $(find ./target -name "*.jar") /home/ordner
# Oder um einen Prozess in einem Screen neu zu starten (apt-get install screen)
if screen -list | grep -q "name"; then
        screen -S name -X kill
fi
screen -mdS bukkit java -jar /home/ordner/datei.jar

Jenkins Logs

Die Logs werden standardmäßig in folgendem Ordner gespeichert:

/var/log/jenkins

Quellen:

Total Page Visits: 178 - Today Page Visits: 1