Come organizzare i rami Git remoti quando il team esegue le singole modifiche?

1

Sono un membro di un team di progetto con una metodologia di rilascio alquanto inusuale (o almeno dal mio punto di vista) e dinamica di squadra. Il modo in cui abbiamo realizzato i rilasci sta sviluppando un unico pacchetto funzionale alla volta, il tutto, come regola generale, da un singolo sviluppatore. Gli sviluppatori lavorano sulle loro aree funzionali virtualmente indipendenti, che sono tutte ugualmente parte dello stesso pacchetto di distribuzione (file WAR e il corrispondente repo Git), contemporaneamente ma non è sicuro o chiaro di quale modifica entrerà in quale ordine. Dipende spesso da chi termina e prima viene testato il materiale. Quindi Dev1 potrebbe funzionare su Change1 in TeamProject e Dev2 funzionerà su Change2 nella stessa applicazione, ea volte le loro modifiche potrebbero essere interdipendenti (come cambiare un'API condivisa) ma non è chiaro quando verranno distribuiti a PROD.

Il modo in cui attualmente gestiamo la gestione delle filiali di Git è che ogni modifica ha il proprio ramo remoto, che defacto significa che esiste un ramo remoto per sviluppatore. Il problema più grande che vedo è che, per essere aggiornato sulle modifiche del tuo compagno di squadra, devi sincronizzare manualmente il tuo ramo con il loro ramo, che è un processo manuale e spesso un PIA, scusa il termine. Potrebbe essere ok per lo sviluppatore la cui versione è la prossima in linea, per il suo ramo è come apparirà la prossima versione della release una volta che è stata rilasciata (nell'attuale configurazione della singola modifica della release). Ma sicuramente non funziona per lo sviluppatore il cui rilascio arriva subito dopo come (s) che deve costruire le loro modifiche in cima alle modifiche del primo sviluppatore. Tuttavia, non vogliono che il secondo sviluppatore inserisca nel ramo del primo sviluppatore il compito di mantenere intatta la modifica ed escludere tutto il resto da quella specifica release. Quindi il secondo sviluppatore deve fare la fusione del ramo del primo sviluppatore nella sua filiale e poi spingere la sua roba in quel ramo in cima alle modifiche del primo dev. Ciò non sarebbe male se fosse chiaro chi è il 1 ° e chi è il secondo sviluppatore, IOW, le cui modifiche verranno prima srotolate ma che è una contingenza, come spiegato sopra.

Ora, per la natura di questo post finora, è chiaro che io non sono il padre di questo processo e che sono consapevole di molti dei suoi difetti intrinseci. Un difetto notevole è accaduto di recente quando promuovevamo le nostre modifiche all'ambiente TEST. Avevo lavorato nella mia filiale dedicata, ma la versione che è stata distribuita a TEST è stata creata dal mio ramo peer (aveva solo le sue modifiche). Stavo per spingere la mia roba ma non volevo perderla, dato che apprezzo il nostro tempo per il QA e volevo che lui e il mio tester fossero in grado di lavorare contemporaneamente. Così ho sincronizzato il mio ramo con il suo (la ciliegia ha scelto i suoi cambiamenti nel mio, dopo il comune antenato) in modo che fossero presenti sia i suoi sia i miei cambiamenti. Ha funzionato bene. Tuttavia, ha voluto inserire una soluzione di errore il giorno dopo e l'ha fatto fuori dalla propria filiale senza sincronizzarsi con il mio. Indovina cos'è successo: i miei cambiamenti erano spariti dalla build e solo i suoi erano presenti. Inutile dire che questi rami multipli remoti rendono l'integrazione continua (che mi piacerebbe iniziare a fare e che attualmente non è stata fatta), difficile o praticamente impossibile.

Frustrato con tutto questo, ho lavorato su una proposta al mio team su come modificare questa configurazione. La mia idea è di avere una FILIALE REMOTO CONDIVISA DI INTEGRATION in cui ognuno spinga le proprie cose e che sia qualcosa come un ramo di lavoro in corso che tutto può andare avanti finchè compila e supera test (in pratica passa la build). Le build giornaliere di CI potrebbero essere fatte fuori da questo ramo. Poi c'è un ramo di rilascio a cui le cose non sono inserite direttamente ma è selezionato con cura dal Il ramo WIP corrisponde a ciò che vogliamo nel rilascio. Quindi se pensiamo che i cambiamenti di Dev1 andranno nell'immediata prossima versione, ci prendiamo le sue modifiche. Ma l'importante è che ci sia un ramo UNIFIED per tutti gli sviluppatori del team che lavorano sullo stesso progetto e non lavorano nel silo isolato di ognuno. In questo modo, potremmo effettivamente ribattere continuamente le nostre filiali locali con il telecomando condiviso e ottenere le modifiche dei nostri colleghi in tempo utile rispetto a quando diventano parte del master (o della produzione) quando il volume delle modifiche da sincronizzare può rendere vivente il processo di fusione inferno.

Vorrei chiedere informazioni sui pro e contro della mia metodologia proposta rispetto a ciò che il team sta facendo attualmente e viene spiegato sopra. E in generale, con l'idea dell'attuale cultura del rilascio in mente, che forse non rientra nei miei poteri di cambiamento in quanto è influenzata da molti membri dell'organizzazione sopra di me, quale sarebbe la configurazione di lavoro di squadra più efficiente e indolore.

    
posta amphibient 31.01.2015 - 00:47
fonte

1 risposta

4

Manterrei i rami delle funzionalità (molto simile a quello che descrivi ora), ma assicurati che siano rami di funzionalità, non singoli rami di sviluppatori ... Gli sviluppatori lavorano su questi rami di funzionalità, sviluppano e testano le loro funzionalità.

In aggiunta a tutto questo, come dici tu, disponi di un ramo di integrazione in cui tutte le modifiche vengono unite, compilate e forse vengono eseguite alcune prove quotidiane. Le fusioni non avvengono fino a quando gli sviluppatori non sono sicuri e hanno verificato che ciò che hanno sviluppato non infrange le cose. Attenzione, questo non significa che la loro funzione sia completamente eseguita, piuttosto che ciò che "pubblicano" è buono, corretto e non più nel flusso di codice.

I vantaggi:

  • unisci i conflitti trovati e risolti presto
  • tutti possono vedere dove sta andando il codice guardando il ramo dell'integrazione Qualunque cosa ci sia dentro è considerata di essere rilasciata e non soggetta a grandi cambiamenti, eccezion fatta per le eccezioni.
  • questo ramo può essere testato per il danno da fusione (ad esempio 2 funzioni non funzionano bene insieme). Non è più necessario attendere che la funzione venga unita al ramo di rilascio (in aggiunta alle funzionalità precedenti) per trovare e correggere questi problemi

Nel tempo, potresti scoprire che i tester impiegano più tempo a testare il ramo di integrazione e meno tempo a testare il ramo di rilascio perché sono stati trovati più problemi durante l'integrazione.

Tuttavia, contrariamente alle singole modifiche apportate alla ciliegia in un ramo di rilascio, sceglierei di fondere in ogni ramo di funzionalità nel ramo di rilascio e di stabilizzarlo fino al rilascio effettivo. La fusione offre l'ulteriore vantaggio di poter eseguire "git log integration..release" o "git log release..feature" e ottenere panoramiche delle modifiche in sospeso. Se fai il cherry-pick, git non ha alcuna conoscenza di cosa ha fatto o non è riuscito a farlo nel rilascio.

Gli intenditori troveranno che questo assomiglia un po 'al flusso di sviluppo del kernel Linux, dove linux-next funge da repository di integrazione (/ branch) dove tutte le funzionalità devono aver vissuto un po' prima di essere unite alla mainline e gli sviluppatori lavorano sui propri repository locali ( / filiali).

    
risposta data 31.01.2015 - 13:35
fonte

Leggi altre domande sui tag