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:
1. Ihr müsst euch via SSH – Key am Server authentifizieren, andernfalls muss das Bash – Skript noch minimal angepasst werden.
2. 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:
1 | remote_host= |
Der Host, an den ihr die Dateien pushen wollt. Kann eine Domain aber auch eine IP sein. Denkt an die SSH – Keys.
1 | remote_username= |
Der Nutzername, mit welchem ihr euch am Server authentifiziert
1 | remote_mapping= |
Der Pfad, auf den gemappt wird. Änderungen im local_source werden relativ zum remote_mapping hochgeladen.
1 | local_source= |
Der lokale Pfad, welcher überwacht und gepusht werden soll.
1 | exclude=source,_Server |
Dateien, 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
1 | 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:
1 | autopush.sh /Pfad/zur/Config.ini |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #!/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 |
Kommentar schreiben
Kommentare