Sono ancora un altro utente di Subversion che fatica a rieducarmi nel Tao del controllo di versione distribuito.
Quando usavo Subversion, ero un grande sostenitore dell'approccio secondario al progetto e, con la maggior parte dei miei ex datori di lavoro, strutturavamo i nostri rami di deposito; tag & tronco 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 del vero albero dei sorgenti stessi, 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 vari altri stakeholder & esperti di dominio.
Per arguzia: i documenti sorgente che si trovano in una delle directory "progetto" vengono utilizzati (e guadagnati) solo una volta. I documenti che si trovano in una delle directory "productLines" guadagnano denaro tutte le volte che viene venduto un prodotto da quella particolare linea. I documenti che si trovano in una delle directory "librerie" guadagnano denaro tutte le volte che vengono venduti i prodotti che li utilizzano.
Rende esplicita la nozione di ammortamento dei costi e aiuta a creare supporto per il riutilizzo dei documenti di origine in tutta l'azienda.
Significa anche che esiste una struttura comune sulla quale possono operare i nostri strumenti di automazione delle build. (I nostri script di costruzione percorrono l'albero dei sorgenti alla ricerca di cartelle "build" all'interno delle quali trovano i file di configurazione che specificano in che modo deve essere costruito ciascun componente, un processo simile avviene per la generazione e il test della documentazione).
Significativamente, i prodotti su cui lavoro in genere impiegano molto tempo per eseguire misurazioni e prestazioni delle prestazioni; test di caratterizzazione; da 20 a 200 ore; generare da qualche parte tra diversi GB a diversi TB di risultati di test elaborati / dati intermedi (che devono essere memorizzati e legati a una particolare configurazione di sistema in modo da poter misurare il miglioramento delle prestazioni nel tempo). Questo problema rende la gestione della configurazione un'importante considerazione e impone anche alcuni requisiti per la centralizzazione, poiché in genere le risorse di calcolo necessarie per eseguire i test di misurazione e caratterizzazione delle prestazioni sono limitate; (un piccolo cluster di 64-128 core).
Come ultima nota; il sistema di integrazione continua sa che è necessario attivare una build; analisi statica; test del fumo e amp; Il test dell'unità viene eseguito ogni volta che viene modificato il trunk, ogni volta che viene modificato un ramo "tag" e ogni volta viene modificato un ramo ramo "AUTOMATICO". In questo modo, i singoli sviluppatori possono utilizzare il sistema di CI con le loro filiali personali, un'importante capacità, IMHO.
Ora, ecco la mia domanda: come posso replicare tutto quanto sopra (e migliorarlo, se possibile) con Mercurial.
- edit:
La mia attuale linea di pensiero è di usare un repository centrale di Subversion, per definire la struttura generale, ma per consentire l'uso di hg come client in modo che gli sviluppatori possano avere repository disponibili localmente.