Qual è il modo migliore per gestire il controllo delle versioni dei prodotti e la ramificazione di progetti a lungo termine?

20

In senso generale, per progetti a lungo termine che possono avere più rilasci durante il ciclo di vita dei prodotti e richiedono il supporto di prodotti precedenti, qual è il modo migliore per gestire le versioni dei prodotti e la ramificazione del codice di base?

In un senso più specifico, supponiamo che sia presente un controllo di versione distribuito (cioè git) e che i team siano di dimensioni da piccole a grandi e che lo sviluppatore possa lavorare su più progetti contemporaneamente. Il problema principale che viene affrontato è che esiste un obbligo contrattuale di supportare le vecchie versioni così come esistevano al momento, il che significa che il nuovo sviluppo non può applicare patch al vecchio codice (i prodotti Microsoft Office potrebbero essere un esempio di questo, si ottengono solo patch per l'anno in cui sei proprietario)

Di conseguenza l'attuale versione del prodotto è un po 'complicata in quanto ogni prodotto principale ha più dipendenze, ognuna con le proprie versioni che possono cambiare tra le versioni annuali. Allo stesso modo, mentre ogni prodotto ha il proprio repository, la maggior parte del lavoro non viene eseguita sul trunk principale ma piuttosto su un ramo per gli anni in cui viene rilasciata una nuova filiale quando il prodotto viene rilasciato in modo che possa essere supportato. Ciò a sua volta significa che ottenere la base di codice di un prodotto non è una questione semplice come si potrebbe pensare quando si utilizza il controllo di versione.

    
posta rjzii 11.01.2012 - 13:28
fonte

4 risposte

18

Quanto (e che tipo di) struttura hai bisogno dipende molto da ciò che vuoi essere in grado di fare. Scopri cosa non puoi vivere senza, cosa vuoi avere e cosa non ti interessa.

Un buon esempio di decisioni potrebbe essere:

Cose di cui non possiamo vivere senza:

  • essere in grado di ricostruire qualsiasi versione precedente in qualsiasi momento
  • essere in grado di mantenere più versioni principali supportate del prodotto in qualsiasi momento

Cose che vorremmo avere:

  • essere in grado di eseguire lo sviluppo di funzionalità principali in corso (per la prossima versione principale) senza preoccuparsi di fusioni di filiali
  • essere in grado di eseguire aggiornamenti di manutenzione alle versioni precedenti

Cose che possiamo vivere senza:

  • backport automatico delle modifiche dal lavoro corrente alle versioni precedenti
  • non interrompe mai lo sviluppo di funzionalità importanti anche per pochi giorni o una settimana alla volta

Se i precedenti fossero i tuoi obiettivi, potresti adottare un processo come questo:

  1. Tutto lo sviluppo funziona sul trunk del tuo VCS ("master" in git)
  2. Quando sei vicino a una versione principale, interrompi lo sviluppo delle funzionalità principali e concentrati sulla stabilità del sistema per una settimana circa
  3. Quando il tronco sembra stabile, crea un ramo per questa versione principale
  4. Lo sviluppo delle principali funzionalità può ora procedere sul trunk, mentre sul ramo sono consentite solo correzioni di bug e preparazione del rilascio
  5. Tuttavia, tutte le correzioni dei bug da apportare al ramo devono prima essere testate sul trunk; questo assicura che saranno presenti anche in tutte le versioni future
  6. Crea un tag (VCS) sul ramo quando sei pronto per il rilascio; questo tag può essere utilizzato per ricreare la versione in qualsiasi momento, anche dopo ulteriori lavori sullo stesso ramo
  7. È ora possibile preparare sul ramo ulteriori rilasci di manutenzione per questa versione principale (rilasci minori); ognuno sarà taggato prima del rilascio
  8. Nel frattempo, lo sviluppo di funzionalità principali orientato verso la prossima versione principale può continuare sul trunk
  9. Quando ti avvicini a quella versione, ripeti i passaggi precedenti, creando un nuovo ramo di versioni per quella versione . Questo ti permette di avere più release importanti, ciascuna sul proprio ramo, nello stato supportato allo stesso tempo, con la possibilità di rilasciare versioni secondarie separate contro ciascuna.

Questo processo non risponderà a tutte le tue domande - in particolare, avrai bisogno di un processo per decidere quali correzioni possono essere apportate a un ramo di rilascio e per assicurarti che i bug non siano corretti su un ramo di rilascio prima (tali correzioni dovrebbero essere sempre testate sul bagagliaio ove possibile). Ma ti fornirà un quadro in cui prendere tali decisioni.

    
risposta data 03.02.2012 - 21:48
fonte
1

"A lungo termine" è un indicatore del fatto che hai bisogno di il controllo delle versioni, ma non implica alcuna specifica versione e strategia di diramazione. La domanda più interessante è quante righe di prodotto o linee di versione principali si desidera supportare (che dipende dal contratto con i clienti). Avrai almeno bisogno di un ramo per ogni linea di prodotto / linea di versione principale per cui hai un contratto di manutenzione.

D'altra parte, dipende dalle dimensioni della tua squadra. Se hai un grande team di sviluppo, con persone diverse che lavorano su diverse funzionalità in parallelo, avrai ovviamente bisogno di più sezioni di funzionalità che se hai un gruppo di una o due persone. Se stai lavorando con un team più grande, dovresti considerare l'utilizzo del controllo della versione distribuita, che rende molto più efficiente il lavoro parallelo su diversi rami (e il reinserimento in un secondo momento nel tronco).

    
risposta data 11.01.2012 - 13:40
fonte
1

Git è uno strumento di controllo della versione - gestisce le versioni dei file. Quello che cerchi è uno strumento di gestione della configurazione. C'è una vasta gamma di questi prodotti disponibili, ma per lo più ad alto prezzo da persone come IBM.

Gli strumenti di controllo della versione forniscono branching e tagging, che abilitano la gestione della configurazione scortecciata senza il supporto di strumenti aggiuntivi, quindi gli sviluppatori menay non capiscono la differenza. I tuoi bisogni probabilmente vanno oltre ciò che GIT è progettato per fare.

Non ne sono a conoscenza, ma sono certo che esisterà, una aggiunta di strumenti CM per Git.

    
risposta data 05.02.2012 - 22:08
fonte
0

Questa domanda sembra essere molto simile a un'altra domanda che I inviato di recente di recente.

In breve, questo sembra più un problema di progettazione e distribuzione del prodotto più che un problema di controllo / diramazione della versione. Certo, è facile per me dirlo e più difficile per te risolvere se sei già al centro del problema.

Senza conoscere in modo più dettagliato le specifiche del tuo particolare problema. In generale, tuttavia, se avessi più versioni di prodotti basate su una base di codice che aveva una grande quantità di codice condiviso tra i prodotti, se fosse fattibile avrei cercato di refactoring i prodotti in un modo che li avrebbe resi più modulari e assicurarsi che i moduli stessi non richiedano un'ulteriore diramazione del codice. Osserverei anche il mio modello di implementazione, per vedere se esistevano mezzi migliori per supportare i miei clienti mantenendo nel contempo gran parte della base di codice unificata. Laddove è richiesta una specifica personalizzazione del cliente, potrebbe essere necessaria una maggiore granularità dei moduli per ridurre la quantità di codice duplicato nel sistema.

Non è un compito facile, ma può essere risolto a tappe se gestisci bene il lavoro e se puoi pianificare il lavoro in modo da non dover "aggiornare" tutto in una volta.

    
risposta data 07.02.2012 - 22:51
fonte