Im Rahmen der Qualitätssicherung ist es für jedes Softwareprojekt wichtig, dass man den entwickelten Code testet. Im Rahmen des automatisierten Testens ist die sog. „Continous Integration“ von großer Bedeutung. Doch um diese Umsetzen zu können benötigt man erst einmal ein paar Grundwerkzeuge, die durch Software zur Verfügung gestellt werden können. Eine solche Software ist die Webanwendung „Jenkins“. Im Folgenden wird nun erklärt wie man diese Komponente möglichst einfach unter CentOS installiert.
Jenkins ist sehr gut dokumentiert. Auch zur Installation gibt es einiges an Dokumentation. Die für Linux relevante Informationen finden sich hier.
Jenkins installieren
Kurz zusammengefasst sieht die Installation so aus, dass man in yum ein neues Repository einfügt, mit welchem dann die Installation von Jenkins an sich sehr einfach und schnell erledigt ist. Dabei wird auch ein neuer Benutzer mit dem Namen „jenkins“ angelegt, der dann die Rechte auf das JENKINS_HOME bekommt (das ist dann per default „/var/lib/jenkins“).
Zur Installation führt man folgende Kommandos aus (als root):
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key yum install jenkins
Apache-Proxy einrichten
Am einfachsten kann man Jenkins erreichbar machen (wenn man schon einen Apache Webserver installiert hat), in dem man einen Proxy von Apache zu Jenkins einrichtet. Verwendet man außerdem noch eine SSL-Verschlüsselung (wozu ich nur raten kann), dann sieht eine mögliche Konfiguration wie folgt aus. Diese speichert man im Apache-Konfigurationsverzeichnis (beispielsweise als Datei „/etc/httpd/conf.d/jenkins.conf“)
ProxyRequests Off ProxyPreserveHost On ProxyPass /jenkins/ http://localhost:8081/jenkins/ <Location /jenkins/> ProxyPassReverse / Order deny,allow Allow from all </Location> Header edit Location ^http://server.krismer.de/jenkins/ https://server.krismer.de/jenkins/
Jenkins konfigurieren
Mit Hilfe der Datei „/etc/sysconfig/jenkins“ kann man jenkins sehr leicht konfigurieren. Damit jenkins mit dem eben eingerichteten Apache-Proxy klar kommt, muss man den Prefix von Jenkins (jenes Verzeichnis, in dem Jenkins erreichbar ist) setzen und sollte auch die httpListenAddress auf „127.0.0.1“ festsetzen. Alles in allem sieht eine Beispielkonfiguration etwa so aus:
## Path: Development/Jenkins ## Description: Configuration for the Jenkins continuous build server ## Type: string ## Default: "/var/lib/jenkins" ## ServiceRestart: jenkins # # Directory where Jenkins store its configuration and working # files (checkouts, build reports, artifacts, ...). # JENKINS_HOME="/var/lib/jenkins" ## Type: string ## Default: "" ## ServiceRestart: jenkins # # Java executable to run Jenkins # When left empty, we'll try to find the suitable Java. # JENKINS_JAVA_CMD="" ## Type: string ## Default: "jenkins" ## ServiceRestart: jenkins # # Unix user account that runs the Jenkins daemon # Be careful when you change this, as you need to update # permissions of $JENKINS_HOME and /var/log/jenkins. # JENKINS_USER="jenkins" ## Type: string ## Default: "-Djava.awt.headless=true" ## ServiceRestart: jenkins # # Options to pass to java when running Jenkins. # JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true" ## Type: integer(0:65535) ## Default: 8080 ## ServiceRestart: jenkins # # Port Jenkins is listening on. # Set to -1 to disable # JENKINS_PORT="8081" ## Type: integer(0:65535) ## Default: 8009 ## ServiceRestart: jenkins # # Ajp13 Port Jenkins is listening on. # Set to -1 to disable # JENKINS_AJP_PORT="-1" ## Type: integer(1:9) ## Default: 5 ## ServiceRestart: jenkins # # Debug level for logs -- the higher the value, the more verbose. # 5 is INFO. # JENKINS_DEBUG_LEVEL="5" ## Type: yesno ## Default: no ## ServiceRestart: jenkins # # Whether to enable access logging or not. # JENKINS_ENABLE_ACCESS_LOG="no" ## Type: integer ## Default: 100 ## ServiceRestart: jenkins # # Maximum number of HTTP worker threads. # JENKINS_HANDLER_MAX="20" ## Type: integer ## Default: 20 ## ServiceRestart: jenkins # # Maximum number of idle HTTP worker threads. # JENKINS_HANDLER_IDLE="10" ## Type: string ## Default: "" ## ServiceRestart: jenkins # # Pass arbitrary arguments to Jenkins. # Full option list: java -jar jenkins.war --help # JENKINS_ARGS="--prefix=/jenkins --httpListenAddress=127.0.0.1"
Will man Jenkins zur Zusammenarbeit mit Gitlab überreden macht es Sinn, einen eigenen Benutzer für jenkins anzulegen. Der über yum installierte Benutzer ist zwar gültig, man kann jedoch nicht per „su“-Kommando auf diesen Benutzer wechseln. Nach dem Erstellen eines eigenen jenkins-Benutzer (mit vorherigem Löschen des „alten“ Benutzer und anschließendem Anlegen eines „echten“ Jenkins-Benutzers) lässt sich dann auch die Integration von Jenkins und Gitlab per SSH-Keys bewerkstelligen.
Außerdem kann man dann auch gleich das Jenkins_Home auf „/home/jenkins“ legen, um so beispielsweise das Backup des Jenkins-Workspaces zu vereinfachen)
Mit bestimmten Plugins kann es unter CentOS zu Problemen bekommen. Gerade dann, wenn die Plugins eine Grafik ausgeben wollen (wie zum Beispiel das TaskScanner Plugin), dann kann im Jenkins Frontend die Meldung „Unable to access X. You need to run the container in the headless mode. Add -D.java.awt.headless=true to VM“ auftauchen, obwohl man in der sysconfig schon eingestellt hat, dass man in besagtem Modus arbeitet.
Sieht man sich die Fehlermeldung dann in den Log-Files genauer an, so kann man feststellen, dass es sich hierbei um ein Problem mit nicht installierten Schriften handelt.
Die Lösung für CentOS sieht nun so aus, dass man sich per yum ein paar Schriften nachinstalliert (als root):