Introduzione di una politica di diramazione del controllo della versione a un piccolo team

17

Sono un appaltatore che ha recentemente iniziato con una ditta.

Il team è composto da 3 sviluppatori di 2 sviluppatori di livello junior e mid level, con un altro allo stesso livello a partire presto, e io stesso (6 anni xp). Per entrambi gli sviluppatori esistenti è il loro primo lavoro fuori dall'università / college, e non hanno mai avuto uno sviluppatore esperto che supervisionava il loro lavoro prima.

Non esiste una politica di controllo della versione esplicita. Gli sviluppatori eseguono tutto lo sviluppo sul trunk e quindi si distribuiscono alla produzione direttamente dalle loro macchine di sviluppo. Il team esistente non ha familiarità con la ramificazione.

Sto cambiando tutto questo e introducendo CI, TDD test / staging / server di produzione, ecc. insieme a un criterio di controllo della versione per complimentarmi con questo.

Il sistema di controllo del codice sorgente è TFS, che non ho mai usato prima. È configurato come un repository gigante.

Ho scritto alcune indicazioni per loro, ma c'è qualcos'altro che dovrei aggiungere / modificare, tenendo presente l'esperienza del team?

Version Control Policy

Development is done on the trunk

If a change is estimated to take more than a week then it should be done on a branch, with regular merges from the trunk into the branch to stop the two going out of sync.

Release branches created for production code. That branch should only contain stable code. We can either have one release branch that gets updated from the trunk once per sprint, or we can make a separate release branch for each week.

If a urgent bug fix affecting production code needs to be made, then it gets made on the release branch, and merged back into the trunk.

If we adopt the one release branch strategy then the trunk gets merged into the release branch once per sprint towards the end of the sprint.

If we adopt the seperate branch per release strategy, then the trunk NEVER gets merged into the Release branch

In some scenarios it may be necessary to make the bug fix twice on different branches, if branches have diverged too much. If we are doing short sprints then this shouldn’t happen too often.

Ho in programma di avere tre server. Ambiente di test che esegue sempre il codice più recente nel repository. Un ambiente di gestione temporanea che sta eseguendo la versione più recente candidata per la staging / testing del codice Release Candidate e le finalità UAT e l'ambiente di produzione.

Il motivo per cui ho intenzione di fare questo è che finora il client ha fatto solo un software interno. Il nuovo progetto è per un cliente multimediale di alto profilo e la mia sensazione è che il team abbia bisogno di adottare un modello di sviluppo più professionale rispetto a quello che fanno al momento.

Per esempio al momento, un utente può telefonare al team con una segnalazione di bug. Gli sviluppatori individuano e risolvono il bug, eseguono un test rapido per il test del bulbo oculare sulle proprie macchine e quindi si avviano direttamente alla produzione. Nessun test automatico o altro.

Con il senno di poi penso che il ramo della funzione sia un passo troppo lontano e lo rimuoverò.

Quindi essenzialmente si tratta di a) nessuna ramificazione) b) un ramo di rilascio e il tronco, e c) un ramo di rilascio per rilascio e il tronco.

Ero inclinato verso quest'ultimo. Il mio pensiero iniziale sarebbe che avrei sia un release candidate che un rilascio per essere pubblicati su server separati (UAT / Produzione) allo stesso tempo, ma in realtà il trunk è il candidato al rilascio in qualsiasi momento, quindi un ramo per il rilascio è incline al pazzo. Il mio unico pensiero sarebbe se non volessimo che i nostri stakeholder vedessero il codice di sviluppo, quindi potremmo aver bisogno di un ramo di rilascio separato, ma YAGNI e tutto questo .....

    
posta MrBliz 16.06.2015 - 13:12
fonte

3 risposte

16

Per un team di 3-4 sviluppatori, stai proponendo troppe filiali.

Ogni ramo che crei è un overhead aggiuntivo che viene fornito con un costo (tempo trascorso a unire, tenere traccia di cosa è dove, ecc.). È necessario assicurarsi che il vantaggio derivante dall'avere un ramo superi il costo.

Ricorda che l'unico vero vantaggio per un ramo è l'isolamento del codice. Ciò significa che hai bisogno di un motivo concreto per voler avere il codice isolato.

Avere un ramo di rilascio separato per lo sprint ogni è folle. Perché hai bisogno del codice da uno sprint isolato dal codice per il prossimo? Perché non avere un singolo ramo di rilascio stabile che viene portato avanti con ogni sprint?

If a change is estimated to take more than a week then it should be done on a branch, with regular merges from the trunk into the branch to stop the two going out of sync.

