在MSBuild步骤中使用Jenkins版本环境变量

在MSBuild步骤中使用Jenkins版本环境变量,msbuild,jenkins,jenkins-plugins,Msbuild,Jenkins,Jenkins Plugins,我目前正在使用Jenkins的“版本号插件”为构建版本设置一个环境变量。这在jenkins中运行良好,但我需要一种方法将其传递给MSBuild,以便更新exe和dll的版本号。我尝试了下面的配置,但它没有更新构建版本 环境变量名应在写入时不带百分号(“%”),如下所示: VERSION 除此之外,我认为你很适合去 也可以考虑改变< BR> ${BUILDS\u ALL\u TIME} 到 ${BUILDS\u ALL\u TIME,XX} (这将强制使用带前导零的两位数生成号)这是一个MSB

我目前正在使用Jenkins的“版本号插件”为构建版本设置一个环境变量。这在jenkins中运行良好,但我需要一种方法将其传递给MSBuild,以便更新exe和dll的版本号。我尝试了下面的配置,但它没有更新构建版本


环境变量名应在写入时不带百分号(“%”),如下所示:

VERSION
除此之外,我认为你很适合去

也可以考虑改变< BR>

${BUILDS\u ALL\u TIME}


${BUILDS\u ALL\u TIME,XX}


(这将强制使用带前导零的两位数生成号)

这是一个MSBuild目标,它将文件GlobalAssemblyInfo.cs中的修订号替换为Jenkins的SVN_修订变量

我们有一个多项目解决方案,其中每个项目引用相同的GlobalAssemblyInfo以获取公共信息(如版本)。修改此设置,使其适合您的设置

通过具有Exists条件,目标将在未安装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)\(&quot;([0-9]+\.[0-9]+\.[0-9]+)(\.[0-9]+)?&quot;\)"
    ReplacementText="$1(&quot;$2.$(SVN_REVISION)&quot;)" 
    Condition="$(SVN_REVISION) != '' "/>
</Target>


我发现最简单的方法就是使用。使用该插件,您只需提供版本号(或使用的环境变量),它将在工作区中的所有AssemblyInfo.cs文件中替换该版本号。

一个非常快速的解决方法是在msbuild任务之前创建powershell任务。这是假设您如上所述定义了版本变量(没有%%)。在构建开始之前,您选中了“删除工作区”

这是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\u number}.${SVN\u REVISION}'

添加“更改程序集版本”-生成步骤。 在“${…}”内输入变量示例:“${VERSION}”


如果仍然出现生成错误。检查项目文件和AssemblyInfo.cs是否存在合并冲突。

是的,我发现了,而且默认情况下MSBuild.exe似乎不支持/p:version。您需要处理MSBuld扩展。最后,我只编写了一个控制台应用程序来更新AssemblyInfo.cs,然后构建并调用它传入环境变量。这比处理复杂的msbuild扩展要快得多。我希望您能找到一种很好的方法将版本传递给构建,因为我们还为此使用了一个定制的脚本。。。