Ho avuto difficoltà a trovare buoni esempi di come gestire schemi e dati di database tra server di sviluppo, test e produzione.
Ecco la nostra configurazione. Ogni sviluppatore ha una macchina virtuale che esegue la nostra app e il database MySQL. È la loro sandbox personale a fare quello che vogliono. Attualmente, gli sviluppatori apporteranno una modifica allo schema SQL e eseguiranno il dump del database in un file di testo che eseguono il commit in SVN.
Desideriamo distribuire un server di sviluppo a integrazione continua che eseguirà sempre l'ultimo codice di commit. Se lo facciamo ora, ricaricherà il database da SVN per ogni build.
Abbiamo un server di prova (virtuale) che esegue "rilascia candidati". La distribuzione sul server di prova è attualmente un processo molto manuale e di solito mi coinvolge caricando l'ultimo SQL da SVN e modificandolo. Inoltre, i dati sul server di prova sono incoerenti. Si finisce con tutti i dati di test che l'ultimo sviluppatore ha commesso sul suo server sandbox.
Dove tutto si rompe è la distribuzione in produzione. Poiché non è possibile sovrascrivere i dati in tempo reale con i dati di test, ciò comporta la ricostruzione manuale di tutte le modifiche allo schema. Se ci sono state molte modifiche allo schema o script di conversione per manipolare i dati, questo può diventare davvero peloso.
Se il problema fosse solo lo schema, sarebbe un problema più semplice, ma ci sono dati "di base" nel database che vengono aggiornati anche durante lo sviluppo, come i metadati nelle tabelle di sicurezza e autorizzazioni.
Questa è la più grande barriera che vedo nel passaggio verso l'integrazione continua e le build in un solo passaggio. Come lo risolvi?
Una domanda di follow-up: come tenere traccia delle versioni del database in modo da sapere quali script eseguire per aggiornare una determinata istanza del database? Una tabella delle versioni come Lance menziona sotto la procedura standard?
Grazie per il riferimento a Tarantino. Non sono in un ambiente .NET, ma ho trovato molto utile la loro pagina wiki DataBaseChangeMangement . Soprattutto questa presentazione Powerpoint (.ppt)
Scriverò uno script Python che controlla i nomi degli *.sql
script in una determinata directory rispetto a una tabella nel database ed esegue quelli che non sono presenti in ordine in base a un numero intero che costituisce la prima parte del nome file. Se è una soluzione abbastanza semplice, come sospetto che sarà, la posterò qui.
Ho una sceneggiatura funzionante per questo. Gestisce l'inizializzazione del DB se non esiste e l'esecuzione degli script di aggiornamento, se necessario. Esistono anche opzioni per cancellare un database esistente e importare dati di test da un file. Sono circa 200 righe, quindi non lo posterò (anche se potrei metterlo su pastebin se c'è interesse).