Sono ancora un altro utente di Subversion che fatica a rieducare me stesso nel Tao del controllo della versione distribuita.
Quando utilizzavo Subversion, ero un grande fan dell'approccio del progetto minore e, con la maggior parte dei miei ex datori di lavoro, strutturavamo i nostri repository; tag e trunk come segue:
branches-+
+-personal-+
| +-alice-+
| | +-shinyNewFeature
| | +-AUTOMATED-+
| | +-shinyNewFeature
| +-bob-+
| +-AUTOMATED-+
| +-bespokeCustomerProject
+-project-+
+-shinyNewFeature
+-fixStinkyBug
tags-+
+-m20110401_releaseCandidate_0_1
+-m20110505_release_0_1
+-m20110602_milestone
trunk
All'interno dello stesso albero dei sorgenti, useremmo (qualcosa di simile) la seguente struttura:
(src)-+
+-developmentAutomation-+
| +-testAutomation
| +-deploymentAutomation
| +-docGeneration
| +-staticAnalysis
| +-systemTest
| +-performanceMeasurement
| +-configurationManagement
| +-utilities
+-libraries-+
| +-log-+
| | +-build
| | +-doc
| | +-test
| +-statistics-+
| | +-build
| | +-doc
| | +-test
| +-charting-+
| | +-build
| | +-doc
| | +-test
| +-distributedComputing-+
| | +-build
| | +-doc
| | +-test
| +-widgets-+
| +-build
| +-doc
| +-test
+-productLines-+
| +-flagshipProduct-+
| | +-coolFeature
| | +-anotherCoolFeature
| | +-build
| | +-doc
| | +-test
| +-coolNewProduct
+-project-+
+-bigImportantCustomer-+
| +-bespokeProjectOne
| +-bespokeProjectTwo
+-anotherImportantCustomer-+
+-anotherBespokeProject
L'idea era (ed è tuttora) di utilizzare la struttura del repository per aiutare a strutturare la comunicazione tra il team di ingegneri; la parte del business rivolta al cliente e varie altre parti interessate ed esperti di dominio.
In altre parole: i documenti di origine che si trovano in una delle directory del "progetto" vengono utilizzati (e guadagnano) una sola volta. I documenti che si trovano in una delle directory "productLines" guadagnano denaro quante volte viene venduto un prodotto di quella particolare linea. I documenti che si trovano in una delle directory delle "biblioteche" guadagnano denaro tutte le volte che viene venduto qualsiasi prodotto che li utilizza.
Rende esplicita la nozione di ammortamento dei costi e aiuta a costruire il supporto per il riutilizzo dei documenti di origine in tutta l'azienda.
Significa anche che esiste una struttura comune su cui possono operare i nostri strumenti di automazione della costruzione. (I nostri script di compilazione percorrono l'albero dei sorgenti alla ricerca di cartelle "build" all'interno delle quali trovano i file di configurazione che specificano come costruire ciascun componente; un processo simile si verifica per la generazione e il test della documentazione).
Significativamente, i prodotti su cui lavoro in genere impiegano molto tempo per eseguire test di misurazione e caratterizzazione delle prestazioni; dalle 20 alle 200 ore; generazione da qualche parte tra diversi GB a diversi TB di risultati di test elaborati / dati intermedi (che devono essere memorizzati e collegati a una particolare configurazione del sistema in modo da poter misurare il miglioramento delle prestazioni nel tempo). Questo problema rende la gestione della configurazione una considerazione importante e impone anche alcuni requisiti per la centralizzazione, poiché in genere le risorse computazionali necessarie per eseguire i test di misurazione e caratterizzazione delle prestazioni sono limitate; (un piccolo gruppo di 64-128 core).
Come ultima nota; il sistema di integrazione continua sa che deve innescare una build; analisi statica; test del fumo e test dell'unità vengono eseguiti ogni volta che viene modificato il tronco, ogni volta che viene modificato un ramo "tag" e ogni volta che viene modificato un ramo "AUTOMATICO". In questo modo, i singoli sviluppatori possono utilizzare il sistema CI con i loro rami personali, una capacità importante, IMHO.
Ora, ecco la mia domanda: come posso replicare tutto quanto sopra (e migliorarlo, se possibile), con Mercurial.
--modificare:
La mia attuale linea di pensiero è quella di utilizzare un repository Subversion centrale, per definire la struttura generale, ma per consentire l'uso di hg come client in modo che gli sviluppatori possano disporre di repository disponibili localmente.