È uno scenario comune che la base di codice di un prodotto detenuto da un repository in alcuni sistemi VCS evolva fino a un punto in cui tale base di codice può essere considerata come contenente diversi prodotti. La suddivisione della base di codice tra più repository VCS, ciascuno dedicato a un singolo prodotto, può sfruttare diversi vantaggi (vedere Vantaggi di avere un prodotto per repository VCS sul modello di repository bloat di seguito). Dal punto di vista tecnico, dividere la base di codice è un passaggio piuttosto semplice poiché la maggior parte dei VCS supporta questa operazione. La divisione potrebbe tuttavia sollevare problemi di ingegneria relativi a test automatizzati, consegna continua, integrazione del servizio o monitoraggio (vedere Problemi sollevati dalla divisione.) Le organizzazioni che intendono eseguire tale scissione devono quindi sapere come eseguire questa transizione nel modo più fluido possibile, cioè senza interrompere la consegna e il monitoraggio della pipeline. Il primo passo di questo è probabilmente quello di comprendere meglio la nozione di progetto e come delineare la divisione in una base di codice monolitica.
Nelle risposte a queste domande, vorrei vedere:
Un tentativo di fornire una definizione operativa di cosa sia un prodotto, che fornisce criteri pratici per delineare effettivamente i prodotti in una base di codice esistente.
Secondo questa definizione operativa, elaborare un piano che esegua effettivamente la divisione. Possiamo ipotizzare semplificando che la base di codice sia elaborata da un SDLC completamente automatizzato che implementa l' integrazione continua e la consegna continua . Cioè, ogni ramo è convalidato da una suite di test automatizzata implementata nella base di codice corrente e ogni unione in un ramo "magico" genera artefatti di prodotto che vengono testati e distribuiti. (I manufatti del prodotto sono ad esempio tarball di origine, documentazione, pacchetti software binari, immagini Docker , AMI, unikernels.)
Un tale piano è soddisfacente se spiega come aggirare il
Problemi sollevati dalla divisione
In che modo le procedure di test automatizzate si riferiscono al repository monolitico preesistente e ai repository divisi?
In che modo le procedure di distribuzione automatizzata si riferiscono al repository monolitico preesistente e ai repository divisi?
Dove viene archiviato il codice per le stesse procedure di distribuzione automatizzata?
Dove sono le infrastrutture archiviate , il monitoraggio e le strategie di alta disponibilità ?
Come garantire che uno sviluppatore abbia bisogno solo di una base di codice alla volta (ma possibile utilizza artefatti di altre basi di codice).
Come può uno strumento come git-bisect
Nota marginale: vantaggi di disporre di un prodotto per repository VCS rispetto al modello di repository bloat
Avere diversi piccoli repository che contengono la base di codice per un prodotto specifico presenta i seguenti vantaggi rispetto all'approccio del "bloat repository":
Con un repository bloat è difficile ripristinare una versione quando un prodotto è instabile, poiché la cronologia viene mescolata con quella di altri prodotti.
Con un repository gonfio, è difficile rivedere la cronologia del progetto o pull, con piccoli repository, è più probabile che leggiamo queste informazioni. (Questo potrebbe essere specifico per VCS come git, dove a differenza di svn, non possiamo controllare i sottotitoli!)
Con un repository gonfio, dobbiamo sviluppare molta più danza del ramo quando ci sviluppiamo. Se abbiamo N repository possiamo lavorare in parallelo su N rami, se abbiamo solo 1 repository possiamo lavorare solo su un ramo o avere un carico di copie funzionanti che sono anche una seccatura da gestire.
Con diversi piccoli repository, i registri forniscono una mappa di calore del progetto. Possono anche essere usati come proxy della diffusione della conoscenza nel team di sviluppo: se non mi impegno in repo X da 3 mesi, potrebbe essere utile assegnarmi in un team che lavora su repo X in modo da essere consapevole degli sviluppi in quel componente.
Con piccoli repository, è più semplice ottenere una panoramica chiara di un componente. Se tutto va in un unico grande repository, non vi è alcun artefatto tangibile che delinea ogni componente e la base di codice può spostarsi facilmente verso la grande sfera di fango .
Piccoli repository ci obbligano a lavorare sulle interfacce tra i componenti. Ma poiché vogliamo avere una buona capsulazione, questo è un lavoro che dovremmo fare comunque, quindi lo considero un vantaggio per i piccoli repository.
Con diversi piccoli repository, è più facile avere diversi proprietari di prodotti.
Con diversi piccoli repository, è più semplice avere standard di codice semplici che sono pertinenti a un repository completo e che possono essere verificati automaticamente.