2015-05-29 8 views
7

Sto convertendo la nostra piattaforma CI da CruiseControl a Jenkins, e non riesco a capire qualcosa che sembra dovrebbe essere relativamente semplice a che fare (Disclaimer - io non sono CI o costruire esperto di automazione, ma questo è stato gettato in grembo e lo trovo interessante)Come dichiarare una variabile globale in Jenkins e usarla in un'attività MSBuild all'interno di ogni singolo progetto

In CruiseControl, sono in grado di dichiarare le variabili in questo modo:

<cb:define rootdir="J:\SOURCES\" /> 
<cb:define logdir="J:\SOURCES\buildlogs" /> 
<cb:define iisdir="J:\IIS\" /> 
<cb:define artifacts="artifacts\" /> 

Quindi utilizzarli come parte di un'attività MSBuild

<msbuild> 
     <executable>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</executable> 
     <workingDirectory>$(rootdir)$(ProjectName)</workingDirectory> 
     <projectFile>$(ProjectName).sln</projectFile> 
     <buildArgs>/p:BuildDate="1";OutDir="$(iisdir)$(ProjectName)\bin\\";WebProjectOutputDir="$(iisdir)$(ProjectName)\\"</buildArgs> 
     <targets>Rebuild;$(ProjectName)</targets> 
     <timeout>180</timeout> 
     <logger>C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger> 
</msbuild> 

Se la directory principale o IIS cambia, può essere facilmente applicata a tutti i progetti contemporaneamente. Abbiamo circa 60 progetti di installazione, quindi fare questo progetto per progetto richiederebbe molto tempo. Migrazione questo per Jenkins, gli argomenti della riga di comando di MSBuild ora apparire così (campione parziale ma comprende ciò che è rilevante):

OutDir="J:\IIS\ProjectName\bin\\";WebProjectOutputDir="J:\IIS\ProjectName\\" 

La directory IIS è difficile codificato. Ho bisogno che sia qualcosa di più:

OutDir="${IIS_DIR}\ProjectName\bin\\";WebProjectOutputDir="${ITEM_ROOTDIR}\ProjectName\\" 

C'è un modo per farlo? Ho provato il plugin di configurazione affettare, che è utile, ma non va bene questa necessità da quello che vedo

risposta

7

per le variabili globali, è necessario EnvInject plugin. Ciò consente (tra le altre cose) di impostare le variabili a livello di Global (nodo), a livello di lavoro o come step. È possibile impostare le variabili direttamente o dal file delle proprietà o dagli script.

Una volta impostato, le variabili sono disponibili come variabili di ambiente per il resto di Jenkins e per i relativi passaggi (nell'ambito dell'ambito).

Per il passaggio di argomenti a MSBuild, quando si configura un passo MSBuild, c'è un'opzione per passare "argomenti riga di comando" nel formato /p:Param=Value.

Il "valore" potrebbe essere una variabile d'ambiente. Su ambiente Windows si dovrebbe fare riferimento a esso come% myvar%

Quindi, se si configura un GLOBAL_IIS_DIR=C:\path\to\IIS globale utilizzando EnvInject, si può quindi fare riferimento sulla riga di comando con /p:IIS_DIR=%GLOBAL_IIS_DIR%

+0

Questo ha funzionato per me – TechDawg270

19

È possibile farlo con built-in Jenkins' funzionalità:

enter image description here

allora avete bisogno di espandere la vostra variabile. Questo, in realtà, dipende da dove lo useresti.

Ad esempio: %MSBuild% e %IIS_DIR% per il passaggio di generazione "Esegui comando batch di Windows". Altri passi di build (e plugin) potrebbero usarlo diversamente.

+0

Ho provato questo, e ha funzionato pure – TechDawg270

+1

btw, usare '$ {GIT_BRANCH}' per shell – Yar

Problemi correlati