2013-01-21 8 views
13

Mi piacerebbe aggiornare un sito web dal vivo in modo atomico. Se abbiamo apportato diverse modifiche a pagine, immagini e javascript, tutte le modifiche dovrebbero apparire contemporaneamente senza tempi di inattività, incoerenza o 404 s.Aggiornamento sito web atomico con Git

Se copio semplicemente i file modificati nella directory del sito Web, quindi almeno alcune richieste vedranno un sito incoerente. Se copio il nuovo sito in una directory separata, quindi rinomina la vecchia directory per metterla fuori produzione e rinomina la nuova directory per renderla attiva, quindi per un breve momento otterremo 404.

Ho due domande:

Come posso aggiornare una directory di file in maniera atomica?

Come posso coordinarlo con Git? Ci piacerebbe essere implementati usando un git pull (o possibilmente push). Il percorso del sito all'interno del repository git è diverso dal percorso sul server, quindi è necessario un po 'di spostamento/ridenominazione, utilizzando comandi git o comandi del sistema operativo.

risposta

21

È possibile eseguire ciò che si sta immaginando utilizzando i collegamenti simbolici. Spostare un collegamento simbolico su un altro è un'operazione atomica, quindi dovresti essere in grado di evitare errori 404.

Il tuo gancio sarebbe deploy your site to a directory, forse il nome dello commit hash. Quindi creerebbe un link simbolico, forse chiamato staging. Quindi sposterebbe quel collegamento simbolico sul collegamento simbolico di produzione.

hash=`git rev-parse HEAD` 
git checkout-index -a -f --prefix=/srv/www/$hash/ 
ln -s /srv/www/$hash /srv/www/staging 
mv -T /srv/www/staging /srv/www/production 
+0

Capistrano è uno strumento che utilizza i collegamenti simbolici per distribuire il codice atomicamente. – user1158559

+1

Questa è una grande risposta. C'è una piccola possibilità, però, di risultati incoerenti perché un browser potrebbe richiedere una pagina, il sito potrebbe cambiare, e quindi la pagina potrebbe richiedere un'immagine o un file css che non era più lì. Ma non c'è nulla che tu possa fare al riguardo sul lato server. – ccleve

+0

@ccleve Se si voleva essere veramente fantasiosi, si potrebbe tentare di bloccare ogni sessione keepalive in una singola release o giocare con i cookie. – Zenexer

0

Non ne sono completamente sicuro, ma potresti creare post push hook per git, che crea nuova dir, o copia esistente, estrae o clona il tuo progetto e cambia il link dal tuo progetto alla nuova dir. La dir del tuo progetto è solo un collegamento a una delle dir installate.

Ma il mio metodo suona come soluzione.