Развертывание сборки с использованием CruiseControl.net - PullRequest
6 голосов
/ 01 октября 2008

Я видел несколько примеров того, как выполнить развертывание сборки, однако у меня есть кое-что уникальное, что я хотел бы сделать:

  1. Развертывание сборки в папку с номером сборки (например, Project \ Builds \ 8423)
  2. Измените номер версии в .NET AssmblyInfo.cs, чтобы он соответствовал номеру сборки

Кто-нибудь делал это раньше с проектами .NET, использующими NAnt + CruiseControl.net?

Ответы [ 6 ]

11 голосов
/ 04 октября 2008

Развертывание сборки в папку с номером сборки довольно просто. Задача CruiseControl.NET NAnt автоматически передает ряд свойств в ваш скрипт 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, поэтому каждый проект включает эту информацию (вместе с гораздо меньшим файлом AssemblyInfo.cs, который включает информацию о конкретной сборке, такую ​​как заголовок сборки).

Когда проекты создаются локально, либо через Visual Studio, либо через NAnt, используется этот файл CommonAssemblyInfo.cs. Однако, когда проекты создаются CruiseControl.NET, я использую NAnt для замены этого файла с помощью задачи <asminfo>. Вот как выглядит скрипт 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>

Обратите внимание, что значения AssemblyVersionAttribute и AssemblyInformationalVersionAttribute установлены в цели версия . Свойство CCNetLabel вставляется в номера версий. Для получения дополнительной выгоды вы можете использовать плагин CruiseControl.NET, такой как ранее упомянутый SvnRevisionLabeller . Используя это, мы получаем сборки с метками типа «2.1.8239.0», где «8239» соответствует номеру ревизии Subversion, из которого мы строим. Мы выгружаем этот номер сборки непосредственно в наши AssemblyVersionAttribute и AssemblyInformationalVersionAttributes , и наши номера сборки и номера версий в наших сборках могут быть легко прослежены до определенной ревизии в нашей системе управления версиями .

2 голосов
/ 26 октября 2008

Я довольно новичок в круиз-контроле и nAnt, но нашел пост в блоге Скотта Хансельмана очень полезным.

Не идеально и не красиво, но это делает работу.

Существует также Утилита UpdateVersion (к которой Скотт, похоже, тоже приложил руку).

2 голосов
/ 01 октября 2008

Проверьте этот проект с открытым исходным кодом . Хотя он использует MSBuild, различия незначительны.

CC.NET передает каталог и версию дистрибутива скрипту Photon.ccnet , который представляет собой простую оболочку вокруг Photon.build скрипта Номер версии используется в именах папок и пакетов, а также в версиях сборки.

Номера версий взяты из svnRevisionLabellerPlugin для CC.NET

И вот так все выглядит в конце.

1 голос
/ 01 октября 2008

Я не сделал этого с помощью nant, но мы написали специальное приложение на C #, которое читает сборку и увеличивает номер выпуска.

мы вызываем его из блока exec в конфигурации ccnet.

Создание папки и копирование файлов было бы тривиально, чтобы добавить в это приложение

мы думали, что мы используем C # весь день, так что было бы быстрее исправить / изменить программу сборки, написанную на C #, тогда, если бы нам пришлось изучать внутрикадровые сценарии nant поверх этого

очевидно, что если вы используете nant все время, не было бы никаких причин не создавать собственный плагин nant для выполнения этой работы

0 голосов
/ 02 октября 2008

Вы можете использовать свойство CCNetLabel, которое передается в сценарий NAnt, чтобы указать, куда оно будет развернуто.

Что касается AssemblyInfo, для MSBuild существует задача в MSBuildCommunityTasks , которая работает хорошо. Не знаю, каким будет эквивалент NAnt, хотя вы могли бы запустить скрипт MSBuild до того, как ваш скрипт NAnt изменил его.

Конфигурация проста:

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

Вам нужно будет добавить любые другие необходимые вам атрибуты, так как это перезапишет файл AssemblyInfo.

0 голосов
/ 01 октября 2008

Я согласен с BumperBox, отдельная сборка для выполнения (?) Отмены увеличения номера сборки - это путь, который я тоже выбрал пару лет назад. Он имеет преимущество в том, что способен справляться и с другими внешними факторами. Например, вы можете увеличить номера выпуска или сборки, если в файле конфигурации существуют определенные критерии.

...