Использование CruiseControl для копирования головной папки SVN в папку Release

Я только начинаю работать с CruiseControl.NET и nAnt и на самом деле плохо понимаю, как работает весь процесс. В настоящее время у нас есть большинство наших решений в Visual Source «Safe», и сервер сборки автоматически маркирует каждый выпуск с помощью файла AssemblyInfo.

Мы переносим наши проекты VSS в SVN и соответствующим образом изменили файлы сборки проекта, чтобы проверить и обновить репозитории SVN. Чего мы хотим достичь, так это иметь копию источника в системе управления версиями, которая точно соответствует версии развертываемого проекта.

Наш SVN настроен таким образом:

svn://solution/  
    TRUNK/
    RELEASES/
         1.0.0/
         1.2.0/
    BRANCHES/

Поэтому, когда мы принудительно собираем наше решение с установленной для него версией assemblyinfo 1.3.0, мы хотим, чтобы сервер сборки скопировал каталог TRUNK в каталог RELEASES / 1.3.0 /.

Команда SVN довольно проста. svn скопируйте src / directory dst / directory. Но где бы я поместил эту команду и как мне получить номер версии для места назначения?

На сервере сборки это пример файла .xml:

    <sourcecontrol type="svn">
    <trunkUrl>svn://project/trunk</trunkUrl>
            <workingDirectory>D:\Builds\project\Src</workingDirectory>
            <executable>C:\Subversion\bin\svn.exe</executable>
    <username>sf_service_dev</username>
    <password>SFx4vi-r</password>
            <tagOnSuccess>true</tagOnSuccess>
    <cleanCopy>true</cleanCopy>
</sourcecontrol>

В файле проекта .build у нас есть это (и, конечно же, многое другое):

<target name="Deploy_Release">
     <property name="fileandpathformyfile" value="${CCNetWorkingDirectory}\Bin\project.exe"/>
  <echo message="fileandpathformyfile is ${fileandpathformyfile}."/>
  <property name="ReleaseNumber" value="${fileversioninfo::get-file-version(fileversioninfo::get-version-info(fileandpathformyfile))}"/>
  <echo message="ReleaseNumber has been detected to be ${ReleaseNumber}."/>

  <!--Use version as needed-->

  <!--Create the release direcory-->
  <mkdir dir="${CCNetWorkingDirectory}\..\Releases\${ReleaseNumber}"/>
  <!--Copy stuff to the release directory-->
  <copy todir="${CCNetWorkingDirectory}\..\Releases\${ReleaseNumber}">
    <fileset basedir="${CCNetWorkingDirectory}\bin">
      <include name="*.dll" />
      <include name="*.exe" />
      <include name="*.config" />
      <include name="*.xml" />
      <include name="*.stp" />
    </fileset>
  </copy>
</target>

Теперь, если я хочу запустить команду SVN, чтобы скопировать $ {trunkURL} в $ {trunkURL} /../ Release / $ {ReleaseNumber}, как бы я это сделал и в какой файл он поместил бы? Насколько я понимаю на данный момент, нам нужно либо получить ReleaseNumber из файла .build, в файл .xml, и запустить оттуда. Или нам нужно пройти через trunkURL из .XML в .build и запустить команду svn из файла .build.

Пожалуйста помоги!


person Josh Smeaton    schedule 08.10.2009    source источник
comment
Вы уже какое-то время используете nAnt или начали использовать CC.Net и nAnt одновременно. Просто любопытно, почему вы не используете msbuild.   -  person Ryu    schedule 08.10.2009
comment
Я начал использовать оба одновременно. Для наших старых проектов мы выполняем локальную компиляцию, тестируем производственную SOA и развертываем оттуда.   -  person Josh Smeaton    schedule 12.10.2009


Ответы (1)


Один из вариантов - ставить теги (также известные как svn copy) при каждой успешной сборке. Для этого есть встроенный функционал.

я вижу, у вас <tagOnSuccess> включен правда

вы также должны установить <tagBaseUrl>svn://project/trunk/Releases</tagBaseUrl> или <tagBaseUrl>svn://project/trunk/Tags</tagBaseUrl>

Проблема, с которой вы можете столкнуться, - это каждая успешная сборка, будь то принудительная или непрерывная, будет помечена. Я предполагаю, что вы не хотите копировать в Release каждую сборку.

Что ты мог сделать, это

  1. выполнить пакетный файл с помощью nAnt exec task
  2. напишите оператор if, проверяющий %CCNetRequestSource% переменную среды для ForceBuild
  3. выполнить операцию svn в командной строке (CCNetWorkingDirectory будет доступен как переменная среды, возможно, вам придется передать выпуск # в качестве параметра)

Также можно оформить заказ nantcontrib, похоже, у него есть задача svn

ИЗМЕНИТЬ

Вы можете посмотреть, как CC.Net управляет вашей версией # с помощью labeller и передать его nAnt через переменную среды CCNetLabel. Судя по тому, что я читал, вам, скорее всего, понадобится File Labeller, потому что другие автоматически генерируют метку для вас, я лично использую этикетировщик итераций.

Преимущество использования CC.Net labeller для управления версиями заключается в том, что электронные письма о сборке будут показывать правильную версию выпуска, и я считаю, что <tagOnSuccess> использует метку для имени каталога.

person Ryu    schedule 08.10.2009
comment
Просто чтобы вы знали, у нас есть отдельные файлы конфигурации CC.NET для непрерывной и выпускной версий на сервере сборки. Спасибо за вашу помощь, это намного проще, чем я думал! Ваше здоровье - person Josh Smeaton; 08.10.2009
comment
Вы можете посмотреть, как CC.Net управляет вашей версией № и передает ее в nAnt confluence.public. Shouldtworks.org/display/CCNET/ вам, скорее всего, понадобится средство маркировки файлов - person Ryu; 08.10.2009
comment
Может ли этикетировщик файлов получить номер версии из файла AssemblyInfo? Или он должен содержать только номер версии? Мы могли бы достаточно легко сгенерировать файл version.file через ant в скрипте .build, но хотели бы избежать этого, если работа уже сделана. - person Josh Smeaton; 09.10.2009