{"id":69,"date":"2019-08-29T10:10:30","date_gmt":"2019-08-29T08:10:30","guid":{"rendered":"https:\/\/coding-hard.com\/blog\/?p=69"},"modified":"2020-04-11T05:31:31","modified_gmt":"2020-04-11T03:31:31","slug":"installation-eines-jenkins-servers-fuer-automatische-build-vorgaenge-eines-bitbucket-cloud-repository","status":"publish","type":"post","link":"https:\/\/blog.coding-hard.com\/?p=69","title":{"rendered":"Installation eines Jenkins Servers f\u00fcr (automatische) Build-Vorg\u00e4nge eines Bitbucket Cloud Repository"},"content":{"rendered":"\n<p>Im folgenden Tutorial wird gezeigt, wie man Jenkins auf\neinem Debian Server installiert und einrichtet, sodass Java-Projekt sowohl mit\nmit dem Java-Tool javac als auch mit Maven Java Projekte automatisch durch\nTrigger wie mergen oder pushen auf einen Bitbucket Cloud Server oder manuell kompilieren\nkann. Zuerst wird die Einrichtung von Jenkins gezeigt und im Anschluss die\nKonfiguration in der Bitbucket Cloud. Ben\u00f6tigt wird hierf\u00fcr ein Debian Server\noder auch ein einfacher Raspberry Pi mit Raspbian.<\/p>\n\n\n\n<p>Zuerst sollte man sich f\u00fcr die Befehle Administratorrechte\nauf dem Server beschaffen. Entweder direkt mit dem Benutzer root die Befehle\nausf\u00fchren oder mit folgendem Befehl (z.B. auf dem Raspberry Pi) root Rechte\nverschaffen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo -i<\/pre>\n\n\n\n<p>Um Jenkins zu installieren muss zuerst Java installiert\nwerden. Um zu schauen, ob Java installiert ist kann mit folgendem Befehl\n\u00fcberpr\u00fcft werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">java \u2013version<\/pre>\n\n\n\n<p>Sollte Java nicht installiert sein, kann es mit folgendem\nBefehl installiert werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt-get install openjdk-8-jre<\/pre>\n\n\n\n<p>Um sp\u00e4ter Java Code compilieren zu k\u00f6nnen wird auch noch das\nJava Development Kit (JDK) ben\u00f6tigt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt-get install openjdk-8-jdk<\/pre>\n\n\n\n<p>Als n\u00e4chstes sollte man den Server noch aktualisieren:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt-get update\napt-get upgrade<\/pre>\n\n\n\n<p>Als n\u00e4chstes muss ins Homeverzeichnis gewechselt werden und dort der Ordner Jenkins erstellt werden. Danach wechselt man in das Verzeichnis:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cd \/home\nmkdir Jenkins\ncd Jenkins<\/pre>\n\n\n\n<p>Nun muss das Jenkins-Repository noch in den Paket-Manager\neingetragen werden und danach die Liste geladen werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">wget -q -O - https:\/\/jenkins-ci.org\/debian\/jenkins-ci.org.key | sudo apt-key add -\necho deb http:\/\/pkg.jenkins.io\/debian-stable binary\/ > \/etc\/apt\/sources.list.d\/jenkins.list\nsudo apt-get update<\/pre>\n\n\n\n<p>Jetzt kann Jenkins installiert werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt-get install jenkins<\/pre>\n\n\n\n<p>Nach der Installation kann Jenkins \u00fcber die folgende URL erreicht werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/domainname.de:8080<\/pre>\n\n\n\n<p>Die Einrichtung dauert noch eine Weile und im Browser wird darauf hingewiesen, dass Jenkins gestartet wird. Nach der vollst\u00e4ndigen Einrichtung muss noch ein Passwort eingeben werden, welches man unter \/var\/lib\/jenkins\/initialAdminPassword oder \/var\/log\/jenkins\/jenkins.log findet:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cat \/var\/lib\/jenkins\/initialAdminPassword\ncat \/var\/log\/jenkins\/jenkins.log<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"1024\" height=\"711\" src=\"https:\/\/coding-hard.com\/blog\/wp-content\/uploads\/2019\/08\/image-1024x711.png\" alt=\"\" class=\"wp-image-98\" srcset=\"https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-1024x711.png 1024w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-300x208.png 300w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-768x533.png 768w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image.png 1040w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Danach wird noch ausgew\u00e4hlt, 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\u00dfen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">service jenkins start\nservice jenkins stop\nservice jenkins restart\n# oder\nhttp:\/\/domainname.de:8080\/restart\nhttp:\/\/domainname.de:8080\/safeRestart<\/pre>\n\n\n\n<p>Updaten l\u00e4sst sich Jenkins mit folgenden Befehlen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt-get update\napt-get install jenkins<\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Um nun Jenkins richtig nutzen zu k\u00f6nnen, m\u00fcssen noch git und maven installiert werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apt-get install git-core\napt-get install maven<\/pre>\n\n\n\n<p>Anschlie\u00dfend ben\u00f6tigt man noch ein ein Plugin f\u00fcr Bitbucket. Dazu muss links unter <strong>Jenkins verwalten &gt; Plugins Verwalten<\/strong> bei <strong>Verf\u00fcgbar<\/strong> nach Bitbucket oben im Filter gesucht werden und installiert werden. Danach sollte Jenkins neugestartet werden.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"1024\" height=\"711\" src=\"https:\/\/coding-hard.com\/blog\/wp-content\/uploads\/2019\/08\/image-1-1024x711.png\" alt=\"\" class=\"wp-image-99\" srcset=\"https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-1-1024x711.png 1024w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-1-300x208.png 300w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-1-768x533.png 768w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-1.png 1040w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Zur\u00fcck auf der Startseite kann man nun links ein neues Element erstellen und w\u00e4hlt die erste M\u00f6glichkeit &#8222;Freestyle Projekt&#8220; aus und gibt einen Namen an. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"1024\" height=\"711\" src=\"https:\/\/coding-hard.com\/blog\/wp-content\/uploads\/2019\/08\/image-2-1024x711.png\" alt=\"\" class=\"wp-image-100\" srcset=\"https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-2-1024x711.png 1024w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-2-300x208.png 300w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-2-768x533.png 768w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-2.png 1040w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Bei Verwaltungssystem w\u00e4hlt man GIT aus und gibt dort die Bitbucket Repository URL an (HTTPS). Wenn das Repository privat ist, m\u00fcssen noch die Benutzerdaten von Bitbucket eingegeben werden und ausgew\u00e4hlt werden. Bei Branch Specifier muss ausgew\u00e4hlt werden, welche Branches getrackt werden sollen.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"604\" height=\"337\" src=\"https:\/\/coding-hard.com\/blog\/wp-content\/uploads\/2019\/08\/image-3.png\" alt=\"\" class=\"wp-image-102\" srcset=\"https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-3.png 604w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-3-300x167.png 300w\" sizes=\"(max-width: 604px) 100vw, 604px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"1024\" height=\"711\" src=\"https:\/\/coding-hard.com\/blog\/wp-content\/uploads\/2019\/08\/image-4-1024x711.png\" alt=\"\" class=\"wp-image-104\" srcset=\"https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-4-1024x711.png 1024w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-4-300x208.png 300w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-4-768x533.png 768w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-4.png 1040w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Bei Build Ausl\u00f6ser muss  &#8222;Build when a change is pushed to BitBucket&#8220; ausgew\u00e4hlt werden. Nun hat man unterschiedliche M\u00f6glichkeiten, wie man bauen m\u00f6chte. Entweder mit Maven oder mit javac:<\/p>\n\n\n\n<ul><li>Buildverfahren Maven: Maven hinzuf\u00fcgen und die Goals eintragen (z.B. &#8222;clean install&#8220; in das Feld eintragen)<\/li><li>Buildverfahren javac: Shell ausf\u00fchren ausw\u00e4hlen und anschlie\u00dfend mit dem javac Befehl die Dateien kompilieren (z.B. javac \/src\/*.java)<\/li><\/ul>\n\n\n\n<p>Nun kann man noch weitere Shell Skripte hinzuf\u00fcgen, welche dann die Dateien in ein jar-Archiv packen, verschl\u00fcsseln, archivieren, filtern, durch den copy Befehl auf andere Server deployen und starten oder vieles mehr.<\/p>\n\n\n\n<p>Im letzten Punkt kann man noch eine Erstellung eines Artifacts hinzuf\u00fcgen. Hier wieder ausw\u00e4hlen welche Dateien behalten werden sollen (Alle Dateien mit &#8222;**\/*.*&#8220; ausw\u00e4hlen).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"1024\" height=\"711\" src=\"https:\/\/coding-hard.com\/blog\/wp-content\/uploads\/2019\/08\/image-5-1024x711.png\" alt=\"\" class=\"wp-image-105\" srcset=\"https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-5-1024x711.png 1024w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-5-300x208.png 300w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-5-768x533.png 768w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-5.png 1040w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Um das Projekt zu bauen, muss man im ausgew\u00e4hlten Projekt link noch auf &#8222;Jetzt bauen&#8220; klicken und schon wird ein Buildvorgang gestartet. Im Build k\u00f6nnen sich die Artifacts angeschaut und heruntergeladen werden.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"1024\" height=\"711\" src=\"https:\/\/coding-hard.com\/blog\/wp-content\/uploads\/2019\/08\/image-6-1024x711.png\" alt=\"\" class=\"wp-image-106\" srcset=\"https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-6-1024x711.png 1024w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-6-300x208.png 300w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-6-768x533.png 768w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-6.png 1040w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Um automatisch bei Triggern zu bauen muss im Bitbucket-Projekt unter <strong>Einstellungen &gt; Webhooks<\/strong> noch ein Webhook hinzugef\u00fcgt werden. Hierbei muss ausgew\u00e4hlt werden, wann dies geschieht und als URL folgendes eingetragen werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/domainname.de:8080\/bitbucket-hook<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"1024\" height=\"711\" src=\"https:\/\/coding-hard.com\/blog\/wp-content\/uploads\/2019\/08\/image-7-1024x711.png\" alt=\"\" class=\"wp-image-107\" srcset=\"https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-7-1024x711.png 1024w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-7-300x208.png 300w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-7-768x533.png 768w, https:\/\/blog.coding-hard.com\/wp-content\/uploads\/2019\/08\/image-7.png 1040w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Nun werden bei den gesetzten Triggern ein Buildvorgang gestartet. Ich hoffe das Tutorial konnte bei einigen Problemen eine Hilfestellung geben.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2>Weitere Anmerkungen und M\u00f6glichkeiten<\/h2>\n\n\n\n<h4>Einrichtung Reverse Proxy<\/h4>\n\n\n\n<p>Um einen Reverse-Proxy mit Apache2 einzurichten, muss man zuerst die neue Konfigurationsdatei erstellen. Hierf\u00fcr wird vorausgesetzt, dass es schon Zertifikate wie von LetsEncrypt erstellt wurden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nano \/etc\/apache2\/sites-available\/jenkins-le-ssl.conf<\/pre>\n\n\n\n<p>Dort wird folgender Inhalt eingef\u00fcgt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VirtualHost *:80>\n    ServerName jenkins.domain.de\n\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n\n    RewriteEngine on\n    RewriteRule ^ https:\/\/%{HTTP_HOST}%{REQUEST_URI} [R=301,L]\n\n&lt;\/VirtualHost>\n&lt;VirtualHost *:443>\n    ServerName jenkins.domain.de\n\n    SSLEngine On\n    SSLCertificateFile    \/etc\/letsencrypt\/live\/domain\/fullchain.pem\n    SSLCertificateKeyFile \/etc\/letsencrypt\/live\/domain\/privkey.pem\n\n    ProxyRequests     Off\n    ProxyPreserveHost On\n    AllowEncodedSlashes NoDecode\n    &lt;Proxy *>\n        Order deny,allow\n        Allow from all\n    &lt;\/Proxy>\n\n    ProxyPass \/ http:\/\/localhost:8080\/ nocanon\n    ProxyPassReverse \/ http:\/\/localhost:8080\/\n    ProxyPassReverse \/ http:\/\/jenkins.domain.de\/\n\n    RequestHeader set X-Forwarded-Proto \"https\"\n    RequestHeader set X-Forwarded-Port \"443\"\n\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n\n&lt;\/VirtualHost><\/pre>\n\n\n\n<p>Anschlie\u00dfend noch die Konfiguration anwenden bzw. updaten und Apache2 sowie Jenkins neustarten:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">a2ensite site\nservice apache2 restart\nservice jenkins restart<\/pre>\n\n\n\n<p>Nun muss noch in der Jenkins Konfiguration die URL bei &#8222;Jenkins URL&#8220; angepasst werden und gespeichert werden.<\/p>\n\n\n\n<h4>Nur \u00fcber Reverse Proxy zugreifen<\/h4>\n\n\n\n<p>Falls ein Reverse Proxy eingerichtet hat und man sich nur noch \u00fcber diesen verbinden soll, musst man die Jenkins-Konfiguration anpassen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nano \/etc\/default\/jenkins<\/pre>\n\n\n\n<p>Nun kann man hier hier den Eintrag unten anpassen. Optional kann hier auch der HTTPS-Port angegeben werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">JENKINS_ARGS=\"--webroot=\/var\/cache\/$NAME\/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1\"<\/pre>\n\n\n\n<p>Es sollte bei einem Reverse-Proxy zudem noch der neue Pfad in der Konfiguration eingestellt werden (falls noch nicht geschehen):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Jenkins URL: URL<\/pre>\n\n\n\n<h4>Locale \u00e4ndern<\/h4>\n\n\n\n<p>Um alles in eine Sprache umzustellen, muss das Plugin &#8222;Locale&#8220; installiert werden. Anschlie\u00dfend in der Jenkins-Konfiguration unter Locale folgenden Wert eintragen (f\u00fcr Englisch) und anschlie\u00dfend einen Haken bei &#8222;force this language&#8220; setzen :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Default Language en_US<\/pre>\n\n\n\n<h4>Buildstatus Badge f\u00fcr GitHub<\/h4>\n\n\n\n<p>Um in GitHub ein Badge f\u00fcr den Buildstatus einzubinden, muss das Plugin &#8222;Embeddable Build Status&#8220; hinzugef\u00fcgt werden und in der README.md folgende Zeile eingebunden werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[![Build Status](https:\/\/domain\/buildStatus\/icon?job=repo)](https:\/\/domain\/job\/repo\/)<\/pre>\n\n\n\n<h4>SSH Login f\u00fcr Bitbucket<\/h4>\n\n\n\n<p>Falls f\u00fcr die Identifikation in Bitbucket ein SSH-Key verwendet werden soll, kann dieser mit folgendem Befehl erstellt werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ssh-keygen -t RSA -b 4096 -C \"mail@domain\"<\/pre>\n\n\n\n<p>Nun navigieren wir zu dem Standard-Ordner, in dem die generierten Dateien liegen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cd \/root\/.ssh\/<\/pre>\n\n\n\n<p>Die generierten Schl\u00fcssel kann man mit folgendem Befehl anzeigen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cat key\ncat key.pub<\/pre>\n\n\n\n<p>In Jenkins wird nun der Private Schl\u00fcssel als Autorisierung eingef\u00fcgt. Zudem wird die Respository-URL angepasst:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ssh:\/\/git@bitbucket.org\/user\/repo.git<\/pre>\n\n\n\n<p>Nun muss noch in Bitbucket bei den Webhooks die URL ge\u00e4ndert werden, indem man dort die Benutzerdaten eines Jenkins-Admins mitgibt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">https:\/\/user:pw@domain\/bitbucket-hook\/<\/pre>\n\n\n\n<h4>Branch zum Bauen ausw\u00e4hlen<\/h4>\n\n\n\n<p>Um nur einen gewissen gewissen Branch zu bauen, kann dies in der Projektkonfiguration in Bitbucket eingestellt werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">*\/master<\/pre>\n\n\n\n<h4>Beispielhaftes deployen und neustarten mit screen<\/h4>\n\n\n\n<p>Um eine von Maven erstellte Jar-Datei zu deployen, kann folgendes Skript verwendet werden:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cp $(find .\/target -name \"*.jar\") \/home\/ordner\n# Oder um einen Prozess in einem Screen neu zu starten (apt-get install screen)\nif screen -list | grep -q \"name\"; then\n        screen -S name -X kill\nfi\nscreen -mdS bukkit java -jar \/home\/ordner\/datei.jar<\/pre>\n\n\n\n<h4>Jenkins Logs<\/h4>\n\n\n\n<p>Die Logs werden standardm\u00e4\u00dfig in folgendem Ordner gespeichert:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/var\/log\/jenkins<\/pre>\n\n\n\n<p><strong>Quellen:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link\" href=\"https:\/\/coding-unicorn.de\/java-welt\/continuous-integration-ci\/jenkins-server\/\">Continuous Integration &#8211; Jenkins Server<\/a><\/div>\n\n\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link\" href=\"https:\/\/pkg.jenkins.io\/debian-stable\/\">Jenkins Repository<\/a><\/div>\n\n\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link\" href=\"https:\/\/medium.com\/@mohan08p\/jenkins-integration-with-bitbucket-github-webhook-25a191507cab\">Jenkins Integration Bitbucket Webhook<\/a><\/div>\n ","protected":false},"excerpt":{"rendered":"<p>Im folgenden Tutorial wird gezeigt, wie man Jenkins auf einem Debian Server installiert und einrichtet, sodass Java-Projekt sowohl mit mit&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=\/wp\/v2\/posts\/69"}],"collection":[{"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=69"}],"version-history":[{"count":16,"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=\/wp\/v2\/posts\/69\/revisions"}],"predecessor-version":[{"id":202,"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=\/wp\/v2\/posts\/69\/revisions\/202"}],"wp:attachment":[{"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=69"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=69"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.coding-hard.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=69"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}