2015-09-03 50 views
23

Da un po 'di tempo eseguiamo l'integrazione continua e la consegna continua con Subversion che si attiva quando le condotte si innescano. Recentemente, abbiamo iniziato a utilizzare git in alcuni progetti con git-flow e stiamo cercando di decidere quali rami di git-flow dovremmo utilizzare per attivare l'integrazione continua e le pipeline di consegna continue.Integrazione continua e consegna continua con git-flow

Qui ci sono due approcci:

1. Utilizzare sviluppano ramo

Problema: Con git-flow che siamo tenuti a distribuire il rilascio (o master) filiale di produzione, in modo avremmo dovuto costruire due diversi gasdotti, uno per l'integrazione continua (sviluppo delle diramazioni) e uno per la distribuzione continua (master delle filiali). Questo potrebbe introdurre bug in produzione perché la versione in produzione non sarà la stessa di quella in altri ambienti (integrazione, test, staging).

2. Usare branch master:

Problema: In questo modo, non avremmo un'integrazione veramente continuo, dal momento che le modifiche a questi rami sono spinti non molto frequente.

Qual è il ramo di rigth da utilizzare nelle condotte?

+3

Nella mia esperienza git-flow è più adatto per _packaged software_ (qualcosa che pubblichi occasionalmente, con numeri di versione discreti, possibilmente con diverse versioni precedenti in natura). E 'questo il tuo caso? Per un approccio basato su _web (rilasciato costantemente, l'unica versione che conta è quella live) ho trovato il più semplice flusso di lavoro [feature branch] (https://www.atlassian.com/git/tutorials/comparing-workflows/ feature-branch-workflow) o [flusso github] (https://guides.github.com/introduction/flow/) si avvicina molto più adatto. –

+0

È possibile eseguire l'integrazione, il test e la gestione temporanea in altri rami, quindi eseguire il master? –

risposta

9

La verità sta tra i due. Se si vuole adottare git-flusso in un rigoroso pipeline di CD, è necessario utilizzare il release-filiale per il vostro CI:

  1. Per ogni (lotto di) sviluppare ramo commit (s), lasciare che il server CI automaticamente crea un ramo di rilascio ed esegui tutti i tuoi test su di esso.
  2. Se fallisce, lascia che segnala e/o cancella il ramo, altrimenti lo unisca al master.

L'idea di base viene dalla diapositiva di John Ferguson Smart su CI/CD nei progetti Java Maven (BDD in Action, Jenkins Definite Guide).

4

A mio avviso, se si desidera applicare git-flow in Consegna continua, è necessario disporre di due pipeline diverse come si è detto nel primo approccio.

Io suggerirei di questo approccio:

1. Sviluppare ramo

  • Sviluppare ramo attiverà Build Commit: Non appena una funzione viene aggiunto al ramo di sviluppare (in unione o tirare richiesta), l'IC compilerà, testerà (Test unitario & revisione del codice) e impacchetterà la soluzione (con un suffisso "-develop-vX"). Quindi il team è in grado di reagire rapidamente in caso di fallimento.
  • Una volta completata la configurazione di commit, l'attività viene eseguita (in caso contrario, la modifica viene ripristinata e lo sviluppatore che ha eseguito la modifica deve correggerlo immediatamente). In parallelo, la fase di test di accettazione inizia a distribuire la build precedente nell'ambiente di sviluppo per l'esecuzione delle prove di accettazione (ad esempio il test di regressione funzionale &) senza bloccare il lavoro dello sviluppatore. Una volta terminato, lo stato del ramo di sviluppo viene comunicato al team. Pertanto, il team è a conoscenza della stabilità della soluzione durante lo Sprint corrente: se la fase Test di accettazione termina correttamente, il prodotto è pronto per la fusione con il ramo Master (in caso contrario verrà risolto).

2. branch master

  • Una volta che la Sprint è finito, il ramo di sviluppo stabile (è stabile) si fonde e contrassegnata al Maestro Branch. Quindi il ramo principale attiverà il Trunk Commit Build che costruirà la soluzione, la testerà e il pacchetto per la distribuzione (il pacchetto ora è memorizzato con un release candidate o un suffisso master).
  • Se il Trunk Commit Build termina correttamente (dovrebbe funzionare), la fase di test di accettazione distribuirà e convaliderà i test di accettazione in un ambiente di integrazione. E in caso di successo, la nuova versione è pronta per la produzione. In caso contrario, in caso di errore durante la fase di configurazione di commit o di accettazione, l'unione viene ripristinata.
8

Il flusso git e l'integrazione continua sono, per definizione, incompatibili. I rami sono un meccanismo per il ritardo dell'integrazione : quando si esegue il commit su un ramo diverso da master (o trunk, se si proviene da Subversion), si evita un'integrazione continua. Fare un'integrazione continua è semplice, ma non facile.

+1

Stai solo evitando il CI dei tuoi commit non testati. Usare CI per gestire il ramo master e solo affidarsi al ramo di sviluppo va bene. – Alex

+1

No Alex. Il punto è che una squadra matura è in grado di testare i cambiamenti abbastanza bene prima di commetterli, quindi non ci sono "commit non testati". I branch feature sono un cerotto che ti consente di eseguire commit di bassa qualità. Rimuovi il cerotto e impara a fare commesse di alta qualità! – xpmatteo

+1

Io e il mio team ci impegniamo più di 20 volte al giorno ogni giorno in una filiale per una funzione specifica. Solo quando la funzione è completa, mi unisco di nuovo o creo una richiesta di pull. Questo è letteralmente equivalente al tour dei cosiddetti commit di alta qualità. Tranne che possiamo collaborare in remoto e preservare il lavoro se l'hard disk di un ingegnere non funziona. – Alex