Autopush - Einfach geänderte Dateien hochladen
Ich habe mir zur Vereinfachung des Webdesign/Webdevelopment-Workflows ein kleines Autopush-Skript geschrieben. Das Skript überwacht einen bestimmten Ordner und alle seine Unterordner auf Änderungen und lädt die geänderten Dateien via SCP auf einen Remote-Server. Wer also gerne lokal entwickelt, die Änderungen aber direkt auf seinen Server pushen will und nicht ständig manuell hochladen möchte, findet an dem Skript bestimmt gefallen :) Wie immer gilt: Keine Haftung für Schäden.
Wichtig:
- Ihr müsst euch via SSH-Key am Server authentifizieren, andernfalls muss das Bash-Skript noch minimal angepasst werden.
- Ihr müsst fswatch installiert haben.
Autopush läuft folgendermaßen ab: Ihr erstellt eine Autopush-config Datei im ini-Format, welche als erster Parameter an das Bash-Skript übergeben wird. Die Autopush-Datei ist folgendermaßen aufgebaut:
remote_host=Der Host, an den ihr die Dateien pushen wollt. Kann eine Domain aber auch eine IP sein. Denkt an die SSH-Keys.remote_username=Der Nutzername, mit welchem ihr euch am Server authentifiziertremote_mapping=Der Pfad, auf den gemappt wird. Änderungen im local_source werden relativ zum remote_mapping hochgeladen.local_source=Der lokale Pfad, welcher überwacht und gepusht werden soll.exclude=source,_ServerDateien, die nicht gepusht werden sollen und von der Überwachung ausgenommen sind.
Achtung: Programmatisch werden .DS_Store Dateien ausgeschlossen und müssen nicht explizit angegeben werden.
Der Ordner in local_source wird vom Skript überwacht, sobald sich hier eine Datei verändert wird sie via
scp local_file_path remote_username@remote_host:/remote_mapping/absolute_local_path
auf den Server geladen. Aufrufen lässt sich das Bash-Skript einfach via:
autopush.sh /Pfad/zur/Config.ini
Und hier das komplette Skript:
#!/bin/sh
if [ $# -eq 1 ]; then
CONFIGFILE=$1
. $1
echo "Autopushing '$local_source' now..."
/usr/local/bin/fswatch -0 "$local_source" | xargs -0 -n 1 sh $0 0 $CONFIGFILE
elif [ $# -eq 2 ] && [ $2="--fullsync" ]; then
CONFIGFILE=$1
. $1
echo "Fullsyncing '$local_source' now..."
scp -r $local_source/* $remote_username@$remote_host:$remote_mapping
else
CONFIGFILE=$2
FILE=$3
. $CONFIGFILE
length_local_source=${#local_source}
length_changed_file_absolute=${#FILE}
length_changed_file_relative=$((0-length_local_source-length_changed_file_absolute))
relative_path=${FILE:$length_local_source}
donotpush=(${exclude//,/ })
donotpush+=($CONFIGFILE)
donotpush+=(".DS_Store")
for i in "${donotpush[@]}"
do
if [[ $FILE == *$i* ]]; then
echo "[STOP] DO NOT PUSH $FILE (MATCHES '$i')"
exit
fi
done
remote_target="$remote_mapping$relative_path"
if [ -d "$FILE" ] || [ -f "$FILE" ]; then
echo "[CHANGE] `date '+%Y-%m-%d %H:%M:%S'` $relative_path -> $remote_target";
scp -r $FILE $remote_username@$remote_host:$remote_target
else
echo "[DELETE] rm -rf $remote_target";
ssh $remote_username@$remote_host "rm -rf $remote_target"
fi
fi