2011-01-06 16 views
5

Dopo ogni commit in 'trunk', eseguiamo automaticamente una serie di test contro il trunk. Quando passeranno questi test, mi piacerebbe un'unione automatica in un ramo chiamato 'test-passati'. Quando i test falliscono, non dovrebbe verificarsi un'unione, ma una volta che il problema è stato risolto su "trunk" al commit successivo o successivo, tutte le modifiche devono essere unite.Come faccio a svn automaticamente quando i test automatici passano?

Il punto è di avere un ramo che abbia lo stesso contenuto del trunk, ma che è solo un po 'più sano di "trunk" perché almeno i test automatici sono passati.

Ho uno script che tenta di farlo manualmente ma è un hack che utilizza proprietà personalizzate che non sempre funzionano correttamente, come ho appena scoperto. Come faccio a fare in modo che Subversion faccia questo?

+0

Come pensate di gestire i conflitti di unione? – Steve

+1

Non penso ci dovrebbero essere conflitti di fusione: 'tests-passed' ha sempre lo stesso contenuto di 'trunk', tranne quando HEAD su 'trunk' non supera i test, nel qual caso ha lo stesso contenuto di 'trunk' l'ultima volta che i test sono passati. –

risposta

5

eseguire questi comandi alla radice di una copia di lavoro di test-passati ogni volta che si è stabilito che un nuovo tronco di revisione <somerev> ha superato le prove:

svn update 
svn merge http://example.com/svn/myproject/trunk -r 0:<somerev> 
svn commit -m "merged trunk revisions up to <somerev> into tests-passed" 

Ogni volta che si utilizza il comando merge, SVN registreranno l'unione nella proprietà svn:mergeinfo. Pertanto, il comando precedente dovrebbe determinare automaticamente quali revisioni nell'intervallo 0:<somerev> sono idonee per la fusione, escludendo eventuali fusioni già eseguite.

Come hai detto in un commento, non sono previsti conflitti. Ma a volte ho notato che si verificano comunque conflitti imprevisti durante l'unione di un intervallo di revisioni SVN contenenti rinomina. Per eliminare questi conflitti, è possibile utilizzare l'opzione --accept theirs-full con il comando di unione per accettare sempre lo stato del trunk.

+0

Ah, il "determinare automaticamente quali revisioni ... sono idonee" è bello, non lo sapevo. Pensavo di doverlo analizzare in qualche modo da solo, il che suonava brutto. Come suggerisco di trovare ? Ho provato 'svnversion trunk', o deve essere +1? –

+0

@Johannes: non è necessario essere +1. Ad esempio, se l'ultima build di successo è per la revisione 100, puoi unire '-r 0: 100'. –

0

Immagino di usare la suite di test per farlo.

Nella mia esperienza eseguivo uno script ANT per testare il mio codice e ho un condizionale finale per eseguire il ramo se i test hanno avuto esito positivo.

+0

Effettuiamo effettivamente i test con formica, e abbiamo una condizione finale proprio come dici tu. La domanda è: come faccio a fare la fusione giusta svn basandoci su quella condizione? –

+0

Ragazzi seguite lo Name_spacing con ogni nuovo codice. (version_ versioning) potrebbe aiutare in questa situazione. – NaV

+0

Ahem? Non ho idea di cosa tu stia parlando ... –

1

È possibile utilizzare uno strumento di integrazione continua per questo. Uno abbastanza popolare: Hudson

http://hudson-ci.org/

Puoi script che tipo di comportamento lì.

+0

Ancora una volta, la mia domanda riguarda la parte svn di esso, non la parte di programmazione o di scripting. A meno che Hudson non abbia qualche magia svn che non conosco?(Il nostro setup qui usa Hudson per eseguire build e test in risposta ai check-in su "trunk") –

Problemi correlati