2010-01-18 21 views
10

Abbiamo impostato CruiseControl.NET per l'integrazione continua di un certo numero di nostri progetti.Possiamo dire a CruiseControl.NET di ignorare gli errori di timeout del controllo sorgente?

Stiamo utilizzando un blocco <cb:define> per assicurarsi che tutte le nostre operazioni di controllo del codice sorgente siano eseguite allo stesso modo e per mantenere la configurazione DRY.

Ogni tanto riscontriamo un problema che causa la generazione di mostrare "Eccezione". Il messaggio è il seguente:

ThoughtWorks.CruiseControl.Core.CruiseControlException: Source control operation has timed out. 
    at ThoughtWorks.CruiseControl.Core.Sourcecontrol.ProcessSourceControl.Execute(ProcessInfo processInfo) 
    at ThoughtWorks.CruiseControl.Core.Sourcecontrol.Svn.GetModifications(IIntegrationResult from, IIntegrationResult to) 
    at ThoughtWorks.CruiseControl.Core.Sourcecontrol.QuietPeriod.GetModifications(ISourceControl sourceControl, IIntegrationResult lastBuild, IIntegrationResult thisBuild) 
    at ThoughtWorks.CruiseControl.Core.IntegrationRunner.GetModifications(IIntegrationResult from, IIntegrationResult to) 
    at ThoughtWorks.CruiseControl.Core.IntegrationRunner.Integrate(IntegrationRequest request) 

La sezione comune di configurazione è la seguente:

<sourcecontrol type="svn"> 
    <trunkUrl>http://ourserver/svn/$(project-svn-path)/trunk/</trunkUrl> 
    <executable>C:\Program Files\CollabNet Subversion Server\csvn.exe</executable> 
    <username>user</username> 
    <password>password<password> 
    <revert>true</revert> 
</sourcecontrol> 

vorrei ignorare questo errore specifico, se possibile.

Quali modifiche devo apportare?

+0

Sicuramente se si ignora un timeout del controllo dell'origine, non si costruisce in modo affidabile la revisione più recente e la build di "integrazione continua" non ha senso? –

+0

@David M: Bene, questo di solito accade durante una finestra SLA quando il server SVN si ferma per manutenzione. Questa non è una circostanza eccezionale, quindi mi piacerebbe ignorare il problema se succede per meno di qualche ora. –

+0

Abbiamo un server svn ospitato su Internet e una connessione Internet traballante. Ogni volta che la connessione si interrompe, abbiamo una build fallita, che non è utile a tutti. Quindi grazie per la domanda. –

risposta

16

Ecco un blocco che uso per prevenire questi tipi di errori che riguardano lo stato di generazione:

<maxSourceControlRetries>5</maxSourceControlRetries> 
<stopProjectOnReachingMaxSourceControlRetries>true</stopProjectOnReachingMaxSourceControlRetries> 
<sourceControlErrorHandling>ReportOnRetryAmount</sourceControlErrorHandling> 

Hai bisogno di mettere questi proprio sotto il tag <project>, non il <sourcecontrol>. Non sono sicuro che sarete in grado di ignorare solo l'eccezione "scaduta", tuttavia tutte le eccezioni SVN verranno trattate allo stesso modo.

UPDATE: è possibile trovare maggiori informazioni su queste impostazioni nel CC.NET documentation, ma mi permetta di copiare il materiale in questione:

maxSourceControlRetries: L'importo massimo di eccezioni controllo del codice sorgente in una fila che si può verificare, prima della il progetto passa allo stato di arresto (quando stopProjectOnReachingMaxSourceControlRetries è impostato su true).

stopProjectOnReachingMaxSourceControlRetries: arresta il progetto al raggiungimento di maxSourceControlRetries o meno. Se impostato su true, il progetto verrà arrestato quando la quantità di errori di controllo del codice sorgente consecutivi è uguale a maxSourceControlRetries.

sourceControlErrorHandling: azione da eseguire quando si verifica un errore di controllo del codice sorgente (durante GetModifications). Questi sono i valori possibili:

  • ReportEveryFailure: corre sezione dell'editore ogni volta che c'è un errore
  • ReportOnRetryAmount: esegue solo la sezione dell'editore quando è stato raggiunto maxSourceControlRetries, sezione dell'editore verrà eseguito solo una volta.
  • ReportOnEveryRetryAmount: esegue la sezione del publisher ogni volta che è stato raggiunto maxSourceControlRetries. Quando è stato raggiunto maxSourceControlRetries e la sezione del publisher è stata eseguita, il contatore è impostato su 0.
+0

Contrassegnerò questo come accettato, anche se non ho un modo per testarlo necessariamente. Potresti farmi un favore e spiegare ognuna di quelle voci? –

+0

Ho aggiornato la risposta con alcuni documenti CC.NET. Diciamo solo che ho avuto lo stesso problema con i timeout SVN (di solito durante la notte) e spesso lo stato della build è stato contrassegnato come "Eccezione" a causa di esso. Dopo aver giocato un po 'con queste impostazioni, ho optato per quelle che ho postato qui e non ho avuto problemi dopo. Si potrebbe voler giocare con questi stessi (aumentando il numero di tentativi, per esempio). –

+0

Sto usando la stessa configurazione - purtroppo, non risolve il problema. Il mio amministratore di rete ha una cattiva abitudine di rompere la rete a intervalli casuali, che contrassegna tutta la nostra build rossa fino a quando qualcuno costringe manualmente una build. – skolima

8

Non è possibile solo aumentare il valore di "timeout"?

<sourcecontrol> 
    ... 
    <timeout>60000</timeout> <!-- timeout in milliseconds --> 
    ... 
</sourcecontrol> 
+0

Il problema si verifica in genere durante la notte, quando il server è effettivamente inattivo o qualcosa del genere. –

+4

Grazie. Ciò mi ha aiutato a risolvere il problema. Anche se abbiamo dovuto usare 1 ci hai indicato nella giusta direzione. +1 a te. – David

+0

@David Il commento ha funzionato per me, grazie! – Holger

0

In aggiunta alla risposta accettata. Ho trovato che ci ha aiutato molto usando il trigger dell'URL.

<triggers> 
    <urlTrigger url="http://url.to.your.svn.server" /> 
</triggers> 

Quindi, se il server non è raggiungibile, CCNet non invierà una build. Questo ha effettivamente ridotto la possibilità di guasti.

Link to Documentation of URI Trigger.

Aggiornamento: non abbiamo mai avuto un singolo errore falso causato dal problema di connettività del server svn dopo che la linea precedente era in vigore da quasi 2 mesi.