Вопрос

На моем сервере разработки установлена ​​версия CruiseControl.NET 1.4.Всякий раз, когда разработчик проверяет код, он компилирует его.

Теперь мы подошли к тому моменту, когда можем начать предоставлять наше приложение тестерам.Мы хотели бы использовать ClickOnce для распространения приложения, при этом идея заключается в том, что когда тестировщик приступает к тестированию приложения, у него есть последняя сборка.

Я не могу найти способ сделать это с помощью CruiseControl.NET.Мы используем MSBUILD для выполнения сборок.

Это было полезно?

Решение 2

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

Мы обнаружили, что проще работать с несколькими средами, используя простые пакетные файлы.Я не утверждаю, что это лучший способ сделать это, но для нашего сценария и требований это сработало хорошо.Дополните «Проект» именем вашего проекта, а «Среду» — именем вашей среды (разработка, тестирование, стадия, производство и т. д.).

Вот область задач нашего файла «ccnet.config».

<!-- override settings  -->
<exec>
    <executable>F:\Source\Project\Environment\CruiseControl\CopySettings.bat</executable>
</exec>

<!-- compile -->
<msbuild>
    <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
    <workingDirectory>F:\Source\Project\Environment\</workingDirectory>
    <projectFile>Project.sln</projectFile>
    <buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
    <targets>Rebuild</targets>
    <timeout>0</timeout>
    <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>

<!-- clickonce publish  -->
<exec>
    <executable>F:\Source\Project\Environment\CruiseControl\Publish.bat</executable>
</exec>

Первое, что вы заметите, это запуск CopySettings.bat.При этом копируются определенные настройки среды, например подключения к базе данных.

Далее запускается стандартная задача MSBUILD.Любые ошибки компиляции перехватываются здесь и обрабатываются как обычно.

Последнее, что нужно выполнить, — это Publish.bat.Фактически это снова выполняет «перестройку» MSBUILD из командной строки, а параметры из CruiseControl автоматически передаются и создаются.Затем MSBUILD вызывается для цели «публикация».Для публикации задаются точно такие же параметры, как и для перестроения.Это обеспечивает синхронизацию номеров сборок.Кроме того, наши исполняемые файлы называются по-другому (т.- ProjectDev и ProjectTest).В итоге мы получаем разные номера и имена версий, и это позволяет ClickOnce делать свое дело.

Последняя часть Publish.bat копирует файлы в новые места.Мы не используем файлPublish.htm, поскольку все наши пользователи находятся в сети, мы просто даем им ярлык файла манифеста на рабочем столе, и они могут щелкнуть и всегда запускать правильный исполняемый файл с номером версии, который привязан к Круиз-контроль.

Вот CopySettings.bat

XCOPY "F:\Source\Project\Environment\CruiseControl\Project\app.config" "F:\Source\Project\Environment\Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.Designer.vb" "F:\Source\Project\Environment\Project\My Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.settings" "F:\Source\Project\Environment\Project\My Project" /Y /I /R

И наконец, вот Publish.bat

C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:rebuild "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationRevision=%CCNetLabel% /property:AssemblyName="ProjectEnvironment" /property:PublishUrl="\\Server\bin\Project\Environment\\"
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:publish "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationVersion="1.0.0.%CCNetLabel%" /property:AssemblyVersion="1.0.0.%CCNetLabel%" /property:AssemblyName="ProjectEnvironment" 

XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish" "F:\Binary\Project\Environment" /Y /I
XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish\Application Files" "F:\Binary\Project\Environment\Application Files" /Y /I /S

Как я уже сказал, вероятно, это сделано не так, как предполагали разработчики CruiseControl и MSBUILD, но это работает.Если вам нужно, чтобы это заработало еще вчера, возможно, это то решение, которое вы ищете.Удачи!

Другие советы

Мы сделали это и можем дать вам несколько советов для начала.

2 вещи, о которых вам следует знать:

  • MSBuild может создать для вас необходимые файлы развертывания.
  • MSBuild не будет развертывать файлы в общей папке FTP или UNC.Для этого вам понадобится отдельный шаг.

Чтобы использовать MSBuild для создания манифестов ClickOnce, вам необходимо ввести следующую команду:

msbuild /target:publish /p:Configuration=Release /p:Platform=AnyCPU; "c:\yourProject.csproj"

Это позволит MSBuild создать проект и сгенерировать файлы развертывания ClickOnce внутри bin elease\YourProject.publish каталог.

Все, что осталось, — это скопировать эти файлы в общий ресурс FTP/UNC или куда угодно, и все готово.

Вы можете указать CruiseControl.NET выполнять сборку с использованием этих параметров MSBuild.

Затем вам понадобится задача сборки CruiseControl.NET, чтобы взять сгенерированные файлы развертывания и скопировать их в общий ресурс FTP или UNC.Для этого мы используем небольшую консольную программу на C#, но вы также можете легко использовать сценарий Powershell.

Я помню, как делал это в прошлом году для проекта ClickOnce, над которым работал.Я помню, что мне потребовалась целая вечность, чтобы понять это, но вот оно.Я хотел, чтобы мои сценарии создавали другой установщик, который указывал бы на нашу среду разработки, и другой для prod.Мало того, мне нужно было ввести правильную информацию о версии, чтобы существующие клиенты «поняли», что существует новая версия, и в этом весь смысл clickOnce.В этом скрипте вам необходимо заменить свои собственные имена серверов и т. д.Хитрость заключается в том, чтобы сохранить файлыPublish.htm и project.publish и ввести новый номер версии на основе версии, предоставленной вам CC.NET.

Вот как выглядел мой сценарий сборки:

<target name="deployProd">
  <exec program="<framework_dir>\msbuild.exe" commandline="<project>/<project>.csproj /property:Configuration=PublishProd /property:ApplicationVersion=${build.label}.*;PublishUrl=\\<prod_location>\binups$\;InstallUrl=\\<prod_location>\binups$\;UpdateUrl=\\<prod_location>\binups$\;BootstrapperComponentsUrl=\\<prod_location>\prereqs$\ /target:publish"/>

  <copy todir="<project>\bin\PublishProd\<project>.publish">

    <fileset basedir=".">
      <include name="publish.htm"/>
    </fileset>

    <filterchain>
      <replacetokens>
        <token key="CURRENT_VERSION" value="${build.label}"/>
      </replacetokens>
     </filterchain>
  </copy>

</target>

Надеюсь это поможет

Просто возможность передать ${CCNetLabel} в задаче msbuild CCNET.config была бы большим улучшением.

Вы хотите использовать задачи создания манифеста ClickOnce в msbuild.Процесс немного затянут, поэтому я просто укажу вам на пару ссылок.Здесь ссылка на MSDN и образец статьи чтобы, надеюсь, вы начали.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top