2009-08-04 10 views
33

I processi di sviluppo del mio team sono basati su continuous integration. Gli unici rami che creiamo sono rami di manutenzione quando rilasciamo, ma altrimenti ci si aspetta che gli sviluppatori si impegnino regolarmente (quotidianamente se non più spesso) in trunk, in modo che il lavoro di tutti sia sempre integrato, continuamente testato e tutte quelle cose buone.DVCS come Git è inappropriato per i team che utilizzano l'integrazione continua?

La mia comprensione di DVCS è che è ideale per la ramificazione. Ho lavorato alcuni anni fa in un team in cui ciò sarebbe stato molto utile, poiché ogni fase di sviluppo è stata eseguita su un ramo e si sono fuse solo una volta completate e testate. Ma questa era una filosofia diversa dall'integrazione continua.

Ma mi sembra che per una squadra che utilizza integrazione continua, le caratteristiche groove di strumenti DVCS come Git non sarebbe particolarmente rilevante, e potrebbe anche ostacolare il processo di integrazione continua se la fusione cambiamenti richiede passaggi aggiuntivi che possono essere dimenticati .

Sono sicuro che ci sono altri vantaggi di un DVCS (ad esempio, commettere è molto veloce perché è locale, presumibilmente si fonde con il ramo principale potrebbe accadere in background mentre lo sviluppatore continua a lavorare).

Ma per questa domanda, sono interessato a come i team che utilizzano DVCS e l'integrazione continua riconciliano le due filosofie apparentemente in conflitto. Sono principalmente interessato a sentire da persone che stanno effettivamente facendo questo.

+0

Questa è una grande domanda. Sfortunatamente, la maggior parte di coloro che hanno risposto ha erroneamente considerato "Integrazione continua" come "esecuzione di un server di generazione continua". Ciò che significa in realtà in un contesto Agile (e ciò a cui Kief sta chiedendo), è spesso commettere importanti modifiche al tronco che possono essere spinte alla produzione. Quindi la domanda non è "Posso lanciare Jenkins contro Git?", Ma "Qual è il punto delle diramazioni se ciò che vogliamo veramente è spingere le modifiche nel bagagliaio?" Sfortunatamente, non ho esperienza CI + DVCS per aggiungere una risposta più utile, ma ho intenzione di tornare in 12 mesi aggiungendone una. –

risposta

32

In realtà DVCS ha reso l'integrazione continua molto più semplice.

Con VCS centrale, ogni sviluppatore ha i diritti di eseguire il commit direttamente nel trunk e quindi può eseguire il commit del codice buggy. CI lo rileverà dopo il fatto. Quindi è possibile avere un tronco rotto anche con CI.

D'altra parte, le operazioni di base nel mondo DVCS sono ramificazioni e fusioni. Poiché l'unione è esplicita e un processo separato rispetto al commit sul trunk, è sempre possibile verificare il risultato di un'unione prima dello che atterra sul trunk. Non ho esperienza con Git, ma gli sviluppatori di Bazaar VCS hanno utilizzato questa tecnica con successo per almeno 3,5 anni con l'aiuto dello strumento PQM.

Fondamentalmente PQM flusso di lavoro si presenta come segue: sviluppatore pubblica il suo ramo in modo che possa essere fusa, poi invia uno speciale e-mail al bot PQM con le istruzioni di unione. Quando PQM riceve una richiesta di unione, crea un ramo di integrazione separato (copia del trunk), quindi unisce il ramo dello sviluppatore ed esegue test sul codice risultante. Se tutti i test vengono passati, il ramo di integrazione viene trasferito al trunk, altrimenti lo sviluppatore riceverà un messaggio di posta elettronica con il log dei test in errore.

L'esecuzione di tutti i test per il progetto Bazaar richiede tempo, ma i test vengono eseguiti su richiesta su un server separato. Gli sviluppatori non saranno bloccati dalle fusioni e potranno continuare a lavorare su altre attività.

Come risultato del flusso di lavoro di unione basato su PQM, il trunk bzr non viene mai interrotto (almeno finché ci sono abbastanza test di accettazione e di regressione).

+0

Grazie bialix, consigli come questo sono esattamente ciò che speravo di ottenere da questa domanda. – Kief

+0

Ho votato la tua risposta, insieme ad un altro paio che ha offerto una buona intuizione. Non credo che nessuna delle risposte qui (finora) siano, da sole, "la" risposta a questa domanda. – Kief

+0

@Damien grazie mille. – bialix

7

Poiché tutti i DVCS possono essere utilizzati con un flusso di lavoro che utilizza un repository centralizzato, non ci sono problemi. La politica impone che lo sviluppatore debba trasferire le proprie modifiche al repository centrale esattamente nello stesso modo in cui la policy impone il commit a un VCS non distribuito. Gli strumenti aggiuntivi che consentono allo sviluppatore di modificare i set di patch non sono in alcun modo un ostacolo e, di fatto, rendono molto più facile generare una base di codice gestibile.

5

Gli strumenti di integrazione continua come Hudson supportano DVCS, quindi sospetto che sia possibile conciliare l'integrazione continua con il controllo della versione distribuita.

In primo luogo, penso che con DVCS che utilizza flussi di lavoro come il flusso di lavoro di un ramo di argomenti l'IC potrebbe essere meno necessario. In secondo luogo, è possibile impostare un repository di integrazione continua (singolo, centrale) a cui si spinge quando si è pronti e gli hook fanno CI.


Aggiunto 07-08-2009:

Si veda ad esempio Continuous Integration Spring Cleaning post su GitHub Blog.

6

L'utilizzo di un DVCS come Git non impedisce di eseguire regolarmente il commit su un archivio centrale. Tuttavia, ciò significa che è possibile eseguire commit intermedi localmente e solo dopo aver apportato le modifiche al repository centrale, una volta terminato.

In questo modo si hanno i vantaggi del controllo del codice sorgente anche quando si sta implementando a metà strada una funzionalità, senza interrompere la creazione per gli altri sviluppatori.

+0

Penso che questo sia uno dei principali vantaggi del DVCS rispetto al VC centralizzato quando utilizzato per l'integrazione continua. Permette un livello più granulare di commit, commit che non superano da soli un test, ma valgono ancora la pena di essere tracciati da VC. I gruppi di questi commit compongono quindi una modifica completa che insieme possono superare il test e vengono integrati mediante il push su un repository principale. – imagineerThat

+0

ma il fatto è che vuoi insegnare ai tuoi sviluppatori a fare sviluppo incrementale :) con un lavoro parziale che non supera i test esistenti, stai lasciando che la tua squadra abbia filiali di lunga durata e poi improvvisamente stai facendo branching di funzionalità anche se non lo sai ancora –

1

Due idee che ho trovato aiuto al spiega questo:

  • DVCS separano impegna da unioni.
  • CI viene eseguito contro un repository che si sceglie.

Quindi il nocciolo della questione è il modo in cui le unioni vengono create nei repository su cui si desidera eseguire uno strumento CI. Puoi scegliere di avere un solo repository quando inizi.

+0

finché i tuoi commit non riducono la quantità di fusioni che fai con un repository centralizzato, stai ancora facendo un'integrazione continua. l'IC dovrebbe funzionare contro un repository su cui tutti sono d'accordo, altrimenti è solo un mucchio di repository distribuiti che non sono integrati. – imagineerThat

Problemi correlati