⬅ Zurück zur Übersicht

Autopush – Einfach geänderte Dateien hochladen

david am Samstag, 01.06.2019 - 11:36:56
⬅ Zurück zur Übersicht

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
39
40
41
42
43
44
#!/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