Как вы можете опубликовать приложение ClickOnce через CruiseControl.NET? - PullRequest
24 голосов
/ 15 августа 2008

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

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

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

Ответы [ 5 ]

22 голосов
/ 15 августа 2008

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

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.

12 голосов
/ 20 января 2009

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

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

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

4 голосов
/ 19 сентября 2008

Я помню, как делал это в прошлом году для проекта 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>

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

0 голосов
/ 03 апреля 2009

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

0 голосов
/ 15 августа 2008

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

...