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

How to declare a global variable in Jenkins and use it in an MSBuild task within each individual project

我正在将我们的 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\" />

然后将它们用作 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 个项目设置,所以一个项目一个项目地做这个项目会非常耗时。将此迁移到 Jenkins,MSBuild 命令行参数现在看起来像这样(部分示例但包括相关内容):

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

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

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

有办法吗?配置切片插件我试过了,这个插件很好用,但是我看到的不符合这个需求

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

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

为了将参数传递给 MSBuild,当您配置 MSBuild 步骤时,可以选择以 /p:Param=Value.

格式传递 "Command line arguments"

"value" 可能是一个环境变量。在 Windows 环境中,您可以将其引用为 %myvar%

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

引用它

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

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

例如:%MSBuild%%IIS_DIR% 用于 "Execute windows batch command" 构建步骤。其他构建步骤(和插件)可能会以不同方式使用它。