Suggerimenti per ottenere una consegna "continua"


14

Una squadra ha difficoltà a rilasciare software su base frequente (una volta alla settimana). Quella che segue è una tipica sequenza temporale di rilascio:

Durante l'iterazione:

  • Gli sviluppatori lavorano su storie arretrate su rami di breve durata (questo è applicato con entusiasmo) basati sul ramo principale.
  • Gli sviluppatori inseriscono spesso i loro rami delle funzioni nel ramo di integrazione, che viene continuamente creato e testato (per quanto riguarda la copertura del test) automaticamente.
  • I tester hanno la capacità di distribuire automaticamente l'integrazione in un ambiente di gestione temporanea e ciò si verifica più volte alla settimana, consentendo l'esecuzione continua delle loro suite di test.

Ogni lunedi:

  • c'è una riunione di pianificazione del rilascio per determinare quali storie sono "conosciute bene" (in base al lavoro dei tester), e quindi saranno nella versione. Se si verifica un problema noto con una storia, il ramo di origine viene rimosso dall'integrazione.
  • nessun nuovo codice (solo correzioni di bug richieste dai tester) può essere integrato in questo lunedì per garantire che i tester abbiano una base di codice stabile da cui tagliare una versione.

Ogni martedì:

  • I tester hanno testato il ramo di integrazione quanto più possibile hanno dato il tempo disponibile e non ci sono bug noti, quindi un rilascio viene tagliato e spinto lentamente verso i nodi di produzione.

In pratica suona bene, ma abbiamo scoperto che è incredibilmente difficile da raggiungere. Il team vede i seguenti sintomi

  • bug "sottili" si trovano nella produzione che non sono stati identificati nell'ambiente di gestione temporanea.
  • le hot-fix dell'ultimo minuto continuano fino a martedì.
  • i problemi nell'ambiente di produzione richiedono rollback che bloccano lo sviluppo continuo fino a quando non viene raggiunta una distribuzione live di successo e il ramo master può essere aggiornato (e quindi ramificato da).

Penso che la copertura del test, la qualità del codice, la capacità di test di regressione rapidamente, i cambiamenti dell'ultimo minuto e le differenze ambientali siano in gioco qui. Qualcuno può offrire qualche consiglio riguardo al modo migliore per ottenere una consegna "continua"?


1
Oltre alla risposta di @ emddudley sul libro Continuous Delivery, ti incoraggio a guardare infoq.com/presentations/Continuous-Deployment-50-Times-a-Day una presentazione davvero interessante sulla distribuzione veramente più volte al giorno nella vita reale produzione.
sabato

Risposte:


6
  • Nella produzione si riscontrano bug "sottili" che non sono stati identificati nell'ambiente di gestione temporanea - in uno dei progetti con problemi del genere ho visto che questo problema è stato risolto con successo dalla tattica che definirei problemi doppi. Intendo per bug del genere, i ragazzi hanno creato due ticket nel tracker dei problemi: uno è stato assegnato agli sviluppatori per correggere il codice, un altro ai tester per progettare e stabilire test di regressione o cambiamenti nell'ambiente di gestione temporanea che avrebbero impedito di ripeterlo in futuro. Ciò ha contribuito a mantenere la messa in scena abbastanza vicino da prod.

  • i problemi nell'ambiente di produzione richiedono rollback - se questi sono frequenti, le tue uscite settimanali sono in realtà false - considera di adattare la frequenza al livello che funziona davvero. Per falso intendo che se si dice che una delle due versioni settimanali viene ripristinata, gli utenti devono affrontare una nuova versione (funzionante) una volta ogni due settimane, il che è tutto ciò che conta, non il numero di volte che si distribuisce.

  • rami delle funzioni applicati con entusiasmo - significa che qualche tempo prima, hai anche provato a lavorare su un singolo ramo e l'hai trovato inferiore? Se sì, salta il resto. Altrimenti, prova a lavorare su un singolo ramo (se necessario, google per la strategia di ramificazione "ramo di sviluppo" o strategia di ramificazione "tronco instabile" per i dettagli). Oppure, se si utilizza Perforce, cercare nel Web le linee guida di Microsoft su diramazione e unione. Prova l' ho detto? scusate la parola appropriata dovrebbe essere test : voglio dire, 1) pianificare per quando e come misurare se un singolo ramo è migliore o meno di quello che avete ora e 2) pianificare per quando e come tornerete ai rami delle caratteristiche nel caso in cui questo il test fallisce .


