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

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

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

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

15.08.2008 17:08:19
5 ОТВЕТОВ

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

-1
15.08.2008 17:22:33

We've done this and can give you some pointers to start.

2 things you should be aware of:

  • MSBuild can generate the necessary deployment files for you.
  • MSBuild won't deploy the files to the FTP or UNC share. You'll need a separate step for this.

To use MSBuild to generate the ClickOnce manifests, here's the command you'll need to issue:

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

That will tell MSBuild to build your project and generate ClickOnce deployment files inside the bin\Release\YourProject.publish directory.

All that's left is to copy those files to the FTP/UNC share/wherever, and you're all set.

You can tell CruiseControl.NET to build using those MSBuild parameters.

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

22
15.08.2008 17:35:46
Я просто хочу отметить, что это немного устарело. Предполагая, что ваше сообщение было правильным, MSBuild был обновлен для поддержки развертывания на общих ресурсах UNC, что я делаю сейчас во многих активных проектах.
SomeInternetGuy 16.06.2015 14:24:20
Спасибо, Джеймс. Да, на это первоначально ответили в 2008 году, когда все это было свежо и сексуально; это может быть неактуально через 7 лет.
Judah Gabriel Himango 16.06.2015 16:19:46

I remember doing this last year for a ClickOnce project I was working on. I remember it taking me forever to figure out but here it is. What I wanted my scripts to do was to generate a different installer that pointed to our dev env and a different one for prod. Not only that but i needed it to inject the right versioning information so the existing clients would 'realize' there is a new version out there which is the whole point of clickOnce. In this script you have to replace with your own server names etc. The trick is to save the publish.htm and project.publish file and inject the new version number based on the version that is provided to you by CC.NET.

Here is what my build script looked like:

<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>

Hope this helps

4
20.09.2008 04:29:24
РЕШЕНИЕ

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

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

The last part of Publish.bat copies the actual files to their new homes. We don't use the publish.htm as all our users are on the network, we just give them a shortcut to the manifest file on their desktop and they can click and always be running the correct executable with a version number that ties out in CruiseControl.

Here is 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

And lastly, here is 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

Like I said, it's probably not done the way that CruiseControl and MSBUILD developers had intended things to work, but it does work. If you need to get this working yesterday, it might be the solution you're looking for. Good luck!

12
20.01.2009 18:37:54

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

0
3.04.2009 14:27:04