Contao und Jenkins


Gepostet von Andreas Nölke am

Jenkins ermöglicht es Backups zu erstellen. Enstprechend Konfiguriert, kann Jenkins dafür verwendet werden um den lokalen Server mit dem online Server abzugleichen. In diesem Artikel erkläre ich euch wie ihr Jenkins in Ubuntu installiert. Anhand von einem Beispiel wird ein Contao auf einem Online Server mit einem Lokalen Server abgeglichen.

Diese Vorgehensweise kann natürlich auf jedes CMS entsprechend angewendet werden.

Weiteres über Jenkins unter jenkins-ci.org

Vorraussetzungen

Was genau setze ich für die folgende Erklärung vorraus?

  1. Ein ssh Zugriff auf deinen online Server
  2. Ein installiertes Ubuntu (Virtuell oder als dedicated Server)
  3. Eine funtionierende Contao installation auf dem online Server
  4. Einen lokalen Server wie XAMPP oder MAMP
  5. Grundkentnisse im Bedienen von einer Konsole

Dann legen wir mal los.

Installation von Jenkins

Wir fügen Jenkins der Package Verwaltung hinzu dann kannst du nachher leichter updaten.

Diese Befehle musst du als root ausführen. Mit "su" kannst du dich dauerhaft zum root machen. Solltest du noch kein Passwort vergeben haben, dann gebe "su passwd" ein. Dann wirst du aufgefordert ein Passwort für den root Benutzer zu vergeben.

wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
Jenkins Dashboard
Jenkins Dashboard

Das war's. Jenkins ist nun Installiert. Du kannst Jenkins im Browser mit "rechnername:8080" aufrufen. Anstelle vom Rechner Name, kannst du auch die IP Adresse eingeben.

Ich hoffe es hat alles geklappt. Nun weiter mit dem nächsten Schritt.

Einrichten der SSH Verbindung

Um sicherzustellen, dass du in dem ganzen Verlauf von Jenkins keine Passwörter einegeben musst und der alles schön brav automatisch erledigt, musst du noch einen SSH Key auf dem Server ablegen über welchen du dich dann authorizieren am online Sever authentifizieren kannst. Hört sich kompliziert an? Ist es aber nicht.

Sorge dafür, dass du in der Konsole auf dem Ubuntu Server mit dem Benutzer angemeldet bist, der Jenkins ausführt.

Als erstes erstellst du einen Schlüssel.

ssh-keygen -t dsa
Generating public/private dsa key pair. 
Enter file in which to save the key (/home/sshuser/.ssh/id_dsa):

Hier mit Enter bestätigen.

Enter passphrase (empty for no passphrase):

Aus Sicherheitsgründen müsstest du hier ein Passwort vergeben. Allerdings: Wenn unser automatisches Vorhaben gelingen soll, einfach mit Enter bestätigen.

Mit dem nächsten Befehl verbindest du dich mit deinem Online Server und legst dort in dem Verzeichnis ".ssh" den Schlüssel "authorized_keys" ab. Du musst noch sshuser mit deinem SSH Benutzer ersetzen und [server-IP] mit dem Hostnamen oder der IP des Servers ersetzen.

cat id_dsa.pub | ssh sshuser@[server-IP] 'cat >>.ssh/authorized_keys'

Nun ist es an der Zeit den Verbindungsaufbau zu testen.

ssh sshuser@[server-IP]
Last login....
(xx:xx:xx) [~]

Ich hoffe, dass soweit alles klar ist.

Nun werden wir Jenkins so einrichten, dass es per knopfdruck die Aktuellen Daten von pnline Server holt und Lokal einspielt.

Jenkins Konfiguration

Jenkins Side Bar

Im Bild seht ihr die Sidbar von Jenkins. Dort klickst du auf Neuen Job anlegen.

Jenkins Neuer Job
Jenkins Neuer Job

Dort wählst du "Free Style"-Softwareprojekt bauen und gibst einen beliebigen Namen ein. Bestätigen mit Klick auf OK.

Jenkins Build-Schritt hinzufügen
Jenkins Build-Schritt hinzufügen

Nun siehst du sehr viele Einstellmöglichkeiten. Die meisten benötigen wir nicht.

Scrolle nach unten zu Buildverfahren und füge einen neuen Build-Schritt "Schell ausführen" hinzu. Du kannst hier ein lokal liegendes script aufrufen, oder den Befehl direkt eingeben. Ich habe die direkte eingabe Methode gewählt.

Der SQL Import und Export

So, nun unsere weitere Vorgehensweise im Überblick:

  1. Auf dem Jenkins Server Verzeichnis für die Projekte anlegen
  2. Die MySQL Datenbank auf vom Online Server auf dem Jenkins Server speichern
  3. Das MySQL Backup in den Lokalen Server einspielen.
  4. Den Ordner "tl_files" oder "files" synchronisieren

