2008-08-15 11 views
24

Mam program CruiseControl.NET w wersji 1.4 skonfigurowany na moim serwerze programistycznym. Za każdym razem, gdy programista sprawdza kod, tworzy kompilację.Jak opublikować aplikację ClickOnce za pośrednictwem CruiseControl.NET?

Teraz jesteśmy w miejscu, w którym możemy zacząć dostarczać naszą aplikację do testerów. Chcielibyśmy użyć ClickOnce do dystrybucji aplikacji, a pomysł, że tester przejdzie do testowania aplikacji, ma najnowszą wersję.

Nie mogę znaleźć sposobu, aby tak się stało z CruiseControl.NET. Używamy MSBUILD do wykonania kompilacji.

Odpowiedz

12

Dzięki za wszelką pomoc. Ostateczne rozwiązanie, które wdrożyliśmy, wzięło trochę z każdej odpowiedzi.

Łatwiej nam było poradzić sobie z obsługą wielu środowisk przy użyciu prostych plików wsadowych. Nie sugeruję, że jest to najlepszy sposób na zrobienie tego, ale dla naszego podanego scenariusza i wymagań, to działało dobrze. Uzupełnij "Projekt" o nazwę projektu i "Środowisko" za pomocą nazwy środowiska (programista, test, etap, produkcja, cokolwiek).

Oto obszar zadań naszego pliku "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> 

Pierwszą rzeczą, jaką można zauważyć jest to, że CopySettings.bat biegnie. Spowoduje to skopiowanie określonych ustawień dla środowiska, takich jak połączenia z bazą danych.

Następnie uruchamiane jest standardowe zadanie MSBUILD. Wszelkie błędy kompilacji są tutaj przechwytywane i traktowane jako normalne.

Ostatnią rzeczą do wykonania jest Publish.bat. To faktycznie wykonuje "odbudować" MSBUILD ponownie z linii poleceń, a parametry z CruiseControl są automatycznie przekazywane i budowane. Następnie MSBUILD jest nazywany celem "publikowania". Dokładnie te same parametry są podawane do publikowania po wydaniu przebudowy. Dzięki temu numery kompilacji są zsynchronizowane. Ponadto nasze pliki wykonywalne mają inną nazwę (np. - ProjectDev i ProjectTest). Kończymy różnymi numerami wersji i nazwami, a to pozwala ClickOnce zrobić to samo.

Ostatnia część pliku Publish.bat kopiuje rzeczywiste pliki do nowych domów. Nie używamy pliku publish.htm, ponieważ wszyscy nasi użytkownicy są w sieci, po prostu dajemy im skrót do pliku manifestu na ich pulpicie i mogą kliknąć i zawsze uruchamiać poprawny plik wykonywalny z numerem wersji, który wiąże się z Tempomat.

Oto 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 

I wreszcie, tutaj jest 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 

Tak jak mówiłem, to prawdopodobnie nie jest zrobione tak, że deweloperzy CruiseControl i msbuild zamierzał rzeczy działa, ale działa. Jeśli chcesz wczytać to wczoraj, może to być rozwiązanie, którego szukasz. Powodzenia!

-1

Chcesz użyć zadań generacji manifestu ClickOnce w msbuild. Proces jest trochę długi, więc zamierzam wskazać kilka linków. Oto reference on msdn i sample article, aby mieć nadzieję, że zaczniesz.

22

Zrobiliśmy to i możemy dać kilka wskazówek do rozpoczęcia.

2 rzeczy, które należy mieć świadomość:

  • MSBuild może generować potrzebne pliki wdrożeniowe dla Ciebie.
  • MSBuild nie wdroży plików w udziale FTP lub UNC. Będziesz potrzebował osobnego kroku do tego.

Aby korzystać MSBuild do generowania manifestów ClickOnce, oto polecenie trzeba wydać:

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

który powie MSBuild zbudować swój projekt i wygenerować pliki wdrażania ClickOnce wewnątrz kosza \ Publikacja katalogu \ YourProject.publish.

Pozostało tylko skopiować te pliki do udziału FTP/UNC/gdziekolwiek, a wszystko gotowe.

Możesz powiedzieć CruiseControl.NET, aby zbudował przy użyciu tych parametrów MSBuild.

Będziesz potrzebować zadania budowy CruiseControl.NET, aby pobrać wygenerowane pliki wdrażania i skopiować je do udziału FTP lub UNC. Używamy do tego niestandardowego małego programu konsoli C#, ale równie dobrze można użyć skryptu Powershell.

+0

Chcę tylko podkreślić, że jest to nieco nieaktualne. Zakładając, że twój post był poprawny, MSBuild został zaktualizowany w celu obsługi wdrażania do akcji UNC, co robię teraz w wielu aktywnych projektach. –

+0

Dzięki, James. Tak, odpowiedź na to pytanie pojawiła się w 2008 roku, kiedy wszystko to było świeże i seksowne; może to nie być istotne 7 lat później. –

4

Pamiętam, że robiłem to w zeszłym roku dla projektu ClickOnce, nad którym pracowałem. Pamiętam, że zabiera mnie to na zawsze, ale tu jest. Chciałem, aby moje skrypty wygenerowały inny instalator, który wskazywał na nasze środowisko dev i inne na prod. Nie tylko to, ale potrzebowałem go do wstrzyknięcia odpowiednich informacji o wersjach, aby istniejący klienci "zdali sobie sprawę", że istnieje nowa wersja, która jest celem ClickOnce. W tym skrypcie trzeba zamienić na własne nazwy serwerów itp. Sztuką jest zapisanie pliku publish.htm i project.publish i wprowadzenie nowego numeru wersji na podstawie wersji dostarczonej przez CC.NET.

Oto co mój skrypt kompilacji wyglądało:

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

Nadzieja to pomaga

0

Po prostu być w stanie przekazać $ {CCNetLabel} w zadaniu msbuild.config msbuild byłoby wielkim ulepszeniem.