Immagina di avere il seguente scenario. La tua organizzazione distribuisce alcune app core alla sua missione. Ad esempio, se si è Stack Exchange, questo potrebbe essere il server Web del cliente. Diciamo anche che ti iscrivi a qualcosa come la filosofia dell'app 12-Factor . Ogni app mantiene il proprio repository SCM, che funge da fonte canonica di verità. Potresti anche avere librerie org-wide che sono consumate da zero, una o più app e mantenere i propri repository SCM. Infine, l'app stessa può essere distribuita su molti siti diversi, ognuno con configurazioni potenzialmente diverse o un'infrastruttura sottostante.
Ok, ora la ruggine viene fornita con il modo in cui gestisci gli strumenti progettati per monitorare, analizzare o rilevare le anomalie con le esecuzioni di produzione delle app effettive. Lo scopo potrebbe essere per i motivi sysadmin (controllo dei messaggi di errore critici nei registri delle app), dati scientifici (analisi post-hoc del comportamento degli utenti), profilazione delle prestazioni, o qualche altra ragione.
Quali sono le migliori pratiche per l'organizzazione di questi strumenti nella struttura multi-repository della tua organizzazione. La domanda chiave è mettere questi strumenti con il repository principale dell'applicazione? (Ad esempio, aggiungi una nuova directory di primo livello chiamata tools/
al repository frontend-web-server
). Separate tutti gli strumenti per una data app in un singolo repository separato? (Ad es. Nuovo repository chiamato frontend-web-server-tools
) O creare un repository separato per ogni strumento specifico? (Ad esempio frontend-web-server-user-analysis
, frontend-web-server-runtime-monitor
, frontend-web-server-profiler
)
Vedo alcuni argomenti validi su tutti i lati:
- Gli strumenti potrebbero avere dipendenze abbastanza forti sul codice dell'app sottostante. Per esempio. se cambiamo il formato del registro dell'app, probabilmente anche quello che consuma quei log deve essere cambiato. Mantenerlo un unico repository riduce la possibilità di rompere gli strumenti sulle modifiche della base di codice.
- Probabilmente lo stesso tooling si conforma a standard di ingegneria del software molto più sciolti, e molti strumenti possono essere creati su base una tantum o ad hoc e poi gettati via. Potremmo non voler inquinare il repository principale con questo.
- Alcuni strumenti possono estendersi su più app. Ad esempio, per alcuni script di analisi della scienza dei dati potremmo voler unire attività nell'app front-end con i dati di un microservizio di supporto.
- È probabile che lo stesso tooling tragga vantaggio da una base di codice condivisa. Se abbiamo uno strumento per fare X e uno strumento per Y, entrambi potrebbero aver bisogno di una logica per fare Z. Ovviamente DRY, quindi spesso vorremmo che strumenti simili fossero almeno nello stesso repo l'uno con l'altro.
- Gli strumenti possono anche utilizzare il codice direttamente dalla base di codice dell'app. Forse abbiamo uno strumento che riproduce l'attività per alcuni ambienti di test. Potrebbe essere molto più semplice fare affidamento su un singolo modulo all'interno dell'app per evitare DRY. La compilazione dello strumento insieme al codebase dell'app è molto più semplice se condividono un repository. Sembra poco pratico forgiare un repository di libreria completamente separato solo per un repository.
- Alcuni strumenti potrebbero essere specifici per la distribuzione. Non vorrai inquinare la base di codice dell'app con i dettagli di distribuzione.
Forse un singolo approccio non cattura tutte le idiosincrasie di diversi scenari plausibili. Ma in che modo le grandi organizzazioni in genere gestiscono situazioni come questa? O almeno come si avvicinano a prendere queste decisioni?