PS.

Probabilmente puoi trovare altri trucchi come quello cercando sul web qualcosa come la gestione del rischio di progetti software


aggiornare

<copia dai commenti>

Percepisco le hot-fix frequenti come sintomo di una pipeline di test interrotta - non è così? Ad ogni modo, richiedono rilasci ripetuti per ottenere le soluzioni rapide per far lavorare di più il team operativo. Inoltre, le hotfix sono generalmente codificate in condizioni di estrema pressione temporale, il che significa che probabilmente saranno di qualità inferiore rispetto al normale lavoro.

</ copia dai commenti>

  • hot-fix dell'ultimo minuto - le preoccupazioni di cui sopra mi sembrano ragionevoli, così come il tuo riferimento a una pipeline di test interrotta. Con questo aggiornamento, la tua nota precedente che lunedì l'integrazione del nuovo codice è bloccata suona come un altro sintomo della pipeline spezzata (penso che si contenderebbero parole più precise ). Per contesa intendo quanto segue: si utilizza il singolo ramo per servire contemporaneamente due scopi: integrazione e rilascio. Quando si avvicina il rilascio, questi due scopi iniziano a scontrarsi tra loro, spingendo per requisiti contrastanti: lo scopo dell'integrazione è meglio servito con un ramo sempre aperto ( Unisci presto e spesso ) mentre i benefici di stabilità del rilascio sono sigillati dal ramo(isolato) il più a lungo possibile. A-ha sembra che le parti del puzzle inizino ad essere abbinate ...

... Guarda, quel congelamento del lunedì ora sembra un compromesso fatto per servire a scopi contrastanti: gli sviluppatori soffrono di un blocco di nuova integrazione di codice mentre i tester soffrono di questo blocco essendo troppo breve, tutti sono un po 'infelici ma entrambi gli scopi sono più o meno serviti.

