Programming/CI

Cruise Control

Jared 2009. 11. 2. 13:50

CruiseControl은 CI용 tool임과 동시에 개별 환경에 맞는 build process를 구성할 수 있는 확장 가능한 framework이다. CI tool과 source control system, build tool의 상관 관계는 무척이나 밀접한데, 다양한 plug-in들을 통해 CVS, SVN, Git, Visual Source Safe등등의 source control system을 지원하고 Ant, Maven, Rake, 그리고 Xcode 및 실행 가능한 build tool이 CruiseControl에서 사용될 수 있다.

기본적으로 CruiseControl은 config.xml이라고 불리는 환경 설정 파일에서 CruiseControl 사용을 위한 project, plugin, property, dashboard등의 설정을 하게 되며, 일반적으로 CruiseControl이 최적의 성능을 발휘할 수 있는 환경은 다음과 같다.
  • Ant 또는 Maven을 이용하여 빌드를 관리
  • CVS나 SVN을 이용하여 소스 통합과 버전 관리
  • UnitTest framework을 사용하여 test case를 관리
CruiseControl의 특징
  • 저장소와 build source를 동기화 시켜준다.
  • 빌드 후 결과를 웹으로 확인 가능하며, 메일등의 다른 수단을 이용하여 개발자 또는 관리자에게 전송이 가능하다.
  • UnitTest 결과를 별도의 보고서로 확인가능하다.

CruiseControl의 실행
config.xml의 설정이 완료되면 빌드 시스템을 실행시켜야 한다. 직접적인 실행은 INSTALL_DIR/main/bin/cruisecontrol.sh을 실행시키면 되지만, 대부분 프로직트에서 정해진 build 주기를 참고하여 cron을 이용하여 실행되도록 하는 것이 일반적이다.

이 때 CruiseControl은 저장소를 확인하고 변경된 사항이 있는 경우 로컬 소스 디렉토리를 업데이트하고 새로 빌드를 수행하게 된다. 이 때 저장소를 확인하는 주기는 대체로 5분이며 이 때문에 개발자가 소스를 저장소에 커밋한 후 5분 정도의 지연이 발생하게 된다.
빌드가 성공적으로 끝난 경우이든 실패론 끝난 경우이든 빌드에 대한 보고서는 항상 작성되게 되어 있으나, 이 둘의 차이점은 실패인 경우 소스가 수정되지 않은 경우 5분마다 빌드 주기에 의해 빌드 실패에 대한 보고서가 계속 생성되며 이에 대한 noti도 계속 발생하기 때문에 실패 보고서에 대한 소스 수정을 빨리하는 것이 좋겠다.

인용:
http://cruisecontrol.sourceforge.net

CruiseControl 설치 및 운용 초급편

설치하기 전에...
Subversion client, Maven 2.0.10 설치
Subversion client 및 Maven의 실행 경로를 환경 변수에 저장
CruiseControl을 이용하여 빌드할 소스를 저장소에서 checkout한다. (/app2/cruise/SBM_LEGACY/LEGACY)

설치
설치는 간단히 압축된 binary를 받아 적당한 경로에 압축을 풀어 놓으면 된다. (http://cruisecontrol.sourceforge.net/gettingstartedbindist.html 참고)

다만 해당 문서에서는 찾을 수 없는데, dashboard를 위해 jetty 서버를 구동하게 되어 있으므로 jetty 서버의 포트 구성 정보를 수정해야 하는 경우가 있다.
jetty의 포트 구성 정보는 /app2/cruise/cruisecontrol/lib 디렉토리내에 jetty*.xml을 전부 연고 port 구성된 부분을 현재 서버에서 사용하지 않는 적당한 포트로 수정한다. (8080, 8081, 8009 -> 9080, 9081, 9009)

설정 예
221.146.204.112 장비에 설치된 CruiseControl의 설정 (/app2/cruise/cruisecontrol/config.xml) 예

01.<cruisecontrol>
02.<project name="sbm_legacy">
03. 
04.<plugin name="svn" classname="net.sourceforge.cruisecontrol.sourcecontrols.SVN"/>
05.<plugin name="svnbootstrapper" classname="net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper"/>
06. 
07.<listeners>
08.<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
09.</listeners>
10. 
11.<bootstrappers>
12.</bootstrappers>
13. 
14.<modificationset quietperiod="180">
15.<svn localWorkingCopy="/app2/cruise/SBM_LEGACY/LEGACY"/>
16.</modificationset>
17. 
18.<schedule interval="60">
19.<maven2 mvnscript="/usr/local/apache-maven-2.2.1/bin/mvn" pomfile="/app2/cruise/SBM_LEGACY/LEGACY/pom.xml" goal="clean install"/>
20.</schedule>
21. 
22.<log>
23.<merge dir="projects/${project.name}/target/test-results"/>
24.</log>
25. 
26.<publishers>
27.</publishers>
28. 
29.</project>
30.</cruisecontrol>
Subversion plugin의 설정
1.<plugin name="svn" classname="net.sourceforge.cruisecontrol.sourcecontrols.SVN"/>
2.<plugin name="svnbootstrapper" classname="net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper"/>
저장소의 갱신 주기 및 저장소 위치 지정
1.<modificationset quietperiod="180">
2.<svn localWorkingCopy="/app2/cruise/SBM_LEGACY/LEGACY"/>
3.</modificationset>
빌드 주기 및 Maven 경로 설정
1.<schedule interval="60">
2.<maven2 mvnscript="/usr/local/apache-maven-2.2.1/bin/mvn" pomfile="/app2/cruise/SBM_LEGACY/LEGACY/pom.xml" goal="clean install"/>
3.</schedule>

config.xml 설정과 관련된 더 자세한 사항은 http://cruisecontrol.sourceforge.net/main/configxml.html에서 확인할 수 있다.

실행
CruiseControl 실행 후 http://221.146.204.112:9080/dashboard에 접속하면 CruiseControl dashboard에 접근이 가능하다. 별도의 인증은 필요하지 않으며 보안 상의 이유로 인증이 가능한 지는 좀 더 알아봐야 한다.

Dashboard #1

Dashboard #2

Build summary

Build history

자동 실행 로그
01.[cc]Nov-09 10:51:55 Project       - Project sbm_legacy:  in build queue
02.[cc]Nov-09 10:51:55 jectController- sbm_legacy Controller: build progress event: in build queue
03.[cc]Nov-09 10:51:55 BuildQueue    - now adding to the thread queue: sbm_legacy
04.[cc]Nov-09 10:51:55 Project       - Project sbm_legacy:  bootstrapping
05.[cc]Nov-09 10:51:55 jectController- sbm_legacy Controller: build progress event: bootstrapping
06.[cc]Nov-09 10:51:55 Project       - Project sbm_legacy:  checking for modifications
07.[cc]Nov-09 10:51:55 jectController- sbm_legacy Controller: build progress event: checking for modifications
08.[cc]Nov-09 10:51:55 Project       - Project sbm_legacy:  No modifications found, build not necessary.
09.[cc]Nov-09 10:51:55 Project       - Project sbm_legacy:  idle
10.[cc]Nov-09 10:51:55 jectController- sbm_legacy Controller: build progress event: idle
11.[cc]Nov-09 10:51:55 Project       - Project sbm_legacy:  next build in 1 minutes
12.[cc]Nov-09 10:51:55 Project       - Project sbm_legacy:  waiting for next time to build
13.[cc]Nov-09 10:51:55 jectController- sbm_legacy Controller: build progress event: waiting for next time to build

Gmail을 이용한 build report
gmail의 경우 SMTP를 이용하기 위해서는 tls 인증이 필요하지만 CruiseControl의 경우 tls 인증을 지원하지 않는다.
대신 다음과 같이 설정하여 SSL을 이용하여 build report를 전달할 수 있다.

01.<publishers>
02.    <email buildresultsurl="http://221.146.204.112:9080/dashboard/tab/build/detail/sbm_legacy"
03.            mailhost="smtp.gmail.com" mailport="465"
04.            username="apacps.real" password="password"
05.            returnaddress="apacps.real@gmail.com"
06.            skipusers="true" usessl="true">
07.        <always address="apacps.real@gmail.com"/>
08.        <failure address="apacps.real@gmail.com"/>
09.        <success address="apacps.real@gmail.com"/>
10.    </email>
11.</publishers>