Как опубликовать приложение ClickOnce через CruiseControl.NET?

На моем сервере разработки установлен CruiseControl.NET версии 1.4. Каждый раз, когда разработчик проверяет код, он выполняет компиляцию.

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

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

Ответов (5)

Решение

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

Нам стало проще работать с несколькими средами с помощью простых пакетных файлов. Я не говорю, что это лучший способ сделать это, но для нашего сценария и требований это сработало. Дополните "Project" названием вашего проекта и "Environment" названием вашей среды (dev, test, stage, production, что угодно).

Вот область задач нашего файла "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, но это работает. Если вам нужно, чтобы это работало вчера, возможно, это решение, которое вы ищете. Удачи!

Я помню, как делал это в прошлом году для проекта ClickOnce, над которым я работал. Я помню, что на это у меня ушла целая вечность, но вот она. Я хотел, чтобы мои скрипты создавали другой установщик, указывающий на наш dev env, и другой на 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 и образец статьи, которые, надеюсь, помогут вам начать работу.

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

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

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

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

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

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

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

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

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