Ich habe zum Beispiel folgende Dateistruktur gewählt:

/home/jenkins-benutzer/Webseiten/projekt-n/
In dem Projekte Ordner habe ich noch einen "db" und "files" Ordner erstellt.

Gebe in das "Shell ausführen Feld" folgenden Befehl ein:

ssh <sshbenutzer>@<hostname> "mysqldump --default-character-set="UTF8" --add-drop-table -h <sqlserver> -u <sqluser> -p'<sqlpasswordOnline>' <sqldb>" >> <projektepfad>/db/<sqldb>_$BUILD_ID.sql

Nun die Erklärung:

Der Befehl exportiert die Online Datenbank mit dem Befehl "mysqldump" und speichert den export auf dem Jenkins Server ab.

  • <sshbenutzer> der SSH Zugangs Benutzer deines Online Servers
  • <hostname> der Hostname deinses Server (domain.de oder IP)
  • <sqlserver> Der SQL Server. In der Regel "localhost". Kann aber je nach Hostingpaket variieren.
  • <sqluser> der SQL Benutzer auf dem Online Server
  • <sqlpasswordOnline> das SQL Passwort des Online Servers
  • <sqldb> Name der SQL Datenbank
  • <projektepfad> Pfad wohin die Datei auf dem Jenkins Server gespeichert werden soll

Für den Nächsten Befehl habe ich einen weiteren Buildschritt hinzugefügt. Dann behält man leichter den Überblick.

mysql --default-character-set=UTF8 --host=<localerserver> --user=<dbuser> <dbname> < <projektepfad>/db/<sqldb>_$BUILD_ID.sql

Der Befehl importiert die zuvor gespeicherte SQL Datei auf deinen lokalen Server.

  • <localerserver> IP oder Hostname deines lokalen Servers
  • <dbuser> der SQL Benutzerdeines lokalen Servers
  • <dbname> Der Datenbankname, in welchen die SQL Datenbank importiert werden soll (muss nich gleich sein wie der online Name)
  • <sqldb> Name der SQL Datenbank

Ich habe auf meinem Lokalen Server (ein XAMPP-Server) kein Passwort für den Root vergeben. Wichtig ist, dass du einen Benutzer auf deinem Lokalen SQL Server anlegst. Diesem musst du die gleichen Rechte geben, wie dem root Benutzer. Sonst kannst du die Datenbank eventuell nicht einspielen.

Die Dateien Synchronisieren

Hier verwenden wir einen genialen Befehl welcher die Synchronisation automatisch durchführt und die Dateien anhand eines Hashes vergleicht. Somit dauert die erste Synchronisation länger und die folgenden, gleichen nur die online geänderten Dateien ab.

Wir verwenden den Befehl "rsync".

rsync --delete -avcze ssh <sshbenutzer>@<hostname>:<onlinepfad>/tl_files <projektepfad>/files/

Einfach die üblichen Platzhalter ersetzen. Den <onlinepfad> musst du mit dem Server Pfad zu deiner Contao Installation ersetzen.

Da ich den Ordner "Webseiten" in meinem Netzwerk freigegeben habe, muss ich auch die Zugriffsrechte entsprechend setzen. Danach Verpacke ich den ganzen Files Ordner in einem TAR Archiv.

chmod 777 -R <projektepfad>
cd <projektepfad>/files
tar -cf tl_files_$BUILD_ID.tar tl_files

Leider habe ich es nicht hinbekommen, dass Jenkins die Datein mit meinem Lokalen Server abgleicht. Windows mag wohl "rsync" nicht. Nichts desto trotz habe ich mir eine kleine Batch Datei geschrieben und diese in mein Windows Verzeichnis abgelegt. Diese kopiert dann die Dateien einfach in mein lokales Projekt.

Hier der Code Snippet:

@xcopy <serverFreigabe>\tl_files\* "<lokalerProjektePfad>\tl_files\" /Y /V /E

Dieses Skript in eine Textdatei kopieren und mit "name.bat" speichern.

Nun das ganze ausführen

Mit einem Klick auf "Build Planen" startest du dein Script. Wenn alles gut geht, dann Zeigt das Jenkins mit einer blauen Kugel an, wenn nicht mit einer Roten. Sollte etwas schief gehen, einfach die Konsolen Ausgabe des Builds ansehen und den Fehler entsprechend in der Konfiguration beheben.

Ich hoffe du konntest jeden Schritt nachvollziehen. In einem weiteren Beitrag werde ich dann erklären, wie man ein Versionierungstool wie GIT anbindet.

Viel Spaß damit.