Autopush - Téléverser simplement les fichiers modifiés
Pour simplifier mon flux de travail de web design et de développement web, je me suis écrit un petit script Autopush. Le script surveille un dossier précis et tous ses sous-dossiers, et téléverse via SCP les fichiers modifiés vers un serveur distant. Si vous aimez développer en local mais voulez pousser directement les modifications vers votre serveur sans les téléverser sans cesse à la main, ce script vous plaira sûrement :) Comme toujours : aucune responsabilité pour d'éventuels dommages.
Important :
- Vous devez vous authentifier auprès du serveur par clé SSH, sinon le script Bash doit être légèrement adapté.
- fswatch doit être installé.
Autopush fonctionne ainsi : vous créez un fichier de configuration Autopush au format ini, passé en premier paramètre au script Bash. Le fichier Autopush est structuré ainsi :
remote_host=L'hôte vers lequel vous voulez pousser les fichiers. Peut être un domaine ou une IP. Pensez aux clés SSH.remote_username=Le nom d'utilisateur avec lequel vous vous authentifiez sur le serveur.remote_mapping=Le chemin sur lequel le mappage se fait. Les modifications de local_source sont téléversées relativement à remote_mapping.local_source=Le chemin local à surveiller et à pousser.exclude=source,_ServerFichiers à ne pas pousser, exclus de la surveillance.
Attention : les fichiers .DS_Store sont exclus par programme et n'ont pas besoin d'être indiqués explicitement.
Le dossier de local_source est surveillé par le script ; dès qu'un fichier y est modifié, il est envoyé au serveur via
scp local_file_path remote_username@remote_host:/remote_mapping/absolute_local_path
Le script Bash s'appelle simplement ainsi :
autopush.sh /Pfad/zur/Config.ini
Et voici le script complet :
#!/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