2011-11-23 1 views
5

Stiamo avendo due costruisce A e B, dove Un è un software che dipende dalla biblioteca B. Entrambi sono progetti Qt. Jenkins esegue il polling del SCM ogni 15 minuti. A volte capita che mi impegno A e B ma il timer di A termina prima che il timer di B. Quindi l'applicazione viene creata con una vecchia libreria, che causa il fallimento della compilazione. Ora sto cercando un modo per dire a Jenkins che B deve essere costruito prima della creazione di A inizia. Tuttavia, è possibile creare solo qualcosa dopo il una build di successo.Crea sempre una libreria prima dell'applicazione in Jenkins?

C'è una soluzione semplice o abbiamo appena incasinato il nostro processo di compilazione?

+0

come stai gestendo la dipendenza tra A e B? svn: esterni, Maven, Ivy, su misura? –

+0

@tom Entrambi i progetti vivono in diversi repository git. – atamanroman

+0

quindi quando A costruisce, come ottiene la libreria B? –

risposta

0

Sotto Opzioni avanzate nel lavoro Una configurazione, selezionare blocco generazione quando progetto a monte sta costruendo. E fare un lavoro A dipende dal lavoro B.

+1

Questo fermerebbe A dall'edificio se B sta costruendo, ma non risolverebbe il problema dove A è stato attivato prima di B. –

+0

Grazie per il chiarimento @Tom. Suppongo di aver pensato che il problema del timer potesse essere risolto con un periodo di silenzio per A per garantire che B venisse attivato. –

2

Ci sono alcuni bug aperti in Jenkins relativi ai riferimenti di progetto e ordine di costruzione incasinato. Vedi this bug (or this one). Vedi i commenti per possibili soluzioni alternative.

2

Se si passa a Apache Ivy per la gestione delle dipendenze, si può avere un innescato, ogni volta che si pubblica una nuova versione di B (utilizzando il Jenkins Ivy Plugin), ipotizzando che A dipende dalla latest.integration (o simile) di B.

Questo non fermerà A dall'edificio contro una vecchia versione di B, ma almeno si ricostruirà automaticamente quando B è finito.

Inoltre, considerare le impostazioni fino post receive hooks-trigger Jenkins, e l'aggiunta di un quiet period ad A. Poi, quando si preme modifiche a A e B, sia A che B saranno attivati ​​immediatamente, ma sarà una aspettare un po 'prima di costruire. Quando scade il periodo di silenzio di A, è possibile utilizzare l'opzione Block build when upstream project is building per forzare l'attesa fino al completamento di B.

Infine, quando utilizzi Ivy per un po ', probabilmente arriverai alla stessa conclusione di molti altri: non vuoi A in base allo latest.integration di B, ma invece a una versione specifica. Permette build deterministiche e semplifica la configurazione del job CI (solo build A quando è il codice (che include la versione di B dipende da) cambiamenti), ma è necessario venire a questa realizzazione da soli, nel proprio tempo.

BTW anche se Ivy è molto focalizzato su Java, l'ho usato con successo su progetti non java; non essere rimandato.