如何在Jenkins中声明全局变量并在每个单独项目中的MSBuild任务中使用它

Tec*_*270 7 msbuild build-automation jenkins

我正在将我们的CI平台从CruiseControl转换为Jenkins,并且似乎无法想象它应该相对简单(免责声明 - 我不是CI或构建自动化专家,但这被倾倒到我的膝盖上我发现它很有趣)

在CruiseControl中,我能够声明这样的变量:

<cb:define rootdir="J:\SOURCES\" />
<cb:define logdir="J:\SOURCES\buildlogs" />
<cb:define iisdir="J:\IIS\" />
<cb:define artifacts="artifacts\" />
Run Code Online (Sandbox Code Playgroud)

然后将它们用作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>
Run Code Online (Sandbox Code Playgroud)

如果根目录或IIS目录发生更改,则可以立即将其轻松应用于所有项目.我们有大约60个项目设置,因此按项目完成这个项目将非常耗时.将此迁移到Jenkins,MSBuild命令行参数现在看起来像这样(部分样本但包含相关内容):

OutDir="J:\IIS\ProjectName\bin\\";WebProjectOutputDir="J:\IIS\ProjectName\\"
Run Code Online (Sandbox Code Playgroud)

IIS目录是硬编码的.我需要更像这样的东西:

OutDir="${IIS_DIR}\ProjectName\bin\\";WebProjectOutputDir="${ITEM_ROOTDIR}\ProjectName\\"
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我尝试了配置切片插件,这很有用,但从我看到的不适合这种需要

Vit*_*upt 20

您可以使用内置的Jenkins功能执行此操作:

在此输入图像描述

然后你需要扩展你的变量.实际上,这取决于您使用它的位置.

例如:%MSBuild%%IIS_DIR%"执行Windows批处理命令"构建步骤.其他构建步骤(和插件)可以使用不同的方式.


Sla*_*lav 7

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

设置后,变量可用作Jenkins其余部分的环境变量及其步骤(在范围内).

要将参数传递给MSBuild,在配置MSBuild步骤时,可以选择以格式传递"命令行参数" /p:Param=Value.

"价值"可以是环境变量.在Windows环境中,您将其引用为%myvar%

因此,如果GLOBAL_IIS_DIR=C:\path\to\IIS使用EnvInject 配置全局,则可以在命令行上使用它来引用它/p:IIS_DIR=%GLOBAL_IIS_DIR%