以编程方式获取SVN修订号(.NET)

时间:2014-03-06 14:16:28

标签: c# .net svn ankhsvn

我知道这个问题已多次出现,例如:Getting the subversion repository number into code

但要么我理解太复杂,要么对我的项目来说过于复杂。 这是我的简短设置: 几个开发人员使用visual studio 2012和ankhsvn连接到我们的subversion存储库,开发一个.net Web应用程序。 开发服务器使用cruisecontrol.net同步存储库中的最新文件。 测试服务器,手动复制特定修订版以进行QA。

请求是在网站上显示最新版本,以便测试人员知道他们正在查看的版本。

最简单的方法是什么?是否有一些直接从代码中获取它的方法(最佳方案)?可以在cruisecontrol.net上为我做这件事(但是这会离开手动部署的测试服务器)。我进行了搜索和搜索,许多解决方案似乎很麻烦,我只是想知道在开始构建精心设计的装置之前是否有更简单的方法。

6 个答案:

答案 0 :(得分:4)

无法直接从代码中获取修订号(我假设您的意思是您的代码),除非您自己将其放在那里。

有多种方法可以做到(并且下面的列表并非详尽无遗),具体取决于您的构建过程的样子以及您想要做多少工作。

  1. 使用$Revision$关键字&让Subversion客户端CCNet调用自动扩展它。
  2. 在构建过程中使用SubWCRev.exe和一些自定义代码(脚本)将值插入到文件中。
  3. 在构建过程中使用SharpSVN和一些自定义代码(脚本或EXE)将值插入到文件中。
  4. 你的问题不够具体,不能详细介绍。你没有描述你所发现的未指明解决方案的“麻烦”,而“最简单”是一个非常主观的措施。

答案 1 :(得分:4)

我们团队为QA / Beta和生产环境部署代码提供了相同的环境。在我看来,以及我们这样做的方式,这可以通过简单的dos脚本和svn命令行客户端来完成。

除此之外,我们还提供了当前版本相对于生产部署所拥有的所有更改的列表。这样开发者就可以清楚地知道从分期到生活会发布什么样的差异。

以下是:

我们的CCnet部署为每个开发应用程序配置了3个相关项目。

  1. 分段
    • 使用来自该项目的每个开发人员的每个svn提交进行自动构建
    • 生成构建的版本号
    • 从生产代码生成svn差异列表。
  2. QA
    • 手动构建
    • 使用实时设置构建MS(连接字符串和其他环境配置)
    • 将其与暂存环境分开
    • 带有版本和更改历史记录。
    • 仅从QA区域推送。
    • 手动构建。
    • 将所有持股人的版本号和更改列表邮寄。
  3. CCnet模板:

    版本文件创建器模板

    这将在Web根文件夹

    中创建版本
    <cb:define name="versionFileCreator">
        <exec description="Creating the version info file to path [$(appRootFolder)\Version.txt].">
            <executable>$(command_line_program_path)</executable>
            <buildArgs />
            <dynamicValues>
                <replacementValue>
                    <format>/C  echo  {0} > "$(appRootFolder)\Version.txt" </format>
                    <parameters>
                        <namedValue>
                            <name>$CCNetLabel</name>
                        </namedValue>
                    </parameters>
                    <property>buildArgs</property>
                </replacementValue>
            </dynamicValues>
            <buildTimeoutSeconds>900</buildTimeoutSeconds>
            <successExitCodes>0</successExitCodes>
        </exec> 
    </cb:define>
    

    发布当前版本w.r.t Production

    中的更改

    此模板使用dos脚本进行工作,本节后面将对此进行解释

       <cb:define name="publishChangesFromSvn">
            <exec description="Consolidating and publishing changes from path [$(svnPathForProductionVersion)] ">
                <executable>versionHistoryPublisher.bat</executable>
                <buildArgs>"$(svnPathForProductionVersion)" "$(appDirectory)" "$(svnSrcCodeRootPath)" $(svn_password)</buildArgs>
            </exec>
        </cb:define>
    

    用于从SVN

    提取更改历史记录的DOS脚本
    @echo off
    set currentProductionVersionFileSvnUrl=%1
    set workingDirectory=%2
    set sourceCodeSvnPath=%3
    set svnPassword=%4
    
    REM **** Creating the file with last production version ***
    svn export "%currentProductionVersionFileSvnUrl%//Version.txt" "%workingDirectory%\lastProductionVersion.txt" --username %svnusername% --password %svnPassword% --force --non-interactive --quiet
    
    set /p lastCcnetBuildNumber=< %workingDirectory%\lastProductionVersion.txt
    set /p currentCcnetBuildNumber=< %workingDirectory%\Version.txt
    
    for /f "tokens=4 delims=." %%a in ("%lastCcnetBuildNumber%") do set lastSvnRevisionNumber=%%a
    
    for /f "tokens=4 delims=." %%a in ("%currentCcnetBuildNumber%") do set headRevisionNumber=%%a
    
    for /f "tokens=1 delims= " %%a in ("%headRevisionNumber%") do set headRevisionNumber=%%a
    
    echo %lastVersion%
    echo Changes in current deployment w.r.t production. > %workingDirectory%\currentChangeList.txt
    echo =============================================== >> %workingDirectory%\currentChangeList.txt
    echo Current revison : %headRevisionNumber% >> %workingDirectory%\currentChangeList.txt
    echo Compared to production version : %lastSvnRevisionNumber% >> %workingDirectory%\currentChangeList.txt
    echo =============================================== >> %workingDirectory%\currentChangeList.txt
    svn log %sourceCodeSvnPath% -r %headRevisionNumber%:%lastSvnRevisionNumber% --verbose --username %svnusername% --password %svnPassword% >> %workingDirectory%\currentChangeList.txt
    

    CCNET分段项目定义示例

    <project queue="Staging" queuePriority="1">
    
      ...your project configurations....
    
    
      <cb:svn_settings svn_src_code_path="$(svnSrcCodeRootPath)" />
    
      <tasks>
        <artifactcleanup cleanUpMethod="KeepLastXBuilds" cleanUpValue="10" />
        <modificationHistory onlyLogWhenChangesFound="true" />
        <sequential>
          <tasks>
            <!-- Build the web-->
            <msbuild description="Building [$(msbuildWorkingDirectory)\$(solutionFileName)] using MsBuild.">
                .. your ms build configuration...
            </msbuild>
    
            <!-- create the version file -->
            <cb:versionFileCreator />
    
            <cb:publishChangesFromSvn   svnPathForProductionVersion="$(productionCheckedInVersion)"
                           appDirectory="$(appRootFolder)" />
         </tasks>
        </sequential>
      </tasks>
      <publishers>
        <!-- default XML logger of CCNET -->
        <xmllogger />
      </publishers>
      <triggers>
          <intervalTrigger name="continuous" seconds="15" buildCondition="IfModificationExists" initialSeconds="30" />
      </triggers>
    </project>
    

    版本信息位于version.txt文件中,代码更改历史记录位于currentChangeList.txt文件中。由于这两个文件都在Web根目录中,因此可以通过URL轻松访问它们

    此外,如果您想在您的网站上显示版本号,您可以轻松地从version.txt中读取一行,并在app_start期间的任何位置显示它。

