oose
Komm am 21.06. auf unseren oose.campus zum perspectives-festival.de 🥳
DeutschDeutsch

Jenkins SCM Sync Plugin mit git und SSH konfigurieren

Blog offline

Dieser Artikel stammt aus unserem Blog, der nicht mehr betreut wird. Für Neuigkeiten zu oose und interessante Inhalte zu unseren Themen, folgt uns gerne auf LinkedIn.

Wie in einem vorherigen Blogpost geschrieben, halte ich es für eine gute Idee, die Konfiguration des Jenkins Servers in einer externen Versionsverwaltung abzulegen, um die Konfiguration mindestens gesichert zu haben aber auch Änderungen nachvollziehen und ggf. zurückrollen zu können und bei Bedarf den Buildserusever inklusive Konfiguration und Jobs neu aufsetzen zu können.

Da die Konfiguration des dazu gedachten SCM Sync Plugins einige Fallstricke bereit hält, beschreibe ich hier einmal die Schritte, um eine lokale Jenkins Instanz unter Linux (Ubuntu 14.04) mit einem Bitbucket Repository (bitbucket.org) zu verbinden.

1.) SSH Key erzeugen

Um einen zum einen sicheren und zum anderen ohne Benutzerinteraktion ablaufenden Zugriff auf das Repository zu ermöglichen benötigt man ein SSH Schlüsselpaar, das dem Jenkins Benutzer „gehört“. Die beiden Schlüssel – private und public key – werden im „.ssh“ Verzeichnis im „$HOME“ des jenkins Users angelegt. Bei mir ist das „/var/lib/jenkins/.ssh“. Beim Generieren des Schlüssels fragt ssh-keygen nach dem Namen des Schlüssels und dem Speicherort. „/var/lib/jenkins/.ssh/id_rsa“ ist der default. Insbesondere im Zusammenhang mit dem SCM Sync plugin und git funktioniert ein alternativer Dateiname für den Schlüssel nicht! Deshalb muss unbedingt genau dieser default verwendt werden. (siehe hier)

  • Auf den Jenkins Host „wird“ man zunächst der Jenkins User mit sudo su jenkins
  • Ein ls ~/.ssh/ zeigt, ob es eventuell schon ein Schlüsselpaar gibt. Dieses sollte man auf keinen Fall überschreiben sondern verwenden. Und denjenigen Fragen, der Schlüssel erstellt hat und verwendet!
  • Wenn noch kein Schlüssel existiert wird mit ssh-keygen ein neues Schlüsselpaar erzeugt
  • Das Passswort bleibt leer! Siehe dazu auch JENKINS-20879.

2.) SSH Key im Jenkins konfigurieren

jenkins ssh key config

Damit Jenkins den Schlüssel verwendet, muss dieser noch über die Weboberfläche aktiviert werden. Dazu wählt man links oben „Jenkins“, aus der Liste links dann „Jenkins verwalten“ und aus der Liste rechts „Zugangsdaten verwalten“. Als globale Zugangsdaten wird dann der gerade erstellte Schlüssel hinzugefügt. Das Angeben des Dateinamens (wie im Bild) und das direkte Einfügen des Schlüssels per copy and paste aus der Datei /var/lib/jenkins/.ssh/id_rsa funktioniert gleichermaßen. Die Option "Aus der ~/.ssh des Jenkins Masters" funktioniert bei mir nicht.

3.) SSH Key in Bitbucket konfigurieren

bitbucket_ssh_key_config

Es empfiehlt sich, für die Jenkins Konfiguration ein eigenes, neues Repository anzulegen. Entweder verwendet man zum Zugriff von Jenkins aus einen eigenen Bitbucket Benutzer oder einfach seinen „normalen“ Account.

In jedem Fall benötigt der Benutzer Lese- und Schreibrechte auf dem Repository – was eh der Fall ist, wenn der Benutzer das Repository selbst angelegt hat.

Als im Bitbucket angemeldeter Benutzer wählt man oben rechts aus dem drop down menu „Mange account“ und dann links aus der Liste aus dem Bereich „Security“ den Punkt „SSH keys“. Auf der rechten Seite kann dann über den „Add key“ Button ein neuer (public) Key hinzugefügt werden. Den Namen kann man frei wählen, den Schlüssel fügt man per copy'n paste ein. less /var/lib/jenkins/.ssh/id_rsa.pub auf dem Jenkins Host zeigt den Schlüssel zum Kopieren an.

