CCNETでの継続的インテグレーション (^o^)
現在の開発での自動ビルドはデイリービルドとナイトリービルドの両方を行っている。デイリービルドではデバッグビルドを行い、レポートを収集する。ナイトリービルドではリリースビルドを行い、バイナリパッケージのzipファイルとソースコードパッケージのzipファイルに落とし込んでいる。このようにしておけば、いつでもリリース可能な状態がキープできる。
以下はビルドファイル構成の一部。プロジェクト名とかは実際のものから変更してあるのでご了承を。
ソリューションに追加しているデイリービルド用のビルドファイル
<?xml version="1.0" encoding="utf-8" ?> <project name="CCNetIntegration" default="ccnet-build"> <!-- CCNetワーキングディレクトリ --> <property name="ccnet.working.dir" value="C:\CCNetIntegration\NAgile.Daily" /> <!-- ターゲットビルドファイルのインクルード --> <include buildfile="NAgile.build" /> <!-- ターゲットビルドの実行とCCNetワーキングディレクトリのクリーンアップ --> <target name="ccnet-build" description="CCNET Integration"> <property name="create.assemblyinfo" value="true" /> <property name="web.root.dir" value="${ccnet.working.dir}/src" /> <call target="cleanall" /> <call target="reporting" /> <delete> <fileset basedir="${ccnet.working.dir}"> <include name="*" /> <exclude name="vssver.scc" /> <exclude name="mssccprj.scc" /> </fileset> </delete> <delete dir="${ccnet.working.dir}/lib" failonerror="false" /> <delete dir="${ccnet.working.dir}/sql" failonerror="false" /> <delete dir="${ccnet.working.dir}/src" failonerror="false" /> </target> </project>
ソリューションに追加しているナイトリービルド用のビルドファイル
<?xml version="1.0" encoding="utf-8" ?> <project name="CCNetIntegration" default="ccnet-build"> <!-- CCNetワーキングディレクトリ --> <property name="ccnet.working.dir" value="C:\CCNetIntegration\NAgile.Nightly" /> <!-- ターゲットビルドファイルのインクルード --> <include buildfile="NAgile.build" /> <!-- ターゲットビルドの実行とCCNetワーキングディレクトリのクリーンアップ --> <target name="ccnet-build" description="CCNET Integration"> <property name="create.assemblyinfo" value="true" /> <property name="web.root.dir" value="${ccnet.working.dir}/src" /> <call target="cleanall" /> <call target="release" /> <call target="package" /> <delete> <fileset basedir="${ccnet.working.dir}/"> <include name="*" /> <exclude name="vssver.scc" /> <exclude name="mssccprj.scc" /> </fileset> </delete> <delete dir="${ccnet.working.dir}/lib" failonerror="false" /> <delete dir="${ccnet.working.dir}/sql" failonerror="false" /> <delete dir="${ccnet.working.dir}/src" failonerror="false" /> </target> </project>
ビルドサーバーのccnet.config
<cruisecontrol> <project> <name>NAgile.Daily</name> <workingDirectory>C:\CCNetIntegration\NAgile.Daily</workingDirectory> <artifactDirectory>C:\CCNetIntegration\NAgile.Daily</artifactDirectory> <webURL>http://ccnetserver/ccnet/</webURL> <externalLinks> <externalLink name="Welcome to CruiseControl.NET " url="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET" /> </externalLinks> <modificationDelaySeconds>2</modificationDelaySeconds> <publishExceptions>true</publishExceptions> <triggers> <intervalTrigger seconds="60" buildCondition="IfModificationExists" /> </triggers> <sourcecontrol type="vss" autoGetSource="true" applyLabel="true"> <executable>C:\Program Files\Microsoft Visual SourceSafe\SS.EXE</executable> <project>$/NAgile</project> <username>admin</username> <password>hogehoge</password> <ssdir>C:\VSS</ssdir> <workingDirectory>C:\CCNetIntegration\NAgile.Daily</workingDirectory> <culture>ja-JP</culture> </sourcecontrol> <tasks> <nant> <executable>C:\nant-0.85\bin\nant.exe</executable> <baseDirectory></baseDirectory> <buildArgs></buildArgs> <nologo>false</nologo> <buildFile>NAgile.ccnet.daily.build</buildFile> <logger>NAnt.Core.XmlLogger</logger> <targetList> <target>ccnet-build</target> </targetList> <buildTimeoutSeconds>1200</buildTimeoutSeconds> </nant> </tasks> <publishers> <merge> <files> <file>build\net-1.1.win32\Mold-1.0-debug\bin\NAgile.Tests.dll-results.xml</file> <file>build\net-1.1.win32\Mold-1.0-debug\bin\NAgile-ncover.xml</file> <file>build\net-1.1.win32\Mold-1.0-debug\bin\NAgile-vil.xml</file> <file>build\net-1.1.win32\Mold-1.0-debug\bin\NAgile-fxcop.xml</file> <file>build\net-1.1.win32\Mold-1.0-debug\bin\NAgile-simian.xml</file> </files> </merge> <xmllogger logDir="buildlogs" /> <email from="buildmaster@nagile.com" mailhost="yourMailHostServer" includeDetails="TRUE"> <users> <user name="tsune" group="buildmaster" address="nagiler@gmail.com"/> </users> <groups> <group name="buildmaster" notification="always"/> <group name="developers" notification="change"/> </groups> </email> </publishers> </project> <project> <name>NAgile.Nightly</name> <workingDirectory>C:\CCNetIntegration\NAgile.Nightly</workingDirectory> <artifactDirectory>C:\CCNetIntegration\NAgile.Nightly</artifactDirectory> <webURL>http://ccnetserver/ccnet/</webURL> <externalLinks> <externalLink name="Welcome to CruiseControl.NET " url="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET" /> </externalLinks> <modificationDelaySeconds>2</modificationDelaySeconds> <publishExceptions>true</publishExceptions> <triggers> <filterTrigger startTime="23:30" endTime="23:45" buildCondition="IfModificationExists"> <trigger type="intervalTrigger" seconds="60" /> <weekDays> <weekDay>Monday</weekDay> <weekDay>Tuesday</weekDay> <weekDay>Wednesday</weekDay> <weekDay>Thursday</weekDay> <weekDay>Friday</weekDay> <weekDay>Saturday</weekDay> </weekDays> </filterTrigger> </triggers> <sourcecontrol type="vss" autoGetSource="true" applyLabel="true"> <executable>C:\Program Files\Microsoft Visual SourceSafe\SS.EXE</executable> <project>$/NAgile</project> <username>admin</username> <password>hogehoge</password> <ssdir>C:\VSS</ssdir> <workingDirectory>C:\CCNetIntegration\NAgile.Nightly</workingDirectory> <culture>ja-JP</culture> </sourcecontrol> <tasks> <nant> <executable>C:\nant-0.85\bin\nant.exe</executable> <baseDirectory></baseDirectory> <buildArgs></buildArgs> <nologo>false</nologo> <buildFile>NAgile.ccnet.nightly.build</buildFile> <logger>NAnt.Core.XmlLogger</logger> <targetList> <target>ccnet-build</target> </targetList> <buildTimeoutSeconds>1200</buildTimeoutSeconds> </nant> </tasks> <publishers> <merge> <files> <file>build\net-1.1.win32\Mold-1.0-debug\bin\NAgile.Tests.dll-results.xml</file> </files> </merge> <xmllogger logDir="buildlogs" /> <email from="buildmaster@nagile.com" mailhost="yourMailHostServer" includeDetails="TRUE"> <users> <user name="tsune" group="buildmaster" address="nagiler@gmail.com"/> </users> <groups> <group name="buildmaster" notification="always"/> <group name="developers" notification="change"/> </groups> </email> </publishers> </project> </cruisecontrol>