如何在 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" 构建步骤。其他构建步骤(和插件)可能会以不同方式使用它。
我正在将我们的 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.
"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" 构建步骤。其他构建步骤(和插件)可能会以不同方式使用它。