Gestione del rilascio mercuriale. Rifiutare le modifiche che non riescono a testare

7

Ricerca sulla gestione del controllo del codice sorgente distribuito (specificamente mercuriale). La mia domanda è più o meno qual è la procedura migliore per rifiutare interi set di codice che non riescono a testare?

Esempio:

Un team sta lavorando a un programma Hello World. Hanno tester e una versione programmata che prevede funzionalità specifiche pianificate.

Upcoming Release:
   Add feature A
   Add feature B
   Add feature C

Quindi, gli sviluppatori fanno i loro cloni per le loro caratteristiche, fanno il lavoro e li uniscono in un repo di controllo qualità per i tester da esaminare.

Supponiamo che i tester riportino che "la caratteristica B è incompleta e in effetti pericolosa" e vorrebbe ripetere il test A e C.

Fine esempio.

Qual è il modo migliore per fare tutto questo in modo che la funzione B possa essere facilmente rimossa e si finisce con un nuovo repository contenente solo le funzioni A e C unite insieme?

Ricrea il repository di prova? Ritornare B? Altre magie?

    
posta CrazyPenguin 12.06.2012 - 17:46
fonte

3 risposte

6

La chiave qui è di creare un flusso di lavoro che eviti la situazione in cui il codice "cattivo" viene mai esposto a sviluppatori o team diversi da quelli che lo hanno creato. Se ciò dovesse accadere, un buon codice verrebbe mischiato a male, e "scomparire" o districarli sarà difficile. Quindi, evita che ciò accada in primo luogo.

Suppongo che HelloWorld in questo esempio sia il repository principale, che contiene un buon codice noto. Gli sviluppatori A, B e C clonano tutti da questo repo e sviluppano le loro modifiche contro di esso. Nel modello che sto descrivendo, HelloWorld-test è un repository temporaneo utilizzato esclusivamente dal QA per testare le modifiche unite prima di spostarle nella linea principale. Gli sviluppatori non guardano mai al test HelloWorld. Ecco come funziona.

  • A, B e C tutti clonano un buon codice dalla linea principale (HelloWorld).

  • A apporta modifiche e dice a QA che è pronta (o A spinge le sue modifiche a un repository temporaneo). Il clone del QA è mainline, estrae e unisce le modifiche di A, quindi costruisce e verifica. Supponendo che tutto ciò sia andato a buon fine, il controllo qualità accolla queste modifiche nella riga principale.

  • B ora rende disponibili le sue modifiche. QA clona la riga principale e quindi estrae e trasforma le modifiche di B in HelloWorld-test. Continuando con il tuo esempio, diciamo che questi cambiamenti sono pessimi. Quindi l'unione di QA fallisce, o la compilazione fallisce, o i test falliscono, o qualcosa del genere. A questo punto, il QA dichiara che le modifiche sono errate, notifica B e semplicemente elimina il test HelloWorld. Ora è responsabilità di B estrarre e unire da mainline, correggere errori di test o qualsiasi altra cosa.

  • QA può quindi eseguire il processo con C, partendo da un nuovo clone di mainline e unendo le modifiche di C. Nota che le cattive modifiche di B non hanno mai raggiunto la linea principale e quindi le modifiche di C (o di chiunque altro) non verranno mai mixate con esse.

  • A un certo punto B ha aggiustato le sue modifiche e chiede al QA di fare un altro pull / merge / build / test. Il QA può farlo in seguito, oppure possono semplicemente aggirare il ciclo di diversi sviluppatori o team finché non tornano in B.

Questo è spesso chiamato un "modello di attrazione" dello sviluppo. Credo che le modifiche al kernel di Linux siano gestite in questo modo.

In molti casi non è "QA" chi fa il ciclo pull / merge / build / test, ma invece è fatto da un sistema di integrazione continua come Hudson o Jenkins.

Naturalmente, ci sono molte varianti di questo, indipendentemente dal fatto che singoli sviluppatori o team dispongano di repository temporizzati, se le modifiche siano propagate tramite push o pull, ecc. Ma dovrebbero condividere tutte queste caratteristiche chiave:

  1. Solo le buone modifiche conosciute lo fanno nella linea principale.

  2. Gli sviluppatori estraggono / clonano solo dalla linea principale, quindi non basano mai il loro lavoro su modifiche errate.

  3. Le nuove modifiche vengono unite, costruite e testate separatamente da tutto il resto e vengono verificate correttamente prima di essere unite nella linea principale.

risposta data 13.07.2012 - 18:42
fonte
1

Puoi utilizzare code di patch per selezionare le cose che arrivano, oppure puoi usare hg backout per rimuovere i cambiamenti di un solo changeset (vedi il libro hg e cerca "hg backout" qui ).

La differenza è che le code di patch consentiranno a B di non apparire mai nella cronologia.

OTOH, potresti stare meglio incoraggiando "feature branch" per entrambe le funzionalità e le correzioni di bug, quindi seleziona quali rami integrare alla baseline.

    
risposta data 13.06.2012 - 16:44
fonte
0

La soluzione migliore è quella di sottoporre a test il codice prima che venga eseguito il commit. Ritirare B è la soluzione migliore, se non puoi farlo.

Il backset di changeset è il processo di applicazione della patch inversa di quel changeset. Per estensione, puoi eseguire il backout di una serie di changeset applicando l'inverso della patch di tutti i changeset. Questa dovrebbe essere la metodologia predefinita di "ripristino" di una modifica o di una serie di modifiche poiché manterrà la coerenza e la completezza del repository.

hg pull
hg up # Now your working directory and local repo are up to date
hg up -r revLast # Update to the latest revision you want to backout
hg revert -a -r revFirst-1 # Creates an inverse patch of revFirst to revLast
hg ci -m "Backed out revFirst - revLast" # Commit inverse patch
hg merge # Merge inverse patch to tip in my working directory
hg ci -m "Merged change back into the tip" # Commit inverse patch to tip in local repo
hg push # Push to master
    
risposta data 12.06.2012 - 20:38
fonte

Leggi altre domande sui tag