Получение NAnt для проверки измененных файлов в SVN

В интересах ускорения процесса непрерывной сборки NAnt / CruiseControl.Net / Ivy я надеялся заставить NAnt проверять, изменилась ли моя кодовая база на моем локальном ПК после выполнения обновления на основе NAnt, а затем, если код был изменен, затем запустите процесс повторной сборки этого проекта и, возможно, поднимите флаг для сборки всех последующих компонентов, независимо от их статуса изменения.

Причина в том, что мой процесс сборки в настоящее время занимает более 12 минут, чтобы завершить большую работу, и я думаю, что могу сократить это время, не создавая код, который не будет меняться, а также оставлю разработчиков в офисе счастливее тоже.

Мы исследовали удаление некоторых проектов из порядка сборки, но все они необходимы в случае каких-либо изменений в порядке дерева сборки.


person Brett Rigby    schedule 08.10.2009    source источник


Ответы (1)


Я вижу несколько вариантов

1 - выдайте svn status --show-updates перед svn up и выясните, есть ли какие-либо изменения (должно быть так же просто, как подсчет строк в ответе - я думаю, и обновленная папка будет генерировать только 1 строку)

2 - переключитесь с задачи svn-update на задачу exec и перенаправьте вывод svn вверх в тестовый файл, который вы можете опубликовать, чтобы определить, были ли сделаны какие-либо обновления (аналогично первому варианту).

3 - Возьмите журнал svn после svn и запустите задачу, основанную на http://jonathanmalek.com/wp/?p=244, а затем обработайте xml, чтобы определить, были ли внесены какие-либо изменения. Это будет работать только в том случае, если вам будет гарантировано увеличение номера версии только на 1, поскольку она получает информацию журнала только для последней версии. Вариантом для этого будет захват журнала до и после svn, а затем их сравнение.

Лично я бы выбрал вариант 2. Запуск svn в обновленном рабочем каталоге приводит к одной строке (при ревизии), поэтому переход от использования задачи обновления svn к следующему:

<target name="Svn-update">
  <!-- Default to true so failure mode is to build / signal build is required -->
  <property name="source.changed" value="true"/> 
    <exec 
          program="svn.exe" 
         commandline=’up′ 
          output="_update.log" 
          failonerror="true"/> 
    <property name="updates.count" value="0"/>
    <foreach item="Line" in="_update.log" property="updates.line" trim="Both">
        <property name="updates.count" value="${int::parse(updates.count) + 1}"/>
    </foreach>
    <if test="${updates.count==1}">
        <!-- An up to date working directory generates a single line "At revision xxx" -->
        <property name="source.changed" value="false"/>
    </if>
</target>

теперь вы можете использовать if = "$ {source.change == 'true'}" и except = "$ {source.changed == 'true'}", чтобы определить, когда вы должны и должны выполнить оставшуюся часть вашей сборки и уведомлений

person Neal    schedule 13.10.2009
comment
Хорошие усилия пока что, но я думаю, что мне нужно что-то более конкретное, чтобы присуждать очки. Давай - дай мне код !! : o) - person Brett Rigby; 13.10.2009