Quasi tutte le nuove funzionalità non banali impiegano almeno una settimana in tempo reale dopo aver tenuto conto dello sviluppo, dei test degli sviluppatori, delle interruzioni giornaliere e di altre attività, ecc.

Inoltre, cos'è una "unione regolare"? Quotidiano? Settimanalmente? Ogni unione che fai richiede tempo: devi assicurarti che il target unisca le build del ramo & corre dietro alle tue modifiche. In una piccola squadra, la fusione frequente è molto onerosa.

Abbiamo un team di 4 sviluppatori che lavorano su una base di codice di oltre 1 milione di linee e questo è il modo in cui operiamo:

  • Ramo principale in cui viene eseguito tutto lo sviluppo
  • Un ramo per versione principale (fatto circa una volta all'anno)

L'unica regola principale è: non controllare il codice che non genera.

Questo è tutto. Semplice, facile da capire, ottiene l'isolamento di cui abbiamo bisogno (in qualsiasi momento possiamo creare una versione di rilascio per qualsiasi versione).

Il vantaggio di avere tutto il lavoro di sviluppo svolto su un ramo:

  1. Gli sviluppatori sono sempre sincronizzati l'uno con l'altro. Nessuna fusione dolorosa perché due sviluppatori sono rimasti fuori per le proprie filiali per settimane creando modifiche incompatibili.
  2. Le build rotte vengono trovate nello stesso giorno. Abbiamo una build notturna che esegue l'ultimo codice su main. Se qualcuno controlla il codice che non viene generato per qualche motivo, lo sapremo subito.
  3. Con tutti che lavorano sempre sullo stesso codice, aumentano le possibilità che un bug venga trovato prima piuttosto che dopo.
  4. Nessun overhead di integrazione oltre alle correzioni mirate per rilasciare i rami. In una piccola squadra, questo è il grande.
risposta data 16.06.2015 - 16:19
fonte
31

Hai scritto alcune indicazioni per loro, ma non hai spiegato perché il tuo approccio migliore di quello che già usano . Questo potrebbe essere problematico. Se sei in uno spirito "Lo faremo a modo mio, perché ho sei anni di esperienza professionale, e tu no" (e leggendo la tua domanda, sembra esattamente in questo modo), sii pronto ad essere odiato da i membri del tuo team che cercheranno di fare tutto il possibile per applicare i tuoi concetti.

Hanno un problema che deve essere risolto? È fondamentale rispondere a questa domanda prima, perché in realtà hanno un problema e accolgono con favore i tuoi suggerimenti, oppure funzionano perfettamente come attualmente lo fanno, e tu stai solo spingendo verso di loro il tuo modo di lavorare , solo perché preferisci lavorare in questo modo.

Alla fine, forzandoli a utilizzare le filiali può avere un impatto estremamente negativo . Lavorare con un tronco è facile, specialmente in ambiente Agile. Uno sviluppatore commette modifiche al trunk, eventualmente gestendo piccoli conflitti e tali modifiche vengono immediatamente utilizzate dalla piattaforma di integrazione continua. Con rami:

  • Uno sviluppatore deve pensare dove dovrebbe essere collocata la modifica,

  • Qualcuno deve gestire i rami e fondersi dai rami al tronco,

  • Le fusioni tra i rami vengono eseguite meno frequentemente rispetto ai commit, il che significa che qualcuno deve affrontare conflitti più grandi e più difficili da gestire rispetto a un conflitto tra due commit,

  • Ogni commit non trova necessariamente la sua strada in Continuous Integration, che ritarda le informazioni che gli sviluppatori hanno sugli effetti che un commit può avere (specialmente regressioni).

Il fatto che:

The existing team are not familiar with branching

rende le cose ancora peggiori. Ho lavorato in un team di programmatori inesperti, in cui un manager inesperto ha deciso di giocare con le filiali. Ciò ha comportato un sacco ( molto ) di tempo sprecato ed è esattamente la cosa che vuoi evitare per un progetto che ha scadenze.

    
risposta data 16.06.2015 - 13:37
fonte
3

Come dice Mainma, fai attenzione alla ramificazione. Hai parlato di branching ogni poche settimane, è davvero necessario avere molti rami?

In alternativa, potresti anche avere un modello 'pull' invece di un modello push. Se si stesse utilizzando Git o Mercurial, è possibile che un server di integrazione convalidi le proprie modifiche prima di inviare al server centrale. In TFS, puoi fare qualcosa di simile usando check-in con gating . In questo modo, puoi avere la convalida ed evitare la complessità dei rami.

    
risposta data 16.06.2015 - 14:53
fonte