2015-05-29 13 views
7

我将我们的CI平台从CruiseControl转换为Jenkins,并且似乎无法找出似乎应该比较简单的东西做(声明 - 我不是CI或建立自动化专家,但是这被倾入我的腿上,我觉得很有意思)如何在Jenkins中声明一个全局变量并将其用于每个单独项目中的MSBuild任务

在CruiseControl的,我可以声明变量是这样的:

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

然后将它们用作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> 

如果根目录或IIS目录发生更改,它可以很容易地一次应用于所有项目。我们有大约60个项目设置,因此按项目进行这个项目非常耗时。迁移这詹金斯MSBuild的命令行参数现在这个样子(部分样品,但包括什么是相关的):

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

的IIS目录是硬编码。我需要这样的更多像这样:

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

有没有办法做到这一点?我试过配置切片插件,这是有用的,但不符合我的需求

回答

7

对于全局变量,您需要EnvInject plugin。这允许您(除其他外)在全局(节点)级别,作业级别或步骤中设置变量。您可以直接设置变量,也可以从属性文件或脚本中设置变量。

一旦设置,变量可作为环境变量提供给Jenkins的其余部分及其步骤(范围内)。

传递参数给MSBuild的,当你配置一个MSBuild一步,有传“的命令行参数”中的格式/p:Param=Value.

的“价值”可能是环境变量的选项。在Windows环境中,您将其引用为%MYVAR%

所以,如果你是使用EnvInject全球GLOBAL_IIS_DIR=C:\path\to\IIS,然后你可以/p:IIS_DIR=%GLOBAL_IIS_DIR%

+0

这对我有用 – TechDawg270

19

你可以做到这一点引用它的命令行内置詹金斯功能:

enter image description here

然后,你需要扩大您的变量。这实际上取决于你在哪里使用它。

例如:%MSBuild%%IIS_DIR%用于“执行windows批处理命令”构建步骤。其他构建步骤(和插件)可能会以不同的方式使用它。

+0

我试过了,它也可以工作 – TechDawg270

+1

btw,使用'$ {GIT_BRANCH}'为shell – Yar

相关问题