La mia organizzazione ha modularizzato il proprio monolite in moduli di esperti in dipendenze fino a quattro in profondità. Inizialmente abbiamo usato il plugin Maven per aumentare automaticamente i numeri di versione nel pom ogni volta che qualcuno ha effettuato un check-in. Quindi le dipendenze dei genitori potrebbero inserire gli aggiornamenti aggiornando i numeri di versione nel loro pom.xml
.
Questo ha portato a un problema di "errore lento". Immagina il seguente scenario di dipendenza - dove ogni lettera è un modulo, e ogni numero è una versione:
OraimmaginadifareunaseriedimodificheaD,BeA,dimenticandoC.
Cèrimastoindietro(estaancorapuntandoaunavecchiaversionediD).
Ora,quandolapersonachedeveapportareunamodificaaClofa,trovachetuttelemodificheaDhannorottoCindiversimodi.IlfixingCorarichiedegiorni.
Quindiilteamhaelaboratounpianodiverso.Fallireveloce
OratuttociòcheeraunnumerodiversionesopraoraèLATEST
.(Nota
Ciò significa che qualsiasi modifica di rottura a D, verrà visualizzata in B o C alla successiva creazione. (La frase chiave qui è la prossima volta che viene costruita).
Ora supponiamo che il modulo A sia l'applicazione web genitore utilizzata dagli sviluppatori. Ora uno sviluppatore controlla una modifica a B - per la quale B compila (e A lavora sulla loro macchina). A tuttavia ha avuto diversi check-in e la versione di B: LATEST ora si interrompe con A: LATEST.
Abbiamo una strategia fail-fast - ma non c'è nulla nel controllo di versione per mostrare cosa ha rotto l'app. (E potenzialmente 40 moduli da esaminare per vedere quale sia la causa principale.)
La sfida è che ora puoi avere 50 sviluppatori la cui build è danneggiata, che non ha apportato modifiche alla loro macchina - né vedere nulla nel controllo della versione. Tutto perché la loro macchina è arrivata più tardi da artefatto.
Abbiamo ricevuto diversi suggerimenti per migliorarlo:
- Nello strumento CI: collega le modifiche nel modulo per attivare le ricostruzioni dell'app Web principale
- Nello strumento CI: crea moduli per inviare email agli sviluppatori in modo che sappiano cosa sta succedendo
- Nello strumento CI: fai in modo che il modulo di compilazione scriva un "messaggio di build" in un file di registro nel repository git dell'applicazione web principale.
L'ultima raccomandazione è stata quella di modificare l'app Web principale con i numeri di versione e lasciare i moduli grandchild a LATEST
.
Da notare che per le versioni - incrementiamo le versioni del modulo alle versioni fisse.
La mia domanda è: Qual è una buona strategia di versioning per raggiungere "fallire velocemente" con catene di sottomodelli dipendenti di maven?