2007-10-08
MSBuild with Cruise Control .Net
지속적인 통합(Continuous Integration)은 최근에 읽고 있는 책마다 항상 등장하는 단어다. 요약하자면 빌드 머신에 적당한 CI도구를 설치해두면 누가 커밋할 때마다 소스를 체크아웃해서 빌드하고 테스트를 실행한다는 것이다. 그러나, 우리 팀처럼 테스트가 거의 없고, 커밋 직전에 항상 최신 버전을 다운받아서 컴파일이 잘 되는지만 체크하는 정도의 통합 수준을 갖고 있는 조직에서는 그다지 효용성이 있어 보이지 않을 수 있다. (물론 빌드 안하고 커밋하는 개발자를 보유하고 있다면 이야기가 달라진다) 그런데 Cruise Control.Net을 사용하면 상상만 했던 이상적인 빌드 시스템 그 이상을 손쉽게 구현할 수 있다. 단순 배치 파일 실행에서부터, 소스코드 체크아웃은 물론, 버전 넘버를 붙이고, 빌드가 성공하면 소스 저장소에 태그를 붙이기도 하고, 웹기반의 히스토리 관리에서부터 위 그림에서 보이듯 그래프 기반의 뷰도 제공한다. 나아가서 일전에는 실패했던 MSN 연동도 된다! 시험삼아서 구글코드에 올려둔 raknet_wrapper 프로젝트를 체크아웃받아서 빌드하는 스크립트를 만들어봤다.
<cruisecontrol>
<workingDirectory>d:\works\ccnet</workingDirectory>
<artifactDirectory>d:\works\ccnet\artifact</artifactDirectory>
<modificationDelaySeconds>2</modificationDelaySeconds>
<triggers>
<intervalTrigger seconds="10"/>
</triggers>
<sourcecontrol type="svn">
<trunkUrl>https://raknet-wrapper.googlecode.com/svn/trunk/</trunkUrl>
<workingDirectory>d:\works\ccnet\build</workingDirectory>
<username>----</username>
----
</sourcecontrol>
<msbuild>
<workingDirectory>d:\works\ccnet\build</workingDirectory>
raknet_wrapper.sln
<buildArgs>/p:Configuration=Release /v:diag</buildArgs>
<targets>Rebuild</targets>
<logger>d:\works\ccnet\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>
<tasks>
<msbuild>
<workingDirectory>d:\works\ccnet\build</workingDirectory>
raknet_wrapper.sln
<buildArgs>/p:Configuration=Release /v:diag</buildArgs>
<targets>Build</targets>
<logger>d:\works\ccnet\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>
</tasks>
<xmllogger />
</cruisecontrol>
기능을 정리해보자면 * 10초마다 최신 소스가 커밋되어있는지 체크 * 최초 실행시 리빌드 * MSBuild 와의 연동 정도에 불과하다. 아직 IIS를 설치해보질 못해서 웹 대시보드를 구경해보진 못했다. 이 정도랑 웹에서 빌드 버튼만 제공하면 사내 빌드 머신에 빨리 도입해봐야겠다. 참고자료:
- [Step by Step] 지속적인 통합(Continuous Integration) - 마이크로소프트웨어 2006년 5월 컬럼
- Visual C++을 위한 지속적인 통합 빌드 서버