Un po 'complesso da descrivere, ma farò del mio meglio. Fondamentalmente stiamo usando il flusso di lavoro Git, nel senso che abbiamo i seguenti rami:Come gestire più script db alter provenienti da diversi rami di funzionalità Git?
- produzione, che è il ramo dal vivo. Tutto è in esecuzione nella produzione nell'ambiente web live.
- integrazione, in cui tutte le nuove funzionalità sono integrate. Questo ramo viene unito alla produzione ogni settimana.
- uno o più rami di funzionalità in cui sviluppatori o team di sviluppo sviluppano nuove funzionalità. Al termine, gli sviluppatori uniscono il loro ramo di funzionalità all'integrazione.
Quindi, niente di veramente complesso qui. Tuttavia, poiché la nostra applicazione è un'applicazione Web in esecuzione su un database MySQL, le nuove funzionalità spesso richiedono modifiche allo schema del database. Per automatizzare questo, stiamo usando dbdeploy, che ci permette di creare script alternativi, dato un numero. Per esempio. 00001.sql, 00002.sql, ecc. Dopo l'unione con il ramo di integrazione, dbdeploy verificherà quali script alterati hanno un numero maggiore rispetto all'ultimo più recente su quel specifico database e li eseguirà.
Ora assumere quanto segue. - l'integrazione ha alter script fino a 00200.sql. Tutti questi sono eseguiti sul database di integrazione. - lo sviluppatore John ha una caratteristica di funzione X, che è stata creata quando l'integrazione aveva ancora 00199.sql come il più alto alter script.
John crea 00200.sql a causa di alcune modifiche richieste dello schema db.
Ora, a un certo punto John unirà le sue modifiche al ramo di integrazione. John otterrà un conflitto di fusione e vedrà che il suo 00200.sql esiste già in integrazione. Ciò significa che ha bisogno di aprire il file in conflitto, estrarre il suo contenuto, resettare il file su "mio" (lo stato originale come in integrazione) e inserire il suo contenuto in un nuovo file.
Ora, dal momento che stiamo lavorando con dieci sviluppatori, otteniamo questa situazione ogni giorno. E mentre capiamo le ragioni di questo, a volte è molto complicato. John rinomina il suo script, esegue un'unione di commit per l'integrazione, spinge le modifiche all'upstream solo per vedere che qualcun altro ha già creato uno 00201.sql, richiedendo a John di eseguire nuovamente i processi.
Sicuramente ci devono essere più team che utilizzano il flusso di lavoro Git e utilizzano uno strumento di gestione delle modifiche del database per l'automazione delle modifiche allo schema del database?
Così, in breve, le mie domande sono:
- Come automatizzare le modifiche allo schema di database, quando si lavora su diverse funzionalità rami, che operano su diverse istanze dello stesso db?
- Come evitare conflitti di unione per tutto il tempo, pur avendo ancora la possibilità di avere un ordine fisso negli script di modifica eseguiti? Per esempio. 00199.sql deve essere eseguito prima di 00200.sql, perché 00200.sql potrebbe dipendere da qualcosa fatto in 00199.sql.
Eventuali altri suggerimenti sono i benvenuti.
Una discussione utile e complicata, di sicuro. Gli sviluppatori di software là fuori, prendi nota. Tracciare i cambiamenti dello schema come l'OP ha sottolineato dipende in realtà dal tipo di copertura che ci si aspetta di ottenere dallo sforzo in primo luogo. Vuoi una build quotidiana? Versioning? Punti di recupero? Codifica difensiva? Le soluzioni varieranno di conseguenza. –