Sai, dato sopra penso che la tua scommessa migliore sarebbe provare a rilasciare da un ramo dedicato (diverso dall'integrazione) . Che questo ramo sia longevo come l'integrazione o di breve durata come i tuoi rami di funzionalità (con "feature" che è, beh, rilascio) - dipende da te, deve solo essere separato.

Basta pensarci. Attualmente trovi che un giorno non è abbastanza per stabilizzare comodamente il rilascio, giusto? con la nuova strategia di branching, puoi semplicemente fork 2 giorni prima del rilascio invece di uno, nessun problema. Se ritieni che anche due giorni non siano sufficienti, prova a fare il fork 3 giorni prima, ecc. Il fatto è che puoi isolare il ramo di rilascio appena vuoi perché ciò non bloccherà più l'unione del nuovo codice con il ramo di integrazione. Nota in questo modello, non è necessario congelare affatto il ramo di integrazione: i tuoi sviluppatori possono utilizzarlo continuamente , lunedì, martedì, venerdì, qualunque cosa.

Il prezzo che paghi per questa felicità è una complicazione degli hotfix. Dovrebbero essere fusioni in due rami anziché in uno (rilascio + integrazione). Questo è ciò su cui dovresti concentrarti quando collaudi un nuovo modello. Tieni traccia di tutto ciò che è correlato - sforzi extra che dedichi alla fusione con il secondo ramo, sforzi legati al rischio che si possa dimenticare di fondersi con il secondo ramo - tutto ciò che riguarda.

Alla fine del test, basta aggregare ciò che è stato tracciato e scoprire se la quantità di questo sforzo extra è accettabile o meno. Se è accettabile, il gioco è fatto. Altrimenti, torna al tuo modello attuale, analizza ciò che è andato storto e inizia a pensare a come altrimenti puoi migliorare.


Update2

<copia dai commenti>

Il mio obiettivo è quello di ottenere storie testate e realizzabili (dietro o davanti a un muro di configurazione) all'interno di un'iterazione, questo può essere raggiunto solo se i tester stanno testando il lavoro eseguito in iterazione (e non stabilizzando il codice dall'iterazione precedente).

</ copia dai commenti>

Vedo. Beh, non ho esperienza diretta in quel modo, ma ho visto test di tipo in iterazione eseguiti con successo in un progetto correlato al nostro. Dato che il nostro progetto stava seguendo la strada opposta, ho avuto anche un lusso di confronto faccia a faccia per questi approcci opposti .

Dal mio punto di vista, l' approccio di test fuori iterazione sembrava superiore in quella razza. Sì, il loro progetto è andato bene e i loro tester hanno rilevato bug più velocemente dei nostri, ma in qualche modo questo non ha aiutato. Anche il nostro progetto è andato bene e, in qualche modo, potevamo permetterci iterazioni più brevi di loro, e avevamo meno (molto meno) rilasci di loro e c'era meno tensione tra dev e tester al nostro fianco.

A proposito, nonostante il rilevamento più veloce al loro fianco, siamo riusciti ad avere la stessa durata media dei bug (la durata è il tempo tra introduzione e correzione , non tra introduzione e rilevazione). Probabilmente abbiamo anche avuto un leggero vantaggio qui poiché con iterazioni più brevi e versioni meno slittate potremmo affermare che in media le nostre correzioni raggiungono gli utenti più velocemente delle loro.

Riassumendo, credo ancora che l'isolamento del codice di rilascio abbia maggiori possibilità di migliorare la produttività del team.


su un ulteriore pensiero ...

  • l'isolamento del codice di rilascio presenta maggiori possibilità : rileggendolo, ritengo che ciò possa farti credere di scoraggiarti dal provare i test in iterazione . Vorrei chiarire perfettamente di no.

Nel tuo caso l'approccio del test in iterazione sembra sicuro da provare (ehm ... test ) perché sembra che tu abbia una chiara comprensione di come raggiungerlo ( pipeline di test regolare ) e quali sono i principali ostacoli. Dopotutto, hai sempre la possibilità di tornare a un approccio alternativo se trovi troppo difficile ottenere quella pipeline giusta.

A proposito di ostacoli, altri che vale la pena tenere traccia in quel caso saranno problemi come la mancata riproduzione del bug sul lato sviluppo e in ritardo per trovare / in ritardo per verificare la correzione sul lato tester. Anche questi potrebbero bloccare la pipeline , come accade ora con gli aggiornamenti rapidi.


1
Grazie per i tuoi approfondimenti. Per quanto riguarda la ramificazione abbiamo testato un no. di approcci (e in effetti ho usato un numero @ diverse organizzazioni nella mia carriera). Abbiamo optato per un master pulito che rappresenti il ​​codice in produzione, un ramo di integrazione (basato su master) che tutti gli sviluppatori inseriscono frequentemente (idealmente più volte al giorno). Il ramo di integrazione viene creato e testato continuamente, con frequenti implementazioni automatizzate di gestione temporanea. Ho provato la linea principale sporca con grande successo prima. Il nostro approccio attuale sembra più controllato. Utilizziamo muri di configurazione per funzionalità incomplete e indesiderate.
Ben

1
@maple_shaft bene la prima volta che ho visto bug aperti in tracker contro la suite di test è stato nel 2002 o 2003. E sembrava essere una pratica abbastanza consolidata nel team a cui mi sono unito allora. Per quanto riguarda i bug che colpiscono le differenze tra prod e messa in scena, questi in effetti mi sembrano nuovi poiché la prima volta che l'ho visto (e sono rimasto davvero sorpreso) è stato meno di 2 anni fa
moscerino

1
@gnat, sembra un buon senso ed è per questo che mi chiedo perché non ne abbia mai sentito parlare prima. Ora che ci penso, anche se ha senso, perché ogni gruppo di controllo qualità con cui abbia mai lavorato mi è sembrato perfettamente felice di dare il via agli insetti, ma è diventato piagnucolone di due anni ogni volta che gli insetti venivano portati contro di loro.
maple_shaft

1
@maple_shaft lol concorda che questo modo sembra essere immeritatamente raro. Sapevi che si possono lanciare bug non solo sui tester ma anche su scrittori di documenti / specifiche? - Build 12 of Dev Guide dice "black" a pagina 34 linea 5; dovrebbe essere "bianco". - Assegnato a John Writer. - Risolto nella build 67. - Risolto il problema verificato nella build 89 da Paul Tester.
moscerino del

1
La mia ultima risposta non voglio trasformarmi in una sessione di chat, ma nella mia ultima organizzazione ho scritto un bug contro uno scrittore di specifiche e l'intera divisione si è ritratta in un momento WTF. Mi è stato prontamente detto che avevo un "problema di atteggiamento" e che non ero un "giocatore di squadra" e di non farlo di nuovo.
maple_shaft

8

Senza conoscere la natura delle storie degli utenti e il loro numero, devo dire che un ciclo di rilascio di 1 settimana sembra estremo. Lo scenario sopra descritto è stato pianificato in modo complesso e coinvolge una serie di diversi rami, unisci punti, hand-off, ambienti e suite di test, creando più o meno un sistema umano in cui un singolo errore nella complessità del piano può causare il rilascio tardivo o pessima qualità. Ciò può avere un effetto domino sulle versioni successive.

IMHO il programma è troppo dannatamente stretto.

È possibile aumentare la copertura del codice scrivendo test unitari più efficaci e anche test di integrazione specifici per l'ambiente.

È possibile aumentare la qualità del codice introducendo la programmazione di coppia e / o la revisione del codice, sebbene ciò si esaurisca in momenti ancora più preziosi.

Una migliore stima dei punti relativi alle storie degli utenti può anche aiutare limitando implicitamente le storie degli utenti in un'unica versione, riducendo così il denominatore sul rapporto di rischio.

Nel complesso, sembra che abbiate buone pratiche in atto e che abbiate un buon sistema per gestire il vostro ciclo di rilascio estremo. Sembri essere sulla strada giusta.


Sì! Una settimana con un grande prodotto in un linguaggio compilato che necessita di ventosi test di integrazione non è continua, è estenuante . Continuate così troppo e sperimenterete la mortalità per lavoro!
ZJR,

+1; stiamo eseguendo iterazioni di tre settimane al momento e scoprendo che funziona bene.
Duncan Bayne,

@ZJR, per favore, puoi approfondire ciò che intendi estenuando in questo contesto?
Ben

@Duncan, le nostre iterazioni sono di 2 settimane, ma stiamo provando incrementi di una settimana . Questo potrebbe essere o non essere possibile / una cattiva idea. L'idea è che un incremento di una settimana conterrà meno nuovo codice e quindi conterrà meno problemi.
Ben

1
@Ben Aston, La quantità di codice non crea problemi, scadenze non realistiche, stress e aspettative elevate creano problemi.
maple_shaft

1

Perché non utilizzare la distribuzione continua effettiva, in cui un commit (o push) provoca l'esecuzione dei test e, se i test passano, si verifica una distribuzione?

Quindi, se non si è sicuri di una modifica, lo si fa su un ramo separato, che provoca comunque l'esecuzione dei test ma nessuna distribuzione.

Penso che ci sia più stress nel cercare di ottenere un baule / master rotto alla stabilità di quanto non lo sia, sai, solo per mantenerlo stabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.