【问题标题】:How to set assembly version to Jenkins build number?如何将程序集版本设置为 Jenkins 内部版本号?
【发布时间】:2016-02-03 11:13:11
【问题描述】:

我在 Jenkins 中使用“更改程序集版本”插件来更新我的 ASP.NET MVC 项目的所有 AssemblyInfo.cs 文件,以在构建过程中应用版本号。如果我将“Assembly Version”值设置为硬编码值,则效果很好。

但我的要求不同——我想在版本号中使用内部版本号。例如,“1.1.0.25”,其中 25 是内部版本号,由 Jenkins 自动生成。简而言之,版本应该类似于“1.1.0.”

我可以使用 TFS 环境变量在 TFS 构建过程中执行此操作,我是 Jenkins 的新手,不知道如何在 Jenkins 中实现这一点。 以下是 Jenkins 的“Change Assembly Version”插件截图,供您快速参考:

提前致谢

【问题讨论】:

    标签: jenkins environment-variables jenkins-plugins


    【解决方案1】:

    我最近不得不在没有“更改程序集版本”插件的情况下执行此操作。我只是使用了 PowerShell 脚本。我会把它贴在这里,因为它可能会为那些想要它的人提供更多的灵活性:

    if (Test-Path env:BUILD_NUMBER) {
        Write-Host "Updating AssemblyVersion to $env:BUILD_NUMBER"
    
        # Get the AssemblyInfo.cs
        $assemblyInfo = Get-Content -Path .\MyShinyApplication\Properties\AssemblyInfo.cs
    
        # Replace last digit of AssemblyVersion
        $assemblyInfo = $assemblyInfo -replace 
            "^\[assembly: AssemblyVersion\(`"([0-9]+)\.([0-9]+)\.([0-9]+)\.[0-9]+`"\)]", 
            ('[assembly: AssemblyVersion("$1.$2.$3.' + $env:BUILD_NUMBER + '")]')
        Write-Host  ($assemblyInfo -match '^\[assembly: AssemblyVersion')
            
        # Replace last digit of AssemblyFileVersion
        $assemblyInfo = $assemblyInfo -replace 
            "^\[assembly: AssemblyFileVersion\(`"([0-9]+)\.([0-9]+)\.([0-9]+)\.[0-9]+`"\)]", 
            ('[assembly: AssemblyFileVersion("$1.$2.$3.' + $env:BUILD_NUMBER + '")]')
        Write-Host  ($assemblyInfo -match '^\[assembly: AssemblyFileVersion')
            
        $assemblyInfo | Set-Content -Path .\MyShinyApplication\Properties\AssemblyInfo.cs -Encoding UTF8
    } else {
        Write-Warning "BUILD_NUMBER is not set."
    }
    

    【讨论】:

      【解决方案2】:

      对于希望仅更新 1 个版本号但保留其余现有版本号的其他人,您可以设置“更改程序集版本”插件,如下所示:

      程序集版本: $BUILD_NUMBER
      文件名: /Properties/AssemblyInfo.cs
      RegexPattern: 程序集(\w*)Version\("(\d+).(\d+).(\d+).(\d+)"\)
      ReplacementPattern: Assembly$1Version("$2. $3.%s")

      这将保留 Assembly 中已包含的现有前 2 个数字???版本设置,并将第 3 个版本号设置为当前的 Jenkins 内部版本号。

      示例

      AssemblyInfo.cs 包含:

      [assembly: AssemblyVersion("1.40.0.0")]
      [assembly: AssemblyFileVersion("1.40.0.0")]
      

      如果 Jenkins 内部版本号是 103,那么在 Change Assembly Version 插件使用上述设置后,AssemblyInfo.cs 将包含:

      [assembly: AssemblyVersion("1.40.103.0")]
      [assembly: AssemblyFileVersion("1.40.103.0")]
      

      注意

      如果您正在使用 subversion(可能还有其他源代码控制系统)并且正在使用“尽可能使用 SVN 更新”的“签出策略”,则必须将其更改为“尽可能使用 SVN update with svn revert before update”确保修改后的 AssemblyInfo.cs 文件为下一次构建重置。

      【讨论】:

      • 括号必须转义:RegexPattern 应该是Assembly(\w*)Version\("(\d+).(\d+).(\d+).(\d+)"\)
      • +1 仅用于注释。我遇到过这种行为的问题,我从来没有想过可能有多种选择>_
      【解决方案3】:

      先前关于如何为 Jenkins 使用“更改程序集版本”插件的答案不起作用。 在我的 AssemblyInfo.cs 文件中,我通常将它们设置为自动递增版本以帮助本地开发人员工作。

      示例

      AssemblyInfo.cs 包含:

      [assembly: AssemblyVersion("1.0.*")]
      [assembly: AssemblyFileVersion("1.0.*")]
      

      如果版本为 10,则在 Jenkins 构建之后,AssemblyInfo.cs 将包含:

      [assembly: AssemblyVersion("1.0.10")]
      [assembly: AssemblyFileVersion("1.0.10")]
      

      插件是这样使用实现上述目的的:

      Assembly Version: $BUILD_NUMBER
      FileName: 
      RegexPattern: Assembly(\w*)Version\("(\d+).(\d+).(\*)"\)
      ReplacementPattern: Assembly$1Version("$2.$3.%s")
      

      我在使用插件时遇到的另一个错误是文件权限不允许写访问。为了解决这个问题,找到 AssemblyInfo.cs 并禁用“只读”。

      希望能帮助到任何人。

      【讨论】:

        【解决方案4】:

        酷,我自己找到了答案。

        基本上,我必须在“更改程序集版本”插件的“程序集版本”字段中提供“1.0.0.$BUILD_NUMBER”

        【讨论】:

        • 谢谢!他们应该在插件页面上包含这个
        • 谢谢,如何设置 Major.Minor.Sprint 版本?