이 문서에서는 cruisecontrol과 subversion을 이용하여 CI 하는 방법을 알아보도록 한다.
CI tool의 사용 이유
소스 한부분의 변경은 소스 전체에 영향을 줄 수 있다. 지속적인 통합을 통해 이를 조기에 발견할수 있도록한다.
지속적인 통합을 통해 소스의 퀄리티 향상시키고 항상 동작가능한 상태로 만든다.
CruiseControl?
http://cruisecontrol.sourceforge.net/
CruiseControl is a framework for a continuous build process. It includes, but is not limited to, plugins for email notification, Ant, and various source control tools. A web interface is provided to view the details of the current and previous builds.
Tomcat 설정
Cruisecontrol의 설정괴는 별개로 web 에서 빌드된 UsingEditor를 곧바로 접근가능하도록 tomcat을 설정한다.
이렇게 하는 이유는 jaxer에서 해당 project의 산출물에 접근하여 unittest 하기 위해서임.
tomcat 의 auto deploy webapps를 아래와 같이 cruisecontrol의 projects 로 변경하여 알아서 deploy되도록 수정
- <Host name="localhost"
- appBase="CRUISECONTROL_HOME\projects"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
CruiseControl 설치
- download from http://cruisecontrol.sourceforge.net/download.html
- unzip
- cruisecontrol.bat 혹은 cruisecontrol.sh 에서 원하는 port에서 cruisecontorl이 실행되도록 수정. (본인은 -jmxport 9091 -webport 9090 -rmiport 1099 로 설정 되어있음.)
- CRUISECONTROL_HOME/cruisecontrol.bat 실행
- http://127.0.0.1:9090/dashboard 에서 현재 상황을 알수 있음.
CruiseControl 설정
cruisecontrol directory안에 /projects라는 directory가 있는데 해당 directory에 scheduling을 하고자하는 /projects 에 build 하기를 원하는 project checkout.
본 project에서는 editor trunk 와 이를 사용하기 위한 UsingEditor branch 를 checkout한다.
- cd projects
- svn co http://source.daumcorp.com/private/powerEditor/trunk daumeditor_trunk_1.2
- svn co http://source.daumcorp.com/private/powerEditor/RelateProject/UsingEditor/trunk/newservice testeditor_trunk_1.2
cruisecontrol(이하 cc) 를 실행하면 이 svn project의 변경 유무를 확인하고 자동으로 빌드하게 된다.
이에 대한 부분을 아래에서 바로 설명하도록 한다.
tomcat에서 context설정 필요없이 접근 가능하도록 webroot인 newservice에서 checkout 하도록 함!
config.xml 설정
config.xml만 작성 할 수 있으면 cc의 사용법은 다 알고있다고 생각하면 된다. 자세한 설정에 대한 내용은 http://cruisecontrol.sourceforge.net/main/configxml.html 에서 확인 할 수 있다.
* cc의 기본 config.xml에 connectfour라는 project 예시가 있으니 참고.
config.xml 작성하기
- <cruisecontrol>
- <project>
- <plugin />
- <modificationset> ... </modificationset>
- <schedule> ... </schedule>
- <log> ... </log>
- <publishers> ... </publishers>
- </project>
- </cruisecontrol>
config.xml은 보통 위와같은 형태로 구성되는데, build하고자 하는 project마다 하나의 <project > 설정이 필요하다.
project안의 각각의 node를 설명하면
- plugin - 사용하고자 하는 plugin을 설정. svn을 사용하기 위해서 아래와 같이 plugin설정을 하면 된다.
- modificationset - build를 수행 할 것인지 아닌지 확인하는 node. svn, cvs repository나 특정 directory의 변경이 있을경우, build를 수행하도록 설정이 가능.
- schedule - modificationset에서 project의 변경이 확인됬다면 schedule안에 정의된 것들이 실행된다.
- log - cc의 log에 junit result같은 log를 추가로 포함하기를 원할 때 사용
- publishers - build완료 후 build결과를 원하는 형식으로 report하는 방법을 기술하는 부분. 산출물을 뽑는다던가 messanger, mail 같은 방법으로 결과를 report 할 수 있다.
svn 설정
cc에서 svn에 접근하기 위해서는 svn plugin설정이 필요하다. 관련 library는 이미 cc에 포함되있으니 config.xml에 아래 두줄만 추가해주면 된다.
- <plugin name="svn" classname="net.sourceforge.cruisecontrol.sourcecontrols.SVN"/>
<plugin name="svnbootstrapper" classname="net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper"/>
editor의 config.xml
아래 config파일을 간략히 설명하면,
- 30초마다 두곳의 svn repository 를 확인해서 변경사항이 확인되면 5분 뒤에 build를 진행한다.
- build를 할때는 먼저 두 project를 repository부터 update 한 후 build-release.ant 의 build_cc task를 실행하도록한다.
- build가 끝나면 ${jaxer.home}/tmp/${test.projectname}_test-results 에 생성된 testcase log를 cc의 기본 log파일에 merge한다.
- build가 끝나면 publishers에 등록된 artifactspublisher를 실행하는데 이 publisher는 빌드로 생성된 파일들을 artifact directory로 복사하는 역할을 한다.
이렇게 빌드가 완료되면 cc의 dashboard 상에서 build 의 성공/실패, test 결과, 산출물의 내용들을 확인 할 수 있다.
config.xml
- <cruisecontrol>
<property name="jaxer.home" value="JAXER_HOME"/>
<project name="testeditor_trunk_1.2" buildafterfailed="true">
<property name="test.projectname" value="EDITOR_PATH"/>
<property name="editor.projectname" value="USINGEDITOR_PATH"/>
<plugin name="svn" classname="net.sourceforge.cruisecontrol.sourcecontrols.SVN"/>
<plugin name="svnbootstrapper" classname="net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper"/>
<listeners>
<currentbuildstatuslistener file="logs/${test.projectname}/status.txt"/>
</listeners>
<modificationset quietperiod="30">
<svn localWorkingCopy="projects/${test.projectname}"/>
<svn localWorkingCopy="projects/${editor.projectname}"/>
</modificationset>
<schedule interval="300">
<composite>
<exec command="svn" workingdir="projects/${test.projectname}" args="update" />
<exec command="svn" workingdir="projects/${editor.projectname}" args="update" />
<ant anthome="apache-ant-1.7.0"
buildfile="projects/${editor.projectname}/build/build-release.ant" target="build_cc"/>
</composite>
</schedule>
<log>
<merge dir="${jaxer.home}/tmp/${test.projectname}_test-results"/>
</log>
<publishers>
<artifactspublisher
dest="artifacts/${test.projectname}"
file="logs/${test.projectname}/unittest_result.html"/>
<artifactspublisher
dest="artifacts/${test.projectname}"
file="projects/${test.projectname}/editor.html"/>
<artifactspublisher
dest="artifacts/${test.projectname}"
subdirectory="SNAPSHOT"
dir="projects/${test.projectname}/SNAPSHOT"/>
</publishers>
</project>
</cruisecontrol>
출처 : http://iamdanielkim.springnote.com/pages/2194796
'Management > Linux' 카테고리의 다른 글
org.apache.httpd: Already loaded (1) | 2012.02.12 |
---|---|
[펌] Git - SVN Crash Course (2) | 2010.12.16 |
[VirtualBox] /usr/lib/virtualbox/VirtualBox (0) | 2010.11.30 |
[ SVN ] Svn 경로 변경. (4) | 2010.11.09 |
select / FD_SET / FD_Zero / FD_IsSet 레퍼런스 (0) | 2010.08.04 |