CruiseControl.NET を通じて ClickOnce アプリケーションを公開するにはどうすればよいですか?
-
08-06-2019 - |
質問
開発サーバーには CruiseControl.NET バージョン 1.4 がセットアップされています。開発者がコードをチェックインするたびに、コンパイルが行われます。
これで、アプリケーションをテスターに提供し始めることができる段階になりました。私たちは ClickOnce を使用してアプリケーションを配布したいと考えています。これは、テスターがアプリケーションをテストするときに最新のビルドを入手できるようにするためです。
CruiseControl.NET でそれを実現する方法が見つかりません。ビルドの実行には MSBUILD を使用しています。
解決 2
ご協力ありがとうございました。私たちが実装した最終的なソリューションは、すべての回答から少しずつ取り入れました。
単純なバッチ ファイルを使用すると、複数の環境での作業を簡単に処理できることがわかりました。これを行うための最良の方法であるとは言いませんが、与えられたシナリオと要件では、これはうまく機能しました。「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 の開発者が意図したとおりには動作していない可能性がありますが、実際には動作します。昨日これを動作させる必要がある場合、それがあなたが探しているソリューションになる可能性があります。幸運を!
他のヒント
これを完了したので、開始するためのヒントをいくつか提供します。
注意すべき 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 共有または任意の場所にコピーすることだけで、準備は完了です。
これらの MSBuild パラメーターを使用してビルドするように CruiseControl.NET に指示できます。
次に、CruiseControl.NET ビルド タスクを使用して、生成された展開ファイルを取得し、FTP または UNC 共有にコピーする必要があります。これにはカスタムの小さな C# コンソール プログラムを使用しますが、Powershell スクリプトも同様に簡単に使用できます。
昨年、私が取り組んでいた ClickOnce プロジェクトでこれを行ったのを覚えています。理解するのに永遠に時間がかかったのを覚えていますが、ここにあります。私がスクリプトで実行したかったのは、開発環境を指す別のインストーラーと、本番環境用の別のインストーラーを生成することでした。それだけでなく、既存のクライアントが新しいバージョンがあることを「認識」できるように、正しいバージョン管理情報を挿入する必要がありました。これが 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>
お役に立てれば
CCNET.config msbuild タスクで ${CCNetLabel} を渡すことができるだけでも、大きな改善となります。
msbuild で ClickOnce マニフェスト生成タスクを使用したいと考えています。このプロセスは少し長くなるので、いくつかのリンクを紹介します。ここにあります msdn のリファレンス そして サンプル記事 できれば始めてください。