【问题标题】:Build deployment using CruiseControl.net使用 CruiseControl.net 构建部署
【发布时间】:2008-10-01 07:34:38
【问题描述】:

我已经看过一些关于如何进行构建部署的示例,但是我有一些独特的事情想做:

  1. 将构建部署到具有构建号的文件夹(例如,Project\Builds\8423)
  2. 更改 .NET AssmblyInfo.cs 中的版本号以匹配内部版本号

之前有没有人使用 NAnt + CruiseControl.net 对 .NET 项目进行过此操作?

【问题讨论】:

  • 您使用的是什么源代码控制系统?它是否支持修订号?

标签: .net cruisecontrol.net nant


【解决方案1】:

将构建部署到具有构建号的文件夹非常简单。 CruiseControl.NET's NAnt task 自动将许多属性传递给您的 NAnt 脚本。 CCNetLabel 属性是您用来创建部署目录的属性。 CruiseControl.NET 文档中实际上有一个稍微过时的示例 NAnt 脚本就是这样做的。这是一个更好的版本:

<target name="publish">
    <if test="${not property::exists('CCNetLabel')}">
        <fail message="CCNetLabel property not set, so can't create labelled distribution files" />
    </if>

    <property name="publishDirectory" value="D:\Public\Project\Builds\${CCNetLabel}" />

    <mkdir dir="${publishDirectory}" />
    <copy todir="${publishDirectory}">
        <fileset basedir="${buildDirectory}\bin">
            <include name="*.dll" />
        </fileset>
    </copy>         
</target>

就您的二进制文件进行版本控制而言,我发现以下方法比尝试更改您的 AssemblyInfo.cs 文件更简洁、更容易。基本上,我创建了一个 CommonAssemblyInfo.cs 文件,该文件位于任何项目之外,与您的解决方案文件位于同一目录中。此文件包含我正在构建的所有程序集共有的内容,例如公司名称、版权信息,当然还有版本。此文件在 Visual Studio 的每个项目中为 linked,因此每个项目都包含此信息(以及一个小得多的 AssemblyInfo.cs 文件,其中包含程序集特定信息,如程序集标题)。

通过 Visual Studio 或 NAnt 在本地构建项目时,将使用 CommonAssemblyInfo.cs 文件。但是,当项目由 CruiseControl.NET 构建时,我使用 NAnt 通过&lt;asminfo&gt; 任务替换该文件。 NAnt 脚本如下所示:

<target name="version">
    <property name="commonAssemblyInfo" value="${buildDirectory}\CommonAssemblyInfo.cs" />

    <!-- If build is initiated manually, copy standard CommonAssemblyInfo.cs file. -->
    <if test="${not property::exists('CCNetLabel')}">
        <copy file=".\src\CommonAssemblyInfo.cs" tofile="${commonAssemblyInfo}" />
    </if>

    <!-- If build is initiated by CC.NET, create a custom CommonAssemblyInfo.cs file. -->
    <if test="${property::exists('CCNetLabel')}">
        <asminfo output="${commonAssemblyInfo}" language="CSharp">
            <imports>
                <import namespace="System" />
                <import namespace="System.Reflection" />
            </imports>
            <attributes>
                <attribute type="AssemblyCompanyAttribute" value="My Company" />
                <attribute type="AssemblyCopyrightAttribute" value="Copyright © 2008 My Company" />
                <attribute type="AssemblyProductAttribute" value="My Product" />
                <attribute type="AssemblyVersionAttribute" value="1.0.0.${CCNetLabel}" />
                <attribute type="AssemblyInformationalVersionAttribute" value="1.0.0.${CCNetLabel}" />
            </attributes>
            <references>
                <include name="System.dll" />
            </references>
        </asminfo>
    </if>
</target>

<target name="build-my-project" depends="version">
    <csc target="library" output="${buildDirectory}\bin\MyProject.dll">
        <sources>
            <include name=".\src\MyProject\*.cs"/>
            <include name=".\src\MyProject\**\*.cs"/>
            <include name="${commonAssemblyInfo}"/>
        </sources>
    </csc>
</target>

注意 AssemblyVersionAttributeAssemblyInformationalVersionAttribute 值在 version 目标中的设置位置。 CCNetLabel 属性被插入到版本号中。为了获得额外的好处,您可以使用像前面提到的 SvnRevisionLabeller 这样的 CruiseControl.NET 插件。使用它,我们得到带有“2.1.8239.0”标签的构建,其中“8239”对应于我们正在构建的Subversion修订号。我们将这个内部版本号直接转储到我们的 AssemblyVersionAttributeAssemblyInformationalVersionAttributes 中,并且我们的内部版本号和程序集上的版本号都可以轻松追溯到我们版本中的特定修订控制系统。

【讨论】:

    【解决方案2】:

    看看这个open-source project。虽然它使用 MSBuild,但差异很小。

    CC.NET 将 distrib 目录和版本传递给 Photon.ccnet 脚本,该脚本是 Photon.build 脚本的简单包装器。版本号用于文件夹和包命名以及程序集版本。

    版本号来自 CC.NET 的 svnRevisionLabellerPlugin

    最后是that's how everything looks

    【讨论】:

      【解决方案3】:

      我对 Cruise Control 和 nAnt 也很陌生,但我发现 Scott Hanselman's Blog Post 非常有帮助。

      不完美也不漂亮,但它确实完成了工作。

      还有一个UpdateVersion Utility(斯科特似乎也参与其中)。

      【讨论】:

        【解决方案4】:

        我还没有用 nant 做过,但是我们用 C# 编写了一个自定义应用程序,它读取程序集并增加版本号。

        我们从 ccnet 配置中的 exec 块调用它。

        创建一个文件夹和复制文件将是微不足道的添加到该应用程序

        我们的想法是我们整天都在使用 C#,所以修复/更改用 C# 编写的构建程序会更快,然后如果我们必须在此基础上学习 nant 脚本的复杂性

        显然,如果您一直使用 nant,就没有理由不构建自定义 nant 插件来完成这项工作

        【讨论】:

          【解决方案5】:

          我同意 BumperBox,一个单独的组件来完成增加内部版本号的繁重(?)提升也是我几年前采取的路线。它还具有能够应对其他外部因素的优势。例如,如果配置文件中存在特定条件,您可能希望增加版本号或内部版本号。

          【讨论】:

            【解决方案6】:

            您可以使用传递给您的 NAnt 脚本的 CCNetLabel 属性来设置它的部署位置。

            对于 AssemblyInfo,对于 MSBuild,MSBuildCommunityTasks 中有一个 Task 运行良好。虽然您可以在更改它的 NAnt 脚本之前运行 MSBuild 脚本,但不知道 NAnt 等价物是什么。

            配置简单:

            <AssemblyInfo CodeLanguage="C#"
                OutputFile="%(YourProjects.RootDir)%(Directory)Properties\AssemblyInfo.cs"
                AssemblyVersion="$(CCNetLabel)"
            />
            

            您将需要添加所需的任何其他属性,这将覆盖 AssemblyInfo 文件。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-10-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多