Может ли Cruise Control попытаться запустить сборку до полной загрузки SVN-коммита - PullRequest
2 голосов
/ 27 января 2010

У меня есть приложение и общая библиотека с отдельными триггерами сборки CC (при успешной сборке библиотеки также будет запускаться сборка приложения) с настройкой очереди, чтобы убедиться, что CC не пытается собрать приложение до Библиотека закончена.

Нечто странное произошло этим утром. Я работаю над медленным VPN и внес несколько изменений в свое приложение и общую библиотеку (все это было сделано как один коммит). Сначала CC выполнила сборку моего приложения, которое не удалось, потому что не удалось найти два новых класса в общей библиотеке. После этого общая библиотека была успешно построена, а затем успешно создана моя программа.

Похоже, что CC пытался выполнить сборку после того, как изменения в моем приложении были загружены на сервер сборки, но до того, как поступили изменения в библиотеку. Возможно ли это, или мне нужно искать в другом месте, чтобы выяснить причину?

Это ошибка, которую я получил в журнале сборки приложения:

<error code="CS0246" file="SomeClass.cs" line="###" column="###"><![CDATA[The type or namespace name 'ClassAddedToSharedLibraryInThisCommit' could not be found (are you missing a using directive or an assembly reference?)]]></error>

Ниже приведена выдержка из моего файла CCnet.config:

 <project name="App1" queue="hourly" queuePriority="2">
    <triggers>
      <multiTrigger operator="Or">
        <triggers>
          <projectTrigger project="sharedLib">
            <triggerStatus>Success</triggerStatus>
            <innerTrigger type="intervalTrigger" seconds="30" buildCondition="ForceBuild"/>
          </projectTrigger>
          <filterTrigger startTime="16:00" endTime="7:00">
            <trigger type="intervalTrigger" seconds ="625" />
          </filterTrigger>
        </triggers>
      </multiTrigger>
    </triggers>
   <sourcecontrol type="svn">
      <tagOnSuccess>false</tagOnSuccess>
      <tagBaseUrl>https://servername/...</tagBaseUrl>
      <autoGetSource>true</autoGetSource>
      <executable>c:\program files\subversion\bin\svn.exe</executable>
      <trunkUrl>https://servername/.../App1/...</trunkUrl>
      <workingDirectory>C:\svn\...\App1\...</workingDirectory>
    </sourcecontrol>
    <tasks>
      <msbuild>
        <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe</executable>
        <workingDirectory>C:\svn\...\App1\...</workingDirectory>
        <projectFile>App1.sln</projectFile>
        <buildArgs>/p:Configuration=Debug /v:m /m</buildArgs>
        <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        <timeout>1000000</timeout>
      </msbuild>
    </tasks>
  </project>
 <project name="sharedLib" queue="hourly" queuePriority="1">
    <triggers>
      <filterTrigger startTime="16:00" endTime="7:00">
        <trigger type="intervalTrigger" seconds ="350" />
      </filterTrigger>
    </triggers>
    <sourcecontrol type="svn">
      <tagOnSuccess>false</tagOnSuccess>
      <tagBaseUrl>https://servername/...</tagBaseUrl>
      <autoGetSource>true</autoGetSource>
      <executable>c:\program files\subversion\bin\svn.exe</executable>
      <trunkUrl>https://https://servername/.../SharedLib/...</trunkUrl>
      <workingDirectory>C:\svn\...\sharedLib\...</workingDirectory>
    </sourcecontrol>
    <tasks>
      <msbuild>
        <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe</executable>
        <workingDirectory>C:\svn\...\sharedLib\...</workingDirectory>
        <projectFile>sharedLib.csproj</projectFile>
        <buildArgs>/p:Configuration=Debug /v:m /m</buildArgs>
        <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
        <timeout>1000000</timeout>
      </msbuild>
    </tasks>
  </project>

Ответы [ 4 ]

1 голос
/ 27 января 2010

Коммиты Subversion atomic , поэтому это не должно быть возможным. Круиз-контроль не должен видеть никаких новых файлов, пока регистрация не завершена. Вам придется обвинить в другом месте.

Если вы на самом деле не используете два отдельных репозитория subversion (возможно, используя svn: external?)

0 голосов
/ 01 февраля 2010

Я думаю, что вы сказали все это в своем вопросе:

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

У CC.NET не было возможности узнать, что изменения в вашем приложении зависят от изменений в вашей библиотеке. Ваша конфигурация не говорит о том, что проект «sharedLib» должен быть построен до того, как будет построен проект «App1», она просто говорит, что если они оба находятся в очереди одновременно, «sharedLib» идет первым.

Возможно, вы захотите использовать сборки триггеров проекта sharedLib проекта App1.

0 голосов
/ 27 января 2010

SVN коммиты являются атомарными. Ничто не может получить ваш коммит, пока он не будет опубликован на сервере. Я думаю, что вы видите, что по умолчанию в CC.NET ведется без очереди.

Чтобы предотвратить это, вам нужно установить атрибут очереди в элементе проекта:

<project name="build_shared_library" queue="my-lock-value">...
<project name="build_app" queue="my-lock-value">...

И библиотека, и приложение должны иметь одинаковое значение в атрибуте очереди.

0 голосов
/ 27 января 2010

У меня была похожая проблема с CC.Net, но не с SVN. Я не знаком с тем, как работают их коммиты. Но в моем SCM CC.Net опросил сервер на предмет изменений во время регистрации и запустил сборку, даже если были зарегистрированы другие файлы.

Лично я не беспокоился об этом, потому что это был идеальный шторм, когда срабатывал триггер CC.Net в середине регистрации. За мои почти 3 года использования CC.Net я бы сказал, что это произошло дважды.

...