4.) Bitbucket Host Key auf dem Jenkins Client akzeptieren

Bei der ersten SSH Verbindung vom Jenkins Client zum Bitbucket Host überprüft SSH, ob der Server auch wirklich der ist, mit dem wir sprechen wollen. Die Informationen über verifizierte SSH Hosts werden in der Datei ~/.ssh/known_hosts abgelegt. Am einfachsten geht das, indem einmal (als jenkins user!) manuell eine SSH Verbindung zu Bitbucket aufgebaut wird.

scp git@bitbucket.org:ooseeg/jabu_jenkins.git .

accept_bitbucket_ssh_hostkey

Dass das Kommando keinen Erfolg hat ist uns egal, wir wollen nur den Host Key von BitBucket.
Der gewissenhafte Entwickler verifiziert die dabei ausgegebenen Informationen mit den aus anderer Quelle beschafften Identitätsinformationen von Bitbucket!

5.) Git für Jenkins konfigurieren

Wenn Jenkins über das SCM Sync Plugin auf das git Repository zugreift werden global konfigurierte Git Properties verwendet, die für den jenkins User so konfiguriert werden:

sudo su jenkins
git config --global user.name YOUR_NAME
git config --global user.name YOUR_EMAIL

6.) Plugin Konfigurieren

Nachdem das Schlüsselpaar erzeugt und in Jenkins der private und in Bitbucket der öffentliche Teil hinterlegt ist, wird das SCM Sync Plugin in Jenkins aktiviert.

Dazu wird in der Jenkins Weboberfläche wieder links oben „Jenkins“ und dann links „Jenkins verwalten“ gewählt. In der Liste rechts ist nun „System konfigurieren“ anzuklicken. Auf der nun angezeigten, unübersichtlichen Seite findet sich relativ weit oben der Abschnitt „SCM Sync configuration“. Hier wird als SCM „Git“ ausgewählt und als Repository URL die URL des Bitbucket Repositories zum Clonen via SSH eingetragen.

jenkins_config_scm_sync_plugin

Die Konfiguration muss noch gespeichert werden und: Fast fertig!
Aufgrund eines Bugs (imho) muss Jenkins jetzt (meist...) einmal neu gestartet werden.

sudo service jenkins restart

7.) Diagnose

  • Über den „Jenkins“ Link links oben und dann links „Jenkins verwalten“ und dann rechts den Eintrag „SystemLog“ und dann „Alle Jenkins Logs“ kann man sich das Logfile von Jenkins ansehen, in dem eventuelle Fehler protokolliert werden.
  • Ein less /var/log/jenkins/jenkins.log auf den Jenkins Host ist hilfreich, um eventuelle Fehler aber auch Erfolgsmeldungen „live“ zu sehen.
  • Über die Weboberfläche von Bitbucket kann man nachvollziehen, dass bei Erfolg die Konfiguration des Jenkins hier abgelegt wurde.
  • Zum "Troubleshooting" des SCM Sync Plugins siehe auch hier.
  • Zum Teil ist es nach dem Anwenden einer fehlerhaften Konfiguration notwendig, das Verzeichnis /var/lib/jenkins/scm-sync-configuration zu löschen.

8.) Fallstricke

Das SCM Sync Plugin verhält sich nicht sinnvoll, wenn ein anderer Schlüssel als der default Schlüssel „id_rsa“ verwendet wird. Dieser default Schlüssel ist der, der ohne weitere Kommandozeilenargumente von ssh und dem git Kommando verwendet wird. Obwohl das SCM Sync Plugin erst dann funktioniert, wenn der Schlüssel auch in Jenkins konfiguriert ist, wird an irgendeiner Stelle vermutlich doch der „default“ verwendet, weshalb zumindest bei meinen Experimenten auch nur dieser funktionierte. Außerdem muss unbedingt ein ssh Schlüssel ohne Passwort verwendet werden

So lässt sich diese Konfiguration „von Hand“ durchführen. Da der Server, auf dem der Jenkins läuft, per Puppet verwaltet wird, ist jetzt der nächste Schritt das Ganze per Puppet zu konfigurieren.