Dubbelriktad synkronisering av kataloger

Jag har både en arbetsstation och en bärbar dator som jag utvecklar på. Jag ville ha ett enkelt sätt att synkronisera kod och databas mellan dessa två. Kravet var att det skulle vara dubbelriktat (synkronisera från arbetsstationen till bärbara innan t.ex. en resa och tvärtom när man kommer tillbaka) och "on demand".

Efter lite googlande hittade jag en artikel på macgeekery som gick igenom hur man gjorde detta med hjälp av Unison. Unison finns för både Windows och de flesta unix dialekter (Linux, Solaris, OS X). Tyvärr så utvecklas det inte längre, men finns fortfarande att ladda ner.

Efter att ha installerat Unison på både arbetsstationen och bärbara datorn satte jag igång med att skriva ett enkelt shell script som dels synkroniserar kodbasen och MySQL databasfiler (raw copy). Scriptet är skrivet för att hantera en XAMPP miljö i Mac OS X.

För att inte behöva ange sudo lösenord för att starta och stoppa MySQL servrarna, la jag till följande i local (bärbar) och remote (arbetsstation) sudoers fil:

user ALL = NOPASSWD: /Applications/XAMPP/xamppfiles/xampp

Redigera sudoers filen med "visudo" som root.

Databasen fanns redan på remote (tabeller och data) och jag skapade en tom databas på local. För att kunna köra scriptet som min vanliga användare blev jag tvungen att ändra grupprättigheterna för databas-filerna i /Applications/XAMPP/xamppfiles/var/mysql/:

sudo chgrp -R staff /Applications/XAMPP/xamppfiles/var/mysql/database
sudo chmod 770 /Applications/XAMPP/xamppfiles/var/mysql/database

Detta gäller för både local och remote.

Unison ansluter via SSH, så remote måste ha en SSH tjänst igång. För att slippa behöva ange lösenord rekommenderar satte jag upp public key authentication på remote (med en publiknyckel från local).

För att göra det lite enklare skapade jag två Unison profiler på local (en för koden, en för databasen). Profilerna ska ligga i ~/Library/Application Support/Unison.

local:Unison user$ cat code.prf

# Unison preferences file
root = /Users/user/Development
root = ssh://user@remote//Users/user/Development

local:Unison user$ cat database.prf

# Unison preferences file
root = /Applications/XAMPP/xamppfiles/var/mysql/database
root = ssh://user@remote//Applications/XAMPP/xamppfiles/var/mysql/database

När detta var fixat, skrev jag följande script som jag kör först när jag vill/behöver utveckla på den bärbara och sedan igen när jag är klar och ska fortsätta från min arbetstation. Det finns lite utrymme för felhantering.

#!/bin/bash
REMOTE=remote
unison -ui text -batch -contactquietly code 2> /dev/null

# Stop MySQL
echo "Stopping remote MySQL server..."
ssh $REMOTE "sudo /Applications/XAMPP/xamppfiles/xampp stopmysql"
echo "Stopping local MySQL server..."
sudo /Applications/XAMPP/xamppfiles/xampp stopmysql

unison -ui text -batch -contactquietly database 2> /dev/null

# Start MySQL
echo "Starting remote MySQL server..."
ssh $REMOTE "sudo /Applications/XAMPP/xamppfiles/xampp startmysql"
echo "Starting local MySQL server..."
sudo /Applications/XAMPP/xamppfiles/xampp startmysql

Meta

2 svar på “Dubbelriktad synkronisering av kataloger”

  1. 2010-03-27, 14:27 skrev Magnus:

    Varför inte använda git?
    http://git-scm.com/

  2. 2010-05-17, 18:43 skrev Mikael:

    För databasen kändes det smidigare att göra så här, jag vet inte något bra sätt att versionshantera en databas struktur och innehåll :-)

    Kodbasen är numera versionshanterad i subversion.

Skriv en kommentar