答案 2 :(得分:3)

SharpSVN允许您执行此操作,如果您知道存储库路径:

using SharpSvn;

private static long GetRevision() 
{
    using (SvnClient client = new SvnClient())
    {
        SvnInfoEventArgs info;
        return client.GetInfo(SvnPathTarget.FromString(REPO_PATH), out info) ? info.Revision : 0;
    }
}

答案 3 :(得分:2)

接受答案的第二点非常简单,并提供了所需的结果:应用程序UI中某处的输出修订号:

  

在构建过程中使用SubWCRev.exe和一些自定义代码(脚本)   将值插入文件。

1)考虑要使用的程序集属性,并在其中一个项目的AssemblyInfo文件中注释/删除其行(我选择了“常用”项目并{{1属性)。某些限制可能适用于基于msbuild版本的各种程序集属性,如here所示。

2)创建模板以用于生成整个版本。例如:AssemblyFileVersion

SolutionInfo.cs.tmpl

3)创建实际文件以用于存储生成的版本。例如:using System.Reflection; // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyFileVersion("1.0.0.$WCREV$")] // [assembly: AssemblyVersion("1.0.0.$WCREV$")] 。这可以是空的,因为它将在构建时自动生成。构建之后,它应该是这样的:

SolutionInfo.cs

确保从源代码管理中忽略/排除此文件。

4)创建预建事件以获取修订版号并从其模板创建文件:

using System.Reflection;

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision 
//
// You can specify all the values or you can default the Revision and Build Numbers 
// by using the '*' as shown below:
[assembly: AssemblyFileVersion("1.0.0.16788")] 
// [assembly: AssemblyVersion("1.0.0.16788")]

注意:此构建事件假定TortoiseSVN在其默认路径中安装了subwcrev。构建服务器必须具有相同的配置,以便构建不会崩溃。如果在"C:\Program Files\TortoiseSVN\bin\subwcrev" "$(ProjectDir).\.." "$(ProjectDir)\Properties\SolutionInfo.cs.tmpl" "$(ProjectDir)\Properties\SolutionInfo.cs" 中注册subwcrev,则不再需要完整路径。

5)版本提取

PATH

答案 4 :(得分:2)

subversion使用的db是sqlite,在项目的.svn文件夹中称为wc.db。您需要做的就是使用sqlite db provider(Install-Package System.Data.Sqlite),并使用wc.db的完整路径作为连接字符串中的数据源运行Select max(revision) from NODE

答案 5 :(得分:0)

  

请求是在网站上显示最新版本   测试人员知道他们正在查看的版本。

这是我打算做的事情: 测试人员需要你建立的构建信息。为什么不创建调用svnversionsvn info的批处理文件并将输出写入文本文件?您可以使用项目/解决方案文件的后期构建事件来调用它,甚至可以在部署新构建时使用cruisecontrol。如果文件是在您的网站中生成的,您可以使用asp.net阅读并在页脚中包含信息,或者只是让测试人员访问此文本文件。

不是一个直接的解决方案。但肯定会有效。