2012-08-07 15 views
7

Sto provando a migrare uno script Ant che ho scritto per creare e distribuire progetti all'interno del framework Jenkins (invece di essere attivato da un hook post-commit SVN, che era il modo più appropriato con cui inizialmente ci si avvicinava alle cose). Tutto è grande, tranne che ho bisogno di mettere in scena i file per il passo di distribuzione e voglio inserirli nella directory 'build' creata da Jenkins per il lavoro (e dato che il mio build.xml vive in una posizione non specifica del progetto, $ { basedir} e $ {user.dir} non puntano alla posizione desiderata).Come determinare la directory di costruzione di Jenkins da Ant?

all'interno della configurazione Jenkins, ho installato il seguente:

[Jenkins] Corporatura Record Directory principale: E:/build/$ {} ITEM_FULLNAME

[Job-Specific] build : C: \ vc-tools \ shadow \ build.xml

durante l'esecuzione di una build, lo script viene lanciato in modo appropriato e viene creata una directory di creazione specifica del lavoro, ad es.

E: \ costruisce \ Test \ 2012-08-07_12-51-21

voglio arrivare a questa cartella dall'interno del script di build, ma non riesco a capire come. alcune delle cose che ho provato:

[echo] ${basedir}: C:\vc-tools\shadow 
[echo] ${user.dir}: C:\vc-tools 
[echo] ${env.workspace}: C:\Program Files (x86)\Jenkins\workspace\Test 
[echo] ${env.build_id}: 2012-08-07_12-51-21 
[echo] ${jenkins_home}: C:\Program Files (x86)\Jenkins 
[echo] ${BuildDir}: E:/builds/${ITEM_FULLNAME} 

NOTA: Per che l'ultimo, ho provato passando:

BuildDir=E:/builds/${ITEM_FULLNAME} 

come una proprietà configurata dal lavoro entro Jenkins (chiaramente $ {} espansione non ha luogo in questo contesto).

in base allo documentation, non ci sono variabili d'ambiente specifiche che sono impostate sul percorso completo della directory di compilazione - Posso fonderlo codificando E: \ builds root e virando su $ {env.build_id}, ma è stato sperando che ci sarebbe un modo più semplice per accedere al percorso completo da qualcosa che Jenkins espone (sia una proprietà Ant che una variabile di ambiente) per rendere lo script più flessibile.

Sto usando la versione 1.476 di Jenkins.

grazie

+0

Sembra che tu stia facendo qualcosa di molto strano, che non capisco del tutto. Perché il file build.xml non si trova nella directory principale del progetto che stai creando? Normalmente basta configurare Jenkins per estrarre i file di progetto dal sistema SCM e quindi eseguire la build ... Tutto ciò avviene all'interno dello "spazio di lavoro" che Jenkins gestisce per quel lavoro di costruzione. –

+0

Perché hai bisogno della directory? Potresti usare i percorsi relativi in ​​modo sicuro –

+0

@ MarkO'Connor: - Ho uno script generico che può essere sfruttato per diversi progetti (esiste un file di proprietà specifico del progetto che lo script abbassa per qualificare ciò che sta facendo, ma io non lo faccio Per ora, vediamo il valore nel copiare lo stesso file build.xml su più progetti simili). – rguilbault

risposta

11

E 'sempre una buona idea per il vostro progetto di avere una copia di esso è costruire la logica incluso insieme al codice sorgente. Rende la tua build più portabile tra le macchine.

Detto questo, è anche abbastanza comune impostare i file di build contenenti la logica di condivisione condivisa comune. ANT definisce i seguenti compiti per sostenere tale attività:

Quindi una possibile soluzione è quella di memorizzare un file build.xml semplice, nella radice della directory del progetto:

<project name="my project" default="build"> 

    <include file="C:\vc-tools\shadow\common-build-1.0.xml" as="common"/> 

    <target name="build" depends="common.build"/> 

</project> 

Note:

  • È consigliabile utilizzare un numero di revisione nel nome del file di build comune.Questo aiuta a preservare la retrocompatibilità con altre build usando la logica più vecchia.

Aggiornamento

Quando Jenkins viene eseguito un lavoro è imposta una serie di environment variables.

La seguente logica ANT stampa il percorso della directory di lavoro Jenkins:

<property environment="env"/> 

<target name="run"> 
    <echo message="Jenkins workspace: ${env.WORKSPACE}"/> 
    <echo message="Job directory: ${env.WORKSPACE}../../jobs/${env.JOB_NAME}"/> 
    <echo message="Build data: ${env.WORKSPACE}../../jobs/${env.JOB_NAME}/build/${env.BUILD_ID}"/> 
</target> 
+0

questo sembra che sarebbe molto utile. in realtà, sta creando alcuni ulteriori vantaggi oltre alla portata della mia domanda originale - grazie per il suggerimento! Lo accetterò come risposta una volta che avrò la possibilità di testare che fa ciò che prevedo che sarà (l'unica domanda che ho è se $ {basedir} o $ {user.dir} sarà uguale a $ {env.WORKSPACE} o la vera cartella 'build' creata da Jenkins) ... – rguilbault

+0

ok, quindi non riesco ancora a ottenere un riferimento alla directory di build, ma mi viene in mente ora che non ho bisogno di fare riferimento ad esso (contiene informazioni per quanto riguarda la build a cui interessa Jenkins, non deve essere l'obiettivo del mio progetto costruito). Detto questo, sarebbe conveniente utilizzarlo come area di sosta (lo scopo completo di ciò che devo fare, per ragioni legacy, è il checkout/aggiornamento dello spazio di lavoro da SVN, cercare i file modificati di recente e invocare un traduttore contro di essi per generare file oggetto: i file sorgente e oggetto risultanti devono quindi essere spediti in una posizione accessibile da SMB). – rguilbault

+0

... l'ubicazione dello spazio di lavoro è dove sta andando il checkout/aggiornamento, quindi non voglio metterlo a tacere con lo staging dei file (che, btw, ho dimenticato di menzionare devo inserire in una struttura ad albero diversa da come risiedono nel controllo del codice sorgente). Posso creare una gerarchia indipendente (e potrei) come E: \ staging \ $ {env.BUILD_TAG}, anche se Jenkins non lo pulirà automaticamente, come se fosse la directory di build che gestisce (speravo di creare una sottodirectory .staging in esso, che mi riporta alla mia domanda/post originale). – rguilbault

5

In questi giorni (. Jenkins v 1.484) target 'run' dalla risposta di cui sopra dovrebbe assomigliare a questo:

<target name="run"> 
    <echo message="Jenkins workspace: ${env.WORKSPACE}"/> 
    <echo message="Job directory: ${env.WORKSPACE}/../../${env.JOB_NAME}"/> 
    <echo message="Build data: ${env.WORKSPACE}/../../${env.JOB_NAME}/builds/${env.BUILD_ID}"/> 
</target> 
Problemi correlati