Mi dispiace per questo lungo post, ma penso che ne valga la pena.
Ho appena iniziato con un piccolo negozio .NET che funziona in modo leggermente diverso rispetto ad altri posti in cui ho lavorato. A differenza di qualsiasi delle mie precedenti posizioni, il software scritto qui è destinato a più clienti e non tutti i clienti ottengono contemporaneamente l'ultima versione del software. Pertanto, non esiste una "versione di produzione attuale". Quando un cliente riceve un aggiornamento, ottiene anche tutte le funzionalità aggiunte al software dall'ultimo aggiornamento, che potrebbe essere molto tempo fa. Il software è altamente configurabile e le funzionalità possono essere attivate e disattivate: i cosiddetti "toggle di funzionalità". I cicli di rilascio sono molto stretti qui, in realtà non sono in programma: quando una funzionalità è completa, il software viene distribuito al cliente interessato.
Il team solo l'anno scorso è passato da Visual Source Safe a Team Foundation Server. Il problema è che usano ancora TFS come se fosse VSS e impongono i blocchi di Checkout su un singolo ramo di codice. Ogni volta che una correzione di bug viene messa in campo (anche per un singolo cliente), essi semplicemente creano qualsiasi cosa sia in TFS, testano il bug che è stato corretto e lo distribuiscono al cliente! (Provengo da un background software farmaceutico e di dispositivi medici questo è incredibile!). Il risultato è che il codice dev mezzo cotto viene messo in produzione senza essere nemmeno testato. I bug scivolano sempre nelle build di rilascio, ma spesso un cliente che ha appena ricevuto una build non vedrà questi bug se non usano la funzionalità in cui si trova il bug. Il regista sa che questo è un problema poiché la società sta iniziando a crescere tutto all'improvviso con alcuni grandi clienti che salgono a bordo e altri più piccoli.
Mi è stato chiesto di esaminare le opzioni di controllo del codice sorgente al fine di eliminare la distribuzione di codice errato o incompleto, ma di non sacrificare la natura un po 'asincrona delle versioni dei team. Ho usato VSS, TFS, SVN e Bazaar nella mia carriera, ma TFS è dove la maggior parte della mia esperienza è stata.
In precedenza la maggior parte dei team con cui ho lavorato utilizza una soluzione a due o tre rami di Dev-Test-Prod, dove per un mese gli sviluppatori lavorano direttamente in Dev e quindi le modifiche vengono unite a Test e Prod, oppure promosse "al termine" anziché su un ciclo fisso. Sono state usate build automatizzate, usando il controllo della velocità di crociera o il Team Build. Nel mio precedente lavoro Bazaar era utilizzato seduto sopra SVN: gli sviluppatori lavoravano nelle loro piccole filiali e poi spingevano le loro modifiche a SVN (che era legato a TeamCity). È stato bello in quanto era facile isolare i cambiamenti e condividerli con i rami di altre persone.
Con entrambi questi modelli c'era un ramo centrale dev e prod (e talvolta test) attraverso il quale veniva spinto il codice (e le etichette venivano usate per contrassegnare build in prod da cui venivano rilasciate le versioni ... e questi venivano trasformati in branch per correzioni di bug ai rilasci e riuniti in dev). Questo non è proprio adatto al modo di lavorare qui, tuttavia: non c'è alcun ordine a quando verranno rilasciate varie funzionalità, vengono spinte quando sono complete.
Con questo requisito, l'approccio di "integrazione continua" secondo me non funziona. Per ottenere una nuova funzionalità con integrazione continua, questa deve essere spinta tramite dev-test-prod e questo catturerà qualsiasi lavoro incompiuto in dev.
Sto pensando che per ovviare a questo dovremmo scendere a un modello fortemente ramificato di funzioni senza NESSUN ramo di sviluppo dev-test, piuttosto l'origine dovrebbe esistere come una serie di rami di caratteristiche che quando il lavoro di sviluppo è completo sono bloccati, testati, riparati, bloccati , testato e quindi rilasciato. Altri rami delle caratteristiche possono prendere cambiamenti dagli altri rami quando ne hanno bisogno / desideri, quindi alla fine tutti i cambiamenti vengono assorbiti in tutti gli altri. Questo si adatta molto al modello puro di Bazaar rispetto a quello che ho vissuto nel mio ultimo lavoro.
Per quanto possa sembrare flessibile, sembra strano non avere un tronco di sviluppo o un ramo prod da qualche parte, e sono preoccupato per i rami che non desiderano mai reintegrarsi, o per i piccoli cambiamenti in ritardo che non vengono mai trasferiti ad altri rami e gli sviluppatori si lamentano unisci disastri ...
Quali sono i pensieri delle persone su questo?
Una seconda domanda finale: sono un po 'confuso circa la definizione esatta del controllo del codice sorgente distribuito: alcune persone sembrano suggerire che si tratta solo di non avere un repository centrale come TFS o SVN, altri dicono che si tratta di essere disconnesso (SVN è disconnesso al 90% e TFS ha una modalità offline perfettamente funzionante) e altri dicono che si tratta di Feature Branching e facilità di fusione tra rami senza relazione genitore-figlio (TFS ha anche una fusione priva di fondamento!). Forse questa è una seconda domanda!