Forgot your password?

Forgot your username?

All about IT, Web and Development.
By users for users.

Deployment mit Git und FTP



Ursprünglich für die Codeverwaltung des Linux-Kernels geschaffen, hat Git mittlerweile einen festen Platz in der Welt der Versionsverwaltung eingenommen.



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

Michael Kostka

Fachinformatiker / Systemintegration
Ich schreibe hier regelmäßig zu den Themen Android, Web, Linux und Hardware.

Raspberry Pi Starter Kit
DataCloud

Leave a comment

I have read the privacy policy and agree to electronically store and process my input data to answer the request.