2012-05-01 12 views
12

Stiamo migrando da CruiseControl.NET a Jenkins solo per essere sincronizzati con un partner, quindi non abbiamo due script CI diversi. Stiamo cercando di impostare Jenkins per fare qualcosa di simile a ciò che abbiamo fatto con CruiseControl, in cui un server centralizzato ha richiamato progetti (lavori in jenkins) su macchine di compilazione remote.Può un maestro jenkins eseguire lavori su jenkins remoti?

Abbiamo più macchine di generazione associate ad un singolo progetto, quindi quando costruiamo il progetto dal server CI centralizzato invocherà i progetti sui server CI remoti. I server CI remoti estrarranno la versione dal progetto server CI centralizzato.

Nel controllo CruiseCruise abbiamo impostato un progetto che avrebbe eseguito un forceBuild sui progetti remoti. I progetti sulle macchine di generazione hanno utilizzato un remoteProjectLabeller per recuperare il numero di versione in modo che fossero sempre sincronizzati.

Per recuperare il numero di master di generazione:

<labeller type="remoteProjectLabeller"> 
    <project>MainProject</project> 
    <serverUri>tcp://central-server:21234/CruiseManager.rem</serverUri> 
</labeller> 

per invocare il progetti remoti:

<forcebuild> 
    <project>RemoteBuildMachineA</project> 
    <serverUri>tcp://remote-server:21234/CruiseManager.rem</serverUri> 
    <integrationStatus>Success</integrationStatus> 
</forcebuild> 

Finora nel Jenkins Ho installato un server secondario come slave utilizzando il Java Web Start ma non so come avrei fatto il maestro jenkins a invocare l'installazione dei progetti sugli schiavi.

Posso impostare Jenkins per richiamare progetti (lavori) su slave?

Posso fare in modo che gli slave estraggano il numero di versione dal master?

EDIT -

Permettetemi di aggiungere un po 'di informazioni.

  • Il master e gli schiavi della macchina di compilazione remota sono tutti in esecuzione su Windows.
  • Abbiamo fatto in modo che il master centrale CruiseControl avvii contemporaneamente i progetti remoti in modo che funzionino contemporaneamente e, se possibile, vorrebbe avere la stessa cosa con jenkins.

risposta

9

Jenkins ha il concetto di build agents, che potrebbe forse adattarsi meglio al tuo scenario: c'è un master che attiva la build e gli slave che lo eseguono. Una build può quindi essere limitata solo ad alcune categorie di slave (ad es. Se dipende da un software specifico, non presente su tutti gli agenti). Tutti i dati sono gestiti centralmente dal master, che credo sia quello che stai cercando di ottenere.

+0

+1 sì, stavo pensando alla configurazione in una mentalità Cruise Control. Grazie. –

5

In Jenkins non è possibile attivare una build su uno slave, ovvero dove una build viene eseguita non è controllata da chi lo fa scattare. È controllato dalle impostazioni del lavoro stesso. Ogni lavoro ha un'impostazione chiamata "Limita dove può essere eseguito questo lavoro".

Nel tuo caso probabilmente avresti due lavori: A e B. A sarebbero limitati per l'esecuzione su "master" e B sarebbe configurato per l'esecuzione su "slavename". Quindi tutto ciò che resta da fare è che A inneschi B.

Ma avevi ulteriori vincoli: vuoi che A e B controllino la stessa versione dal controllo di versione e vuoi che A e B funzionino in parallelo. Ci sono molti modi per farlo ma il più semplice è probabilmente definire un lavoro multi-configurazione.

Non è possibile trasformare un lavoro in stile libero esistente in un processo con più configurazioni, quindi sarà necessario creare un nuovo lavoro.

  • Scegliere Nuovo lavoro
  • scegliere Genera nuovo progetto multi-configurazione. Aggiungi un nome.
  • In Matrice di configurazione, aprire il menu a discesa "Aggiungi asse".
  • Scegliere Schiavi
  • Controllare padrone e lo schiavo
  • aggiungere le informazioni SCM e costruire passo (s)

Quando il lavoro viene eseguito, funziona sia su master e slave. Jenkins si assicura che costruisca dalla stessa versione di origine.

+2

* In Jenkins non è possibile attivare una build su uno slave, cioè dove una build viene eseguita non è controllata da chi lo fa scattare * - questo non è corretto al 100%. Puoi specificare l'etichetta del nodo come parametro con [Plug-in Node Label Parameter] (https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin) e poi usare il valore di quel parametro in * Restrizione dove questo lavoro può eseguire * campo. –

+0

Ho configurato un ambiente di prova con tre VM, a, be c. A è il padrone, bec sono gli schiavi. Ho creato un lavoro multi-configurazione e sotto la matrice di configurazione seleziono solo il nodo b perché voglio solo che venga eseguito su quella VM. Tuttavia, quando eseguo la build, la eseguo dal master. Perchè è questo? Mi aspetto che venga eseguito sul nodo che ho selezionato. –

+0

@AndyArismendi, sei sicuro? Vai al lavoro, seleziona l'ultima build. Mostrerà piccole palline corrispondenti alle build del tuo bambino (forse solo una, se hai una sola build di figlio, quindi dirà 'default' accanto ad essa). Le palle saranno blu, rosse o grigie, a seconda dello stato. Clicca su una delle palle non grigie. Questo è lo stato di compilazione del tuo bambino. Il bambino dovrebbe funzionare su schiavo 'b'. Il lavoro di primo livello, d'altra parte, può essere eseguito ovunque (a meno che non sia legato a un nodo con un plinto principale Matrix Tie). –

0

Dall'URL/jenkins/computer, è possibile aggiungere, rimuovere e riconfigurare i "nodi" che sono "build agent" locali o remoti.

I lavori possono quindi essere vincolati per essere eseguiti su particolari agenti di creazione o seguire varie regole per selezionare l'agente di generazione appropriato tra gli agenti disponibili.

+0

Mi dispiace, ma sembra che tu non stia dicendo nulla di nuovo da ciò che è stato già fornito nelle risposte precedenti. –

0

Stavo pensando a Jenkins troppo simile a CruiseControl in cui il lavoro è definito sulla macchina remota. Quindi in Jenkins i progetti remoti sono definiti sul master e delegati a una macchina remota tramite un agente.

Ho utilizzato l'agente Java Web Start installato come servizio Windows sui computer remoti. Per eseguire processi specifici su macchine remote specifiche, ho definito ciascun nodo remoto con un'etichetta univoca nella sua configurazione slave. Per associare lavori specifici a specifici slave, ho usato l'etichetta dello slave in ogni configurazione di lavoro ("Limita dove è possibile eseguire questo progetto").

Per attivare i lavori con un singolo processo principale, ho creato un lavoro stile libero impostato solo su "Crea altri progetti" e fornito un elenco separato da virgole o nomi di progetto. Questo lavoro crea parallelamente i lavori a valle.

Sto ancora cercando un modo per inviare un numero di build principale ai processi downstream per tenerli sempre sincronizzati. (Questo è usato per le DLL di versione e così via.)

Problemi correlati