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>