Windows Azure 向け自動ビルド CruiseControl.NET, MSBuild プロジェクトファイル サンプル

現在の手元の環境において自動ビルドは CruiseControl.NET 1.6 → MSBuild で実現している。
VisualStudio上でソリューション全体のリビルドを行うのと同じ操作については、ソリューションファイルを直接呼び出している。「パッケージ作成」を含むそれ以外の細かな処理については ccnet.build という独自の MSBuild プロジェクトファイルを作っている。

(Team Foundation Server 2010 にしようと思い環境は大体作成したものの、中央のソースコード管理を Subversion より移行できず断念中。でも MSBuild ベースで作成しておけば移行は簡単なはず!ということで晒しておきます。パッケージ作成のためのターゲット名やプロパティの指定については、参考になるかと。そしてこれを参考にするような人は、多分コメントや中身の指定を読み解けると思うので、本文では詳細は解説しません。)

cnet.config に記述するプロジェクトファイルの断片。大きな流れは以下の通り。

  1. Assemblyinfo.cs に対するバージョン番号の埋め込み
  2. Debugビルド
  3. 自動単体テスト
  4. Releaseビルド
  5. パッケージ作成
  6. バージョン番号を元に戻しておく
<project> <name>Contoso TheAnswer Trunk</name> <category>Contoso.TheAnswer</category> <workingDirectory>C:\Builds\ccnet\theanswer-svn\trunk</workingDirectory> <artifactDirectory>C:\BuildLogs\ccnet\theanswer-svn\trunk</artifactDirectory> <state type="state" directory="C:\CCNetState" /> <webURL>http://build2010.contoso.com/ccnet/server/local/project/Contoso%20TheAnswer%20Trunk/ViewProjectReport.aspx</webURL> <triggers> <intervalTrigger seconds="120" /> <!-- ここに指定した秒毎にチェック --> </triggers> <modificationDelaySeconds>2</modificationDelaySeconds> <prebuild> <!-- チェックアウト前に実行するコマンドがもしあればここに記述する --> </prebuild> <sourcecontrol type="svn"> <trunkUrl>https://svnrepo.contoso.com/theanswer-svn/trunk</trunkUrl> <executable> <cb:SVN /> </executable> <timeout>3600000</timeout> <!-- millisecond --> </sourcecontrol> <!-- バージョン番号生成ルール --> <labeller type="assemblyVersionLabeller" incrementOnFailure="true" major="2" minor="9" /> <tasks> <!-- configのコピー と バージョン番号の埋め込み --> <msbuild> <executable> <cb:MSBUILD4 /> </executable> <projectFile>ccnet.build</projectFile> <targets>UpdateAssemblyInfo</targets> </msbuild> <msbuild> <executable> <cb:MSBUILD4 /> </executable> <projectFile>ccnet.build</projectFile> <targets>CopyAutobuildConfig</targets> </msbuild> <!-- デバッグビルドと自動テスト --> <msbuild> <executable> <cb:MSBUILD4 /> </executable> <projectFile>ccnet.sln</projectFile> <buildArgs>/noconsolelogger /p:Platform="Any CPU" /p:Configuration=Debug /v:diag</buildArgs> <targets>Rebuild</targets> <timeout>600</timeout> <logger> <cb:MSBUILDLOGGER /> </logger> </msbuild> <msbuild> <executable> <cb:MSBUILD4 /> </executable> <projectFile>ccnet.build</projectFile> <targets>UnitTests</targets> <timeout>1200</timeout> </msbuild> <!-- リリースビルド --> <msbuild> <executable> <cb:MSBUILD4 /> </executable> <projectFile>ccnet.sln</projectFile> <buildArgs>/noconsolelogger /p:Platform="Any CPU" /p:Configuration=Release /v:diag</buildArgs> <targets>Rebuild</targets> <timeout>600</timeout> <logger> <cb:MSBUILDLOGGER /> </logger> </msbuild> <!-- 発行 --> <msbuild> <executable> <cb:MSBUILD4 /> </executable> <projectFile>ccnet.build</projectFile> <targets>Publish</targets> <timeout>1200</timeout> </msbuild> <!-- バージョン番号を元に戻す --> <msbuild> <executable> <cb:MSBUILD4 /> </executable> <projectFile>ccnet.build</projectFile> <targets>RevertAssemblyInfo</targets> </msbuild> </tasks> <publishers> <merge> <files> <file>C:\BuildLogs\ccnet\theanswer-svn\trunk\testResults.trx</file> </files> </merge> <xmllogger /> <!-- Email publisher は使わず、開発者はCCTrayを使って監視すること --> </publishers> <externalLinks></externalLinks> </project>

ccnet.build の中身。個別の処理のほとんどはこの中に記述している。

<?xml version="1.0" encoding="utf-8"?> <!-- にほんご認識用コメント(エディターが文字コードを認識しやすいよう先頭に日本語文字列のコメントを埋め込んでいる) --> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <VisualStudioDir>C:\Program Files (x86)\Microsoft Visual Studio 10.0\</VisualStudioDir> <MSTest>$(VisualStudioDir)Common7\IDE\mstest.exe</MSTest> <Subversion>C:/Program Files/TortoiseSVN/bin/svn.exe</Subversion> <CodeMetrics>$(VisualStudioDir)Team Tools\Static Analysis Tools\FxCop\Metrics.exe</CodeMetrics> <AssemblyCompany>Contoso Inc.</AssemblyCompany> <AssemblyProduct>The Answer Project 3.0</AssemblyProduct> <AssemblyCopyright>Copyright (C) Contoso Inc. 2012</AssemblyCopyright> </PropertyGroup> <Import Project="MSBuildCustomTasksForMsTest\CustomTasks.tasks" /> <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MsBuild.Community.Tasks.Targets" /> <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" /> <!-- CruiseControl.NET 経由で呼ばれなかった場合の既定値を設定 --> <PropertyGroup Condition="'$(CCNetProject)'==''"> <CCNetProject>Test Project</CCNetProject> <CCNetWorkingDirectory>C:\temp</CCNetWorkingDirectory> <CCNetArtifactDirectory>C:\temp</CCNetArtifactDirectory> <CCNetBuildCondition></CCNetBuildCondition> <CCNetLabel>1.0.0.0</CCNetLabel> <CCNetBuildDate>2007-1-1</CCNetBuildDate> <CCNetBuildTime>00:00:00</CCNetBuildTime> </PropertyGroup> <!-- 自動単体テスト --> <Target Name="UnitTests"> <Message Text="自動単体テストの実行" /> <!-- 下のMSTest 実施にあたっての resultfile を指定する --> <Delete Files="$(CCNetArtifactDirectory)\testResults.trx" /> <!-- テスト設定 ccnet.testsettings で指定した プレフィックステキスト を指定する --> <!-- テスト設定は /runconfig: オプションを利用して mstest.exe に引き渡す --> <RemoveDir Directories="$(CCNetArtifactDirectory)\ccnetAutoTest" /> <RunAllTestsInSolution MSTest="$(MSTest)" SolutionFile="ccnet.sln" Parmaters="/resultsfile:$(CCNetArtifactDirectory)\testResults.trx /runconfig:ccnet.testsettings" ExcludeProject="" Configuration="Debug" /> </Target> <!-- バージョン番号を更新したAssemblyInfo.cs を生成する --> <Target Name="UpdateAssemblyInfo"> <Message Text="Update AssemblyInfo.cs version to $(CCNetLabel)" /> <AssemblyInfo CodeLanguage="CS" ComVisible="false" AssemblyDelaySign="false" CLSCompliant="false" AssemblyCompany="$(AssemblyCompany)" AssemblyProduct="$(AssemblyProduct)" AssemblyCopyright="$(AssemblyCopyright)" AssemblyVersion="$(CCNetLabel)" AssemblyFileVersion="$(CCNetLabel)" OutputFile="Contoso.TheAnswer.Lib\Properties\AssemblyInfo.cs" AssemblyTitle="Contoso.TheAnswer.Lib" Guid="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" /> </Target> <!-- バージョン番号の更新を元に戻す --> <ItemGroup> <AssemblyInfoFiles Include="*\Properties\AssemblyInfo.cs" /> </ItemGroup> <Target Name="RevertAssemblyInfo"> <Message Text="Revert AssemblyInfo.cs version to $(CCNetLabel)" /> <Exec Command="&quot;$(Subversion)&quot; revert @(AssemblyInfoFiles, ' ')" /> </Target> <!-- 発行結果を、バージョン番号付きのフォルダに格納する--> <Target Name="Publish"> <!-- PublishDir に対し 末尾のバックスラッシュは必要なので注意 --> <!-- Azure パッケージの作成のターゲット名は "Publish" , *.cscfg の選択は TargetProfile によって行われる --> <MSBuild Projects="Contoso.TheAnswer\Contoso.TheAnswer.ccproj" Targets="Publish" Properties="Configuration=Debug;TargetProfile=Debug;PublishDir=C:\BuildOutput\$(CCNetProject).Debug.$(CCNetLabel)\;AzurePublishProfile=Contoso.TheAnswer\Profiles\Debug.azurePubxml" /> <MSBuild Projects="Contoso.TheAnswer\Contoso.TheAnswer.ccproj" Targets="Publish" Properties="Configuration=Release;TargetProfile=Release;PublishDir=C:\BuildOutput\$(CCNetProject).Release.$(CCNetLabel)\;AzurePublishProfile=Contoso.TheAnswer\Profiles\Release.azurePubxml" /> <!-- Web 配布パッケージの作成のターゲット名は "Package" --> <MSBuild Projects="Contoso.TheAnswer.OnpremiseWeb\Contoso.TheAnswer.OnpremiseWeb.csproj" Targets="Package" Properties="Configuration=Debug" /> <Copy SourceFiles="Contoso.TheAnswer.OnpremiseWeb\obj\Debug\Package\Contoso.TheAnswer.OnpremiseWeb.zip" DestinationFiles="C:\BuildOutput\$(CCNetProject).Debug.$(CCNetLabel).OnpremiseWeb.zip" /> <MSBuild Projects="Contoso.TheAnswer.OnpremiseWeb\Contoso.TheAnswer.OnpremiseWeb.csproj" Targets="Package" Properties="Configuration=Release" /> <Copy SourceFiles="Contoso.TheAnswer.OnpremiseWeb\obj\Release\Package\Contoso.TheAnswer.OnpremiseWeb.zip" DestinationFiles="C:\BuildOutput\$(CCNetProject).Release.$(CCNetLabel).OnpremiseWeb.zip" /> </Target> </Project>

上記の MSBuild プロジェクトファイルは CruiseControl.NET から呼んでいるが、修正後の確認は以下のようなバッチを利用して行っている。

SET msbuild="C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" %msbuild% ccnet.build /t:UpdateAssemblyInfo %msbuild% ccnet.build /t:UnitTests %msbuild% ccnet.build /t:Publish

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。