In diesem Artikel wird aufgezeigt, wie man einen Deploymentprozess mit Git und FTP realisieren kann. Als praktisches Beispiel dient hierzu die Veröffentlichung einer mit Git verwalteten Webseite / Web Applikation auf einen FTP-Server.
Git und FTP
Hat man vollen Root-Zugriff auf den Webserver, könnte man das Repository direkt auf dem Webserver klonen und sämtliche Aktualisierungen mittels git push an diesen übermitteln. Siehe hierzu Einfaches Git Deployment.
Bei Webhosting-Angeboten steht einem meist lediglich ein FTP Zugang zum Austausch zur Verfügung. Selbst wenn man ein vorhandenes Repository auf den Server verschiebt, kommt es spätestens beim Übermitteln der Änderungen zu Fehlern.
Lösung
Die Änderungen übermitteln wir weiterhin an ein zentrales Git Repository. Mit Hilfe der Git Hooks können wir anschließend bestimmte Aktionen nach dem Empfang der neuen Dateien ausführen.
Ein Skript klont den Branch production und übermittelt diesen per rsync an den FTP. Hierfür benötigen wir lediglich ein Zwischensystem mit Linux bzw. ein Linuxsystem auf dem das zentrale Git Repository ohnehin bereits existiert.
Repository einrichten
Zunächst erstellen wir einen neuen Branch (production) im lokalen Working Directory.
git checkout -b production
Jetzt können beispielsweise die Datenbankverbindungen für das Funktionieren mit der Produktivumgebung angepasst werden.
Abschließend übermitteln wir den Branch an den Remote Server.
git push origin production
FTP einbinden
Damit die Datenübertragung per FTP funktioniert, muss dieser lokal in das Dateisystem des Git Remote Servers eingebunden werden.
Unter Ubuntu muss hierzu das Paket curlftpfs installiert sein.
sudo apt-get install curlftpfs
Als nächstes erstellen wir einen Mountpunkt für den FTP-Server.
sudo mkdir /mnt/ftp
Die folgende Zeile wird in die /etc/fstab eingefügt. Die Option uid=1000 bewirkt, dass alle eingefügten Dateien dem Benutzer mit der UID 1000 gehören. Welche ID der eigene Benutzer hat kann über den Befehl id -u herausgefunden werden.
curlftpfs#benutzername:passwort@ftp.example.com /mnt/ftp fuse auto,user,uid=1000,allow_other 0 0
Jetzt kann der FTP gemountet werden. Da die Optionen in der fstab hinterlegt sind, ist der Server bei jedem Neustart verfügbar.
sudo mount -all
Weitere Informationen finden sich im Artikel FTP Server mit Curlftpfs mounten.
Git Hook einrichten
Auf dem Remote Server können wir nun den Hook für das Deployment einrichten. Hierzu verwenden wir den Hook post-receive, welcher nach dem Empfang von per git push übermittelten Daten getriggert wird.
Die Hooks befinden sich auf dem Remote (Origin) Server entweder direkt im Repository unter hooks/ oder unter .git/hooks/.
Legen wir also einen neuen Hook an.
sudo nano post-receive
Der Code des Skriptes sieht wie folgt aus.
#!/bin/bash while read oldrev newrev refname do branch=$(git rev-parse --symbolic --abbrev-ref $refname) if [ "$branch" == "production" ]; then # Production echo "Pushing to production" mkdir /tmp/production GIT_WORK_TREE=/tmp/production git checkout production -f mkdir /tmp/rsync rsync -ruvz --temp-dir=/tmp/rsync /tmp/production/ /mnt/ftp/production/ rm -rf /tmp/production rm -rf /tmp/rsync; fi done
Beim rsync Kommando müssen wir den Parameter /mnt/ftp/production natürlich an unsere Verzeichnisstruktur auf dem FTP anpassen. Auf foxplex wäre dies beispielsweise /mnt/ftp/foxplex.
Workflows
Nun noch einige Workflows, welche nun möglich sind.
Änderungen und Weiterentwicklungen geschehen weiterhin im Master bzw. separaten Branches. Sobald diese reif für die Produktionsumgebung sind, werden die Änderungen in den Master gemerged und anschließend in den production Branch.
git checkout -b bugfix123
git checkout master
git merge bugfix123
Nun werden die Änderungen in die Produktionsumgebung eingebaut:
git checkout production
git merge master
Abschließend kann die neue Version auf der Produktionsumgebung deployt werden.
git push origin production
Jetzt wird das Git Hook Skript ausgelöst und führt das eigentliche Deployment der Dateien auf dem FTP durch.
Fazit
Um ein einfaches Deployment per FTP möglich zu machen sind einige Schritte notwendig.
Daher wird vor allem im Bereich des Cloud Webhostings bereits Git als einzige Schnittstelle für den Datentransfer angeboten.
Quellen: Git Logo
Leave a comment