Domanda

Sto cercando di decidere la migliore strategia di ramificazione per un progetto di applicazione web. Ecco quello che ho venire con fino ad oggi e Io apprezzo molto eventuali commenti ed esperienze.

Il mio modo di vedere ci sono due principali strategie di ramificazione: "branch dal rilascio" e "ramo dalla funzionalità"

.

"Branch dal rilascio" : Sviluppo avviene sul tronco. Quando il tempo di rilascio è vicino, una diramazione per tale release. Questo ramo viene poi stabilizzato / collaudata e infine un rilascio. Dopo l'uscita, il ramo è di nuovo unito nel tronco, mantenendo in vita per bug-fixing del ramo di release. È un bug-fix applicata, allora è fusa nel bagagliaio (se lo sviluppo sul tronco non ha eclissato il bug in altri mezzi). Le nuove caratteristiche sono aggiunte al tronco e non influenzano il ramo di release. Quando si avvicina un nuovo tempo di rilascio, un nuovo ramo di rilascio viene creato a.s.o.

"Branch dalla funzionalità" : Il tronco è sempre il tronco "produzione" (il codice che è vivo). Correzioni di bug sono impegnati direttamente al tronco. Caratteristiche per la prossima release sono sviluppati in funzione branches.Bugfixes sono fusi di volta in volta nelle funzionalità rami. Quando arriva il momento di rilascio, le caratteristiche rami sono uniti nel tronco e il ciclo della vita continua.

Ora il mio modo di vedere la grande differenza pratica tra queste due strategie è che "dal rilascio" consente di maintane diverse versioni di produzione di un software del (quando il client A è la versione 1 e il client B versione 1.5, il client è il pagamento cliente in questo caso). In contrasto con il "di funzione" strategia si può sostenere solo la versione di produzione corrente (tutti i client utilizzano la versione più recente).

Dato che in un tipico applicazione web tutti i clienti stanno usando la stessa versione "ultima" (dal momento che tutti gli accessi stesso server), presumo che l'approccio "dalla caratteristica" è il più comunemente Usato. Si elimina la necessità di fondere "attraverso la gerarchia", dire quando un bugfix deve essere applicato a tutte e 3 le versioni di rilascio.

Quindi la mia situazione attuale è che dovrei andare con "ramo dalla funzionalità". Se è importante, la mia squadra non è molto abile.

È stato utile?

Soluzione

Se si dispone di un solo rilascio dal vivo, in qualsiasi momento, e si fa tutto lo sviluppo in un unico ramo di caratteristica, allora questi approcci sono effettivamente la stessa.

Se branch-by-funzione per voi significa avere un diversi rami in movimento in una sola volta, eviterei come la peste. Più rami mezzi più la fusione, che è un dolore in sé, e più integrazione inferno. E 'molto meglio fare integrazione continua ad un'unica codeline.

Se il processo di distribuzione è più coinvolto di quanto ramo, di prova, andare a vivere, quindi un vantaggio di ramo-by-release è che si può avere più rami di rilascio in corso in una sola volta, in diverse fasi: una dal vivo e di essere bugfixed come necessaria, e un altro è stabilizzata, testato, passando accettazione, ecc, mentre lo sviluppo continua sul tronco. Se si dispone di un tronco dal vivo, d'altra parte, una volta che si unisce un ramo di caratteristica in al fine di prenderlo vivo, hai perso la capacità di fare correzioni all'attuale sistema live. La fusione caratteristica ramo diventa un punto di non ritorno.

Altri suggerimenti

Che tipo di software stai sviluppando? Termoretraibile? Open Source Project? Se è così, andare con il "ramo dal rilascio" o un approccio "tronco instabile". Soprattutto se i vostri cicli di rilascio sono ogni sei mesi a un anno di distanza.

Ma se il vostro mantenimento di un progetto web-based che contiene modifiche uscire su frequenze più brevi, come una volta ogni poche settimane o meno, poi andare con il "ramo dalla funzionalità" o un approccio "tronco stabile". Il problema di questo approccio è l'integrazione di molteplici funzionalità cambiamenti che si sono cambiamenti radicali rendono il processo di unione meno divertente. Si ottiene solo molto difficile.

Ma sia di coloro che funzionano bene, ma cosa succede se avete bisogno di entrambe le cose? Che è, si dispone di un progetto che distribuisce dice una volta ogni paio di settimane con grandi modifiche di funzionalità, ma si scopre che si dispone di un numero di correzioni di bug che non si può aspettare per coloro funzione cambia per essere pronti. Trunk è il vostro ramo di release con l'approccio "ramo dalla funzionalità". E se fosse possibile ottenere entrambe le versioni e presenta la propria filiale?

Dai un'occhiata a questo blog da Bob di CollabNet Arciere. La sua strategia di uscita Agile ti dà meglio di entrambi. Ho usato questo. E 'estremamente flessibile. Anche se Bob non vederlo nel suo schema, è possibile avere più rami di rilascio in corso allo stesso tempo. Questo significa che si potrebbe avere un ramo di rilascio che è pronto per rollout di produzione, e un altro che si sta preparando per i controlli di QA finali. Ma due cose da considerare:

In primo luogo, quanto è buono sono gli sviluppatori a fusione? Non si può fare l'approccio strategia di rilascio agile da soli, anche se si tratta di una piccola squadra. Ognuno ha a che fare la loro parte e hanno davvero a capire la fusione e gli strumenti che stanno usando per fare la fusione.

In secondo luogo, si sta andando ad avere bisogno di una buona conoscenza sui cambiamenti che pronti e quelli che sono in procinto di essere. gestione di rilascio è la chiave per fare questo lavoro, come il lavoro dell'orologio. Ogni funzione quando è pronto necessità volontà di ottenere assegnato ad un ramo di release e uniti ad esso.

Qualunque sia l'approccio che si sceglie, si tratta di ciò che si sta sviluppando e la frequenza delle modifiche che si stanno rilasciando per lo sviluppo.

A rischio di voi confondere ulteriormente: si può avere rami di rilascio e fare tutti i cambiamenti su questi rami. Queste cose non si escludono a vicenda.

Detto questo, sembra che tu non hai bisogno di famiglie di rilascio in parallelo e si desidera distribuire spesso, forse anche continuamente . Quindi, si vorrebbe avere un "tronco stabile" che è possibile rilasciare in qualsiasi momento. Rami di funzione di aiuto per mantenere la stabilità del tronco, perché si uniscono solo torna al tronco quando i cambiamenti sono fatto e si sono dimostrati.

Quindi direi che la vostra scelta è una buona misura.

.

Queste scelte non si escludono a vicenda - utilizzare entrambi Risolvono problemi diversi:

"Branch dal rilascio" - ramo di release viene utilizzato per garantire è possibile eseguire la fonte utilizzata per produrre la corrente versione live (o versioni precedenti rilasciate) mentre la versione successiva è in fase di sviluppo. Per esempio. Questo è al fine di apportare modifiche alla versione per correzioni di bug o caratteristiche backpatch dal tronco di sviluppo attuale.

"Branch dalla funzionalità" -. Utilizzato per mantenere un tronco sviluppo stabile in tutti i tempi, che è particolarmente utile per gli sviluppatori e più a fini sperimentali o "forse" caratteristiche

I userebbe entrambi, ma è possibile rinunciare uno degli approcci se il problema si risolve non si applica a voi o se si dispone di una soluzione diversa che problema.

I consigliamo vivamente di utilizzare una moderna DVCS come git o Mercurial. Essi sono orientati a sviluppo parallelo, in modo da memorizzare modifiche diverso rispetto vecchi sistemi, il che rende la fusione molto più sana.

Io tendo ad usare Git per i miei progetti, ma il processo che tendono a seguire va in questo modo (e dovrebbe funzionare per Subversion pure):

  • per ogni nuova funzione, creare un ramo per quella funzione.
  • quando tutto funziona, si fondono in ramo staging, e distribuirlo al server di gestione temporanea (si ha uno di quelli, giusto?)
  • Una volta che siamo sicuri che il cliente è felice con ciò che è sulla messa in scena, ci fondiamo il ramo messa in scena nel ramo di produzione, tag come qualcosa di simile a production_release_22 o production_release_new_feature_x e quindi distribuire il tag al server di produzione.

I tag sono non , mai aggiornato - una volta che qualcosa viene distribuito, che rimanga così fino a quando sono costruite più cambiamenti, collaudato, ed etichettati - e poi il nuovo tag è distribuito. Facendo in modo che si tratta di tag sempre schierati e non rami , mi mantengo (o altri) di fare le cose come "mi limiterò a commettere questo cambio rapido e aggiornare il server senza provarla".

Ha funzionato abbastanza bene per me finora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top