我目前正在使用 Jenkins“版本号插件”为构建版本设置环境变量。这在 jenkins 中运行良好,但我需要一种方法将其传递给 MSBuild,以便更新 exe 和 dll 的版本号。我尝试了下面的配置,但它没有更新构建版本
5 回答
环境变量名称应不带百分号 ('%'),如下所示:
VERSION
除此之外,我认为你很高兴。
也可以考虑
${BUILDS_ALL_TIME}
换成
${BUILDS_ALL_TIME, XX}
(这将强制执行带有前导零的两位数的内部版本号)
这是一个 MSBuild 目标,它将文件 GlobalAssemblyInfo.cs 中的修订号替换为来自 Jenkins 的 SVN_REVISION 变量。
我们有一个多项目解决方案,其中每个项目都引用相同的 GlobalAssemblyInfo 以获得公共信息(如版本)。修改它,使其适合您的设置。
通过存在条件,目标在未安装 MSBuildCommunityTasks 的开发人员计算机上执行。在这些情况下,GlobalAssemblyInfo.cs 中的版本号保持不变。
<Target Name="InjectSVNRevision" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')">
<!-- When this build is done by the Jenkins CI server; the svn revision number is set in the environment variable SVN_REVISION
This little snippet replaces the revision number in GlobalAssemblyInfo.cs with this svn revision number
-->
<Message Text="Injecting SVN revision number in GlobalAssemblyInfo.cs" />
<FileUpdate Files="GlobalAssemblyInfo.cs"
Multiline="true"
Singleline="false"
Regex="(AssemblyVersion|AssemblyFileVersionAttribute|AssemblyFileVersion)\("([0-9]+\.[0-9]+\.[0-9]+)(\.[0-9]+)?"\)"
ReplacementText="$1("$2.$(SVN_REVISION)")"
Condition="$(SVN_REVISION) != '' "/>
</Target>
我发现最简单的方法是使用Change Assembly Version。使用该插件,您只需提供版本号(或使用的环境变量),它将在您工作区的所有 AssemblyInfo.cs 文件中替换它。
一个非常快速的解决方法是在您的 msbuild 任务之前创建一个 powershell 任务。这是假设您如上所述定义了 VERSION 变量(没有 %%)。并且您在构建开始之前检查了删除工作区。
这是 powershell 任务的代码。
gci -rec -Filter *AssemblyInfo* | ForEach { (Get-Content $_.FullName) | ForEach-Object {$_ -replace "1.0.0.0",$env:VERSION } | Set-Content $_.FullName}
这是我的摘要,使其工作所需的内容:
安装此插件:
https://plugins.jenkins.io/versionnumber/
https://plugins.jenkins.io/change-assembly-version-plugin/
确保您的 AssemblyInfo.cs 包含:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
设置不带“$”的版本变量名。
定义一个不错的版本号,例如:'1.1.${BUILD_NUMBER}.${SVN_REVISION}'
添加“更改程序集版本”-构建步骤。在“${...}”示例中输入您的变量:“${VERSION}”
如果您仍然遇到构建错误。检查您的项目文件和 AssemblyInfo.cs 是否存在合并冲突。