{"id":3765,"date":"2016-05-18T20:32:14","date_gmt":"2016-05-18T19:32:14","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=3765"},"modified":"2016-05-18T20:32:14","modified_gmt":"2016-05-18T19:32:14","slug":"gitlab-push-als-trigger-fuer-jenkins-mit-gitlab-community-ohne-enterprise","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/gitlab-push-als-trigger-fuer-jenkins-mit-gitlab-community-ohne-enterprise\/","title":{"rendered":"GitLab-Push als Trigger f\u00fcr Jenkins mit GitLab Community ohne Enterprise"},"content":{"rendered":"<p>Git setzt sich zunehmend\u00a0als eine Art Standard zur Versionsverwaltung bei Softwareentwicklern durch. Sp\u00e4testens bei komplexeren Projekten wird\u00a0Kontinuierliche Integration (CI) unverzichtbar, um die Qualit\u00e4t der Software zu gew\u00e4hrleisten sowie Abl\u00e4ufe effizient und einheitlich zu gestalten. Dank hoher Kompabilit\u00e4t und Flexibilit\u00e4t hat sich in diesem Bereich Jenkins einen Namen gemacht.\u00a0Setzt man Jenkins zusammen mit Git ein erscheint schnell der Wunsch, einen Jenkins-Buildjob automatisiert durch einen Git-Commit ausf\u00fchren zu lassen. GitLab bietet daf\u00fcr bereits eine <a href=\"http:\/\/doc.gitlab.com\/ee\/integration\/jenkins.html\" target=\"_blank\" rel=\"nofollow\">integrierte L\u00f6sung<\/a>, leider jedoch nur in der kostenpflichtigen Enterprise-Edition. Deren Kauf lohnt sich alleine wegen einer rudiment\u00e4ren Jenkins-Verbindung aber nicht unbedingt, vor allem f\u00fcr Private oder sehr kleine Firmen.<\/p>\n<p><strong>Im folgenden Artikel zeigen wir, wie sich Jenkins dennoch rudiment\u00e4r \u00fcber GitLab steuern l\u00e4sst &#8211; Ohne auf ineffizientes Polling zur\u00fcckzugreifen.\u00a0<\/strong><\/p>\n<h3><strong>Jenkins-Schnittstelle vorbereiten<\/strong><\/h3>\n<p>Da wir ereignisorientiert arbeiten wollen, ben\u00f6tigt GitLab eine Schnittstelle von Jenkins, um den Buildjob zu starten. Jenkins bietet von Haus aus zwar bereits eine API an. Leider unterst\u00fctzt diese nur HTTP-POST Anfragen, wogegen GitLab nur mit HTTP GET arbeitet. Daher ben\u00f6tigen wir das <a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/SCM+API+Plugin\" target=\"_blank\" rel=\"nofollow\">SCM API Plugin<\/a>, um dies nachzur\u00fcsten. In dieser Konstellation sollte dies in der Regel aber bereits installiert sein &#8211; es ist n\u00e4mlich eine Abh\u00e4ngigkeit des Git-Plugins.<\/p>\n<p>Schlussendlich ist es noch notwendig, dies unter Angabe eines Sicherheitsschl\u00fcssels f\u00fcr das jeweilige Jenkins-Projekt zu aktivieren. Dazu \u00f6ffnet man den gew\u00fcnschten Buildjob per Mausklick und klickt auf\u00a0<strong>Konfigurieren<\/strong>. Im Bereich Ausl\u00f6ser die Checkbox\u00a0<strong>Builds von au\u00dferhalb startenb aktivieren<\/strong> und ein frei w\u00e4hlbares Authentifizierungstoken eintragen. Dies sch\u00fctzt Jenkins vor der Ausf\u00fchrung des Jobs via API durch unbefugte Dritte.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/4772Hq.png\" alt=\"\" \/><\/p>\n<p>Als Basis-URL wird die URL des Jobs genutzt, wie in diesem Abschnitt bereits zu sehen.\u00a0F\u00fcr einen Job namens\u00a0<strong>Test<\/strong> lautet diese somit\u00a0<strong>http:\/\/jenkins-host.domain\/job\/Test<\/strong>. Je nachdem ob der Build parameterisiert ist oder nicht, h\u00e4ngen wir\u00a0<strong>build<\/strong> (keine\u00a0Parameter) oder\u00a0<strong>buildWithParameters<\/strong> getrennt von einem Schr\u00e4gstrich an. Schlussendlich ben\u00f6tigen wir in jeden Fall den GET-Parameter\u00a0<strong>token<\/strong> mit dem festgelegten Authentifizierungstoken. Im Beispiel des Test-Projektes sehen die URLs somit wie folgt aus:<\/p>\n<p><strong>http:\/\/jenkins-host.domain\/job\/Test\/build?token=Test123456<\/strong>\n<strong>http:\/\/jenkins-host.domain\/job\/Test\/buildWithParameters?token=Test123456&amp;param1=value1<\/strong><\/p>\n<h3><strong>API aus GitLab-Hook heraus aufrufen<\/strong><\/h3>\n<p>Nun \u00f6ffnen wir das dazugeh\u00f6rige GitLab-Projekt und klicken links unten in der Navigation auf\u00a0<strong>Settings<\/strong> sowie anschlie\u00dfend\u00a0<strong>Webhooks<\/strong>. In das URL-Feld wird die soeben ermittelte Jenkins-URL eingef\u00fcgt. Als Trigger sollte nur\u00a0<strong>Push events<\/strong> aktiviert sein:<\/p>\n<p><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/03\/gitlab-webhook.png\" rel=\"attachment wp-att-3774\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3774\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/03\/gitlab-webhook.png\" alt=\"\" width=\"1045\" height=\"632\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/03\/gitlab-webhook.png 1045w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/03\/gitlab-webhook-595x360.png 595w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/03\/gitlab-webhook-281x170.png 281w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/03\/gitlab-webhook-300x181.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/03\/gitlab-webhook-768x464.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2016\/03\/gitlab-webhook-1024x619.png 1024w\" sizes=\"auto, (max-width: 1045px) 100vw, 1045px\" \/><\/a><\/p>\n<p>Nach einem Klick auf\u00a0<strong>Add Webhook<\/strong> sollte er in der Auflistung am Ende der Seite erscheinen. Dort kann man durch einen Klick auf\u00a0<strong>Test Hook<\/strong> die URL testweise aufrufen lassen um sicherzustellen, dass alles wie gew\u00fcnscht funktioniert:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/6218Oq.png\" alt=\"\" \/><\/p>\n<p>Wurde alles richtig eingerichtet, sollte Jenkins nun mit der Ausf\u00fchrung des jeweiligen Jobs beginnen:<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/u-img.net\/img\/7395Mm.png\" alt=\"\" \/><\/p>\n<p>Sollte dies nicht klappen, empfiehlt es sich, die URL des Hooks wie sie in GitLab hinterlegt wurde einfach in einem normalen Internetbrowser zu \u00f6ffnen. Jenkins gibt dann in der Regel eine Fehlermeldung aus, die zumindest Anhaltspunkte gibt, wo die Ursache zu suchen ist.<\/p>\n<p>[box type=&#8220;info&#8220; ]Die hier gezeigte L\u00f6sung weist leider gegen\u00fcber des GitLab-Plugins aus der Enterprise-Edition einige Einschr\u00e4nkungen auf. Beispielsweise l\u00e4sst sich ohne weiteres kein spezieller Branch konfigurieren, auf den die Ausf\u00fchrung eingeschr\u00e4nkt werden soll. Dies l\u00e4sst sich mit etwas mehr Aufwand \u00fcber das <a href=\"https:\/\/github.com\/jenkinsci\/gitlab-plugin\" target=\"_blank\" rel=\"nofollow\">GitLab-Plugin<\/a> nachr\u00fcsten. F\u00fcr einfache Anwendungsf\u00e4lle d\u00fcrfte die hier genannte L\u00f6sung jedoch ausreichen und daher eine sinnvolle Alternative gegen\u00fcber dem Kauf der Enterprise-Version darstellen. [\/box]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Git setzt sich zunehmend\u00a0als eine Art Standard zur Versionsverwaltung bei Softwareentwicklern durch. Sp\u00e4testens bei komplexeren Projekten wird\u00a0Kontinuierliche Integration (CI) unverzichtbar, um die Qualit\u00e4t der Software zu gew\u00e4hrleisten sowie Abl\u00e4ufe effizient und einheitlich zu gestalten. Dank hoher Kompabilit\u00e4t und Flexibilit\u00e4t hat sich in diesem Bereich Jenkins einen Namen gemacht.\u00a0Setzt man Jenkins zusammen mit Git ein erscheint &#8230;<\/p>\n","protected":false},"author":5,"featured_media":3774,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[446,444,445,447],"class_list":["post-3765","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwareentwicklung","tag-ci","tag-gitlab","tag-jenkins","tag-kontinuierliche-integration"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/3765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=3765"}],"version-history":[{"count":13,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/3765\/revisions"}],"predecessor-version":[{"id":3778,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/3765\/revisions\/3778"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/3774"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=3765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=3765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=3765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}