itaeng

Pre-push GIT Hook - Aggiornare un sito remoto ed il database tramite SSH con un git push

In questi giorni mi è capitato di dover lavorare su un nuovo progetto e di dover caricare le modifiche online man mano che il procedimento andava avanti... siccome farlo manualmente è un'operazione noiosa e ad alto rischio di errori (collegati all'ftp, carica le modifiche, elimina i files non più utilizzati...) ho pensato di sfruttare la potenza e la velocità di rsync agli hooks di GIT per effettuare questa operazione in automatico, ogni volta che faccio un push.

Puoi vedere il gist a questo indirizzo: Gist

Il funzionamento è molto semplice, eccolo riassunto:

#!/bin/sh
 
##############
## CONFIGURATION
############## 
 
# remote access
sshUser=""
sshPass=""
 
remoteServer="192.168.1.1"
remotePath="/var/www/production"
 
# local database
localDbName="myapp"
 
# remote database
remoteDdbUser="root"
remoteDbPass=""
remoteDbName="myapp"
 
 
##############
## WORKFLOW
############## 
 
# create a database backup and add it to the last commit (amend)
mysqldump -uroot --skip-extended-insert $localDbName > database.sql
git add database.sql
git commit --amend --no-edit
 
# since you can't force the password for SSH, echo it here as a hint (don't do this for critical projects! :))
echo When prompted, please insert this password: $sshPass
 
# update all the files through rsync
echo
echo Updating files...
rsync -rzhe ssh --delete --filter=':- .gitignore' ./ $sshUser@$remoteServer:$remotePath
 
# update the database
echo
echo Updating database...
cat database.sql | ssh $sshUser@$remoteServer "mysql -u$remoteDdbUser -p$remoteDbPass $remoteDbName"
 
# and you're done!
exit 0

Facile, no?