JAVA 환경에서의 CI( 지속적통합 ) 구축사례
목차 Ⅰ. 개요 Ⅱ. 추진배경 Ⅲ. 개발환경구축 ( 도구연계 ) Ⅳ. 도구연계성과 page 2
Ⅰ. 개요 S사 E프로젝트개요 아시아통신시장을목표로통신분야에특화된기능을 Template 기반으로제공하는서비스솔루션개발 도메인 : 차세대이동통신 개발형태 : 시스템통합개발 개발언어 : Java 개발인력 : 약 20 명 개발기간 : 약 10 개월 프로젝트상세 아키텍처특성 J2EE 기반 Open Architecture One DB를통한 True Single View 객체지향 Application Architecture Easy Customization & Configuration 기능적특성 Telco 특화 Framework 기반솔루션 통신프로세스에특화된 Order/Inventory 영역강화 End-to-End Integrated Solution - Customer Care, Billing, Mediation, Rating page 3
Ⅱ. 추진배경 : 1. 기존개발환경 개발및프로젝트관리 형상관리오픈소스도구인 SVN(Subversion) 과이슈 ( 결함 ) 관리오픈소스도구인 Mantis 를활용하여소스코드형상관리및이슈 ( 결함 ) 관리수행 잦은요구사항변경으로인하여개발초기설계된아키텍처가업데이트되지않음 통합빌드 통합담당자를할당하여개발이어느정도완료된시기에통합빌드수행 테스트 각개발자별수동으로코드를작성하여단위테스트수행 기존개발환경구성및개발흐름도 page 4
Ⅱ. 추진배경 : 2. 문제점분석, 계속 1. 개발막바지에이르러통합작업수행 개발자간잘못된의사전달로인해수많은오류발생 각종오류를한꺼번에처리해야만하는 Integration Hell 현상발생 통합시점에이미소스코드가방대해져오류의원인파악및해결을위해많은시간할애 기존통합방식 page 5
Ⅱ. 추진배경 : 2. 문제점분석, 계속 2. 수작업에의한테스트수행 개별단위테스트는수행되지만테스트케이스가보존되지않음 별도의테스트커버리지를측정하지않아테스트수행정도를가늠하기어려움 회귀테스트 * 수행시테스트케이스를새로작성해야하기때문에막대한공수를필요로함 * 회귀테스트 : 개발과테스트를완료한모듈에서오류제거및수정과같은변경이일어날경우, 이러한변경에의해유입된오류가없는지를확인하는일종의반복시험 기존단위테스트방식 1. 테스트코드직접작성 2. 테스트커버리지측정미수행 Java Class method1() method2() method3() Main() { 테스트코드 } 재테스트시테스트수행공수증가 기능변경에대한 Side-Effect 발생가능 테스트시실행된코드의정도파악불가 실행되지않은코드에서결함이발생할가능성내포 page 6
Ⅱ. 추진배경 : 2. 문제점분석, 계속 3. 패키지간의존성관리부족 아키텍처가존재하기는하나, 잦은요구사항변경으로인해최신으로유지되지않음 개별단위테스트및통합빌드를통해도출된결함수정시패키지간의존성을파악하지못하여 Side-effect 발생 패키지간순환의존성존재가의심스러우나이에대한확인및대처방법이없음 기존의존성관리방식 1. 패키지간의존성관리부족 2. 순환의존성확인및대처방안미흡 패키지 A (rev 1) 사용실패 패키지 A 사용 사용 사용 패키지 B (rev 1) 결함해결 패키지 B (rev 2) 패키지 B 결함수정에따른 Side-effect 발생 패키지 B 에대한결함을수정하면서패키지 A 와의의존성을고려하지않아수정된패키지 B 를패키지 A 가제대로사용하지못하는문제발생 소프트웨어의복잡성증가 패키지병행개발및모듈화를저해하는요인이됨 page 7
Ⅱ. 추진배경 : 3. 개선방향 1. 개발막바지에이르러통합작업수행 2. 수작업에의한테스트수행 3. 패키지간의존성관리부족 통합빌드, 단위테스트및테스트 커버리지측정, 디자인품질분석을위한 개발환경구축필요 page 8
Ⅲ. 개발환경구축 : 1. 구축시고려사항 ( 구축제약사항 ) 개발환경구축목적확인 형상관리, 이슈관리, 통합빌드, 단위테스트수행및테스트커버리지측정, 디자인품질분석을아울러수행할수있는통합개발환경필요 자동화대상기능선정 기존의형상관리시스템에서관리중인소스코드들을자동으로빌드하는환경구축 빌드시단위테스트수행및테스트커버리지측정, 디자인품질분석수행필요 -> 해당내용자동화 빌드결과는확인할수있는환경이필요하지만빌드오류의경우담당자확인후이슈등록필요 -> 빌드오류에대한이슈등록은자동화부문에서배제 개별도구선정 선정조건 1: 개발언어에맞는도구선정 - Java 선정조건 2: 오픈소스도구로만구성 도구간연계성파악 기존형상관리시스템인 SVN 및개발서버 (FTP) 와의연계가가능한도구위주로선정 page 9
Ⅲ. 개발환경구축 : 2. CTIP 환경소개 CI (Continuous Integration) 개발기간동안개별개발된모듈에대한빌드를지속적으로수행하기위해 XP(eXtream Programming) 에서도입한빌드자동화개념 CTIP (Continuous Test & Integration Platform) CI 개념에테스트자동화개념을더하여빌드도구, 테스트도구및기타개발시유용한도구들이유기적으로동작하도록묶은도구집합 (Tool Chain) 환경 page 10
Ⅲ. 개발환경구축 : 3. CTIP 환경구성및개발흐름도 개발자 9 이슈관리시스템 (with Mantis) 8 CTIP Tool Chain Build Script (with Ant) 4 스테이징서버 1 개발서버 형상관리 Repository (with SVN) 2 3 Build Scheduling (with CruiseControl) 5 6 7 Unit Test (with JUnit) Test Coverage Analysis (with Clover) Package Dependency Analysis (with JDepend) Unit Test Report Test Coverage Report JDepend Report 1 소스코드개발및관리 2 최신소스코드자동체크아웃 ( 업데이트 ) 3 정해진스케쥴링에따라빌드요청 4 빌드자동수행및배포 6 빌드시커버리지분석자동수행 7 빌드시의존성분석자동수행 8 빌드후문제점확인및등록 ( 통합담당자 ) 9 등록된오류확인및해결 ( 개발자 ) 5 빌드시단위테스트자동수행 page 11
Ⅲ. 개발환경구축 : 4. 개별도구상세 (CruiseControl) CruiseControl: 프로젝트의빌드스케줄링및빌드내역관리를위한오픈소스 CI 도구 CruiseControl 구성요소 CruiseControl Architecture Diagram 1. Build Loop CruiseControl 의 Core 시스템 소스코드의변경또는스케줄링에의해자동수행가능 관리화면을통한명시적인요청에의해수행가능 config.xml 에수행작업과스케줄정보설정 Reporting / Dashboard Web Container 모니터링 사용자 2. Reporting 빌드결과및이력관리 각종빌드산출물 ( 빌드로그, 테스트수행결과, API 문서, 빌드된어플리케이션모듈 ) 에접근가능 xml logs 산출물 빌드결과 (rss, IM, email) 형상관리 Repository 3. Dashboard 설정된모든프로젝트의빌드현황을그래피컬하게제공 Build Loop 소스코드 체크아웃 빌드프로젝트및스케쥴설정 * http://cruisecontrol.sourceforge.net config.xml page 12
Ⅲ. 개발환경구축 : 4. 개별도구상세 (Ant) ANT: 지속적인프로젝트빌드및통합을위한자바기반의자동빌드도구 Ant 개요 샘플빌드파일 (build.xml) 1. Ant 개요 자바기반의자동빌드도구 XML 형식으로빌드스크립트파일작성 <project name= sample" default="compile"> <property name="outputdir" value="/ant/output/sample1" /> 2. Ant 장점 대부분의자바 IDE 에서지원 (de facto standard) 대부분의테스트도구 (Junit, Caltus 등 ) 에서지원 Core 태스크이외에도빌드파일작성에쉽게사용될수있는많은 Optional 태스크제공 뛰어난확장성제공 3. Ant 빌드파일구조 (XML 형식 ) <project>, <property>, <target>, <task> 등의항목으로구성 다양한 <task> 항목기본제공 필요에따라 <task> 항목추가확장가능 http://ant.apache.org/manual/index.html 참조 <target name= init" > <tstamp/> <mkdir dir="${outputdir}/classes" /> </target> <target name="compile" depends= init" > <javac srcdir="./xptoolkit" destdir="${outputdir}/classes" /> </target> </project> * http://ant.apache.org page 13
Ⅲ. 개발환경구축 : 4. 개별도구상세 (JUnit) JUnit: 자동화된단위테스트수행을위한자바기반의오픈소스테스트프레임워크 JUnit 개요 테스트케이스구성및실행흐름 1. JUnit 개요 자바기반의오픈소스테스트프레임워크 Erich Gamma, Kent Beck 에의해서개발 2. JUnit 장점 자동화된단위테스트구현 Ant 와연결하여빌드시자동테스트구현가능 테스트케이스작성을위한여러 API 제공 뛰어난확장성 (Junitee, Cactus, HttpUnit, JUnitPerf) 대부분의자바 IDE 에서지원 (de facto standard) 구성 public class AnotherOperationTest extends TestCase { protected void setup() throws Exception { super.setup(); // 아래의각테스트수행전에처리할작업구현 // 서버연결설정, DB 내용설정, 변수초기화등 } } protected void teardown() throws Exception { super.teardown(); // 아래의각테스트수행후에처리할작업구현 // 서버연결해제, DB 내용초기화등 } public void testoperation1() { // 테스트데이터를이용하여기능호출 // 기능실행결과비교로테스트결과확인 // 여러번의기능호출이가능 // 메소드이름은항상 test 로시작되어야함 } public void testoperation2() { } 테스트시작 실행흐름 Operation1() 테스트 setup() testoperation1() teardown() * http://www.junit.org Operation2() 테스트 setup() testoperation2() teardown() 테스트종료 page 14
Ⅲ. 개발환경구축 : 4. 개별도구상세 (Clover) Clover: JUnit 단위테스트를통해수행된코드의전체코드대비커버리지를분석하기위한테스트커버리지분석도구 Clover 개요 Clover Report 1. Clover 개요 자바기반의테스트커버리지분석툴 CTIP 에서수행하는 JUnit 테스트결과를분석하여전체코드대비몇 % 가테스트되었는지를알수있음 테스트커버리지관련 Metric 정보제공 테스트커버리지 2. Clover 장점 자동화된단위테스트커버리지분석을통해개발대상소프트웨어의품질향상가능 Ant 와연결하여빌드시자동테스트커버리지분석구현가능 Eclipse 플러그인제공으로개발 IDE 에서사용가능 테스트수행된코드 * http://www.atlassian.com/software/clover/ page 15
Ⅲ. 개발환경구축 : 4. 개별도구상세 (JDepend) JDepend: 자바패키지간의존성을분석하고소프트웨어의설계품질을측정하기위한오픈소스도구 JDepend 개요 JDepend Report 1. JDepend 개요 자바기반의디자인품질분석툴 클래스파일을분석하여자바패키지에대한설계품질관련지표제공 패키지간디자인품질지표 2. JDepend 측정항목 Number of Abstract Classes and Interfaces 패키지의확장성분석 Afferent Couplings (Ca) 패키지의책임성분석 Efferent Couplings (Ce) 패키지의독립성분석 Abstractness 패키지의추상화정도분석 Instability 패키지의안정화정도분석 Package Dependency Cycles 순환되는의존성을가지는패키지식별 순환되는의존성을가지는패키지정보 패키지별의존성상세정보 * http://clarkware.com/software/jdepend.html page 16
Ⅲ. 개발환경구축 : 5. 도구연계 ( 설치개요 ) 설치절차 먼저 CruiseControl 을설치한후미리준비된디렉토리복사를통해 CTIP 에서추가적으로필요한프로그램, 설정파일, 라이브러리파일, 디렉토리를생성하고 CruiseControl 설치시생성된기본샘플프로젝트관련파일들을삭제함 1 2 3 4 CruiseControl 설치 CTIP 기본디렉터리복사 CruiseControl 기본빌드프로젝트삭제 CTIP 환경변수설정 설치프로그램실행을통한 CruiseControl(ANT 포함 ) 설치 CTIP 에서사용되는기타 프로그램복사 - Subversion - JUnit - Clover - JDepend 필요설정파일복사 CruiseControl 설치시에생성되는기본빌드프로젝트관련파일삭제 (CruiseControl 기본샘플프로젝트인 connectfour 프로젝트디렉토리삭제 ) CTIP 빌드를위해필요한시스템환경변수설정 (JAVA_HOME, ANT_HOME 등 JVM 및 ANT 실행을위해필요한환경변수설정 ) 필요라이브러리복사 필요디렉토리복사 * CTIP 서버에컴파일을위한컴파일도구는사전에설치되어있어야함 page 17
Ⅲ. 개발환경구축 : 5. 도구연계 ( 연계스크립트 ) 연계스크립트 본사례에서는 CTIP 운영을위해서 config.xml( 구성스크립트 ), pre-build.xml( 빌드스크립트 ), build.xml( 빌드스크립트 ) 3 개의스크립트파일이사용됨 보통한개의구성스크립트와한개의빌드스크립트가사용되나, 본사례의경우여러프로젝트빌드를다른방식으로수행하기위하여두개의빌드스크립트를사용 1 config.xml CruiseControl 에서빌드프로젝트위치및스케줄링을설정하는파일 전체빌드를위한 XXX 프로젝트및 ProFrame Application, Batch, UI, Integration, MiPlatform Web Application 개별빌드를위한프로젝트가설정되어있음 설정된모든프로젝트에대해빌드주기또는빌드시간이설정되어있음 2 pre-build.xml XXX 시스템빌드루트디렉터리및체크아웃설정 config.xml 에설정된각프로젝트를위한 ANT 빌드태스크정의 관련서브버전프로젝트를체크아웃하고 build.xml 에정의되어있는태스크를호출하여빌드수행 3 build.xml 체크아웃을제외한실제 XXX 프로젝트빌드를위한모든 ANT 빌드태스크가정의되어있음 전체빌드를위한태스크및 ProFrame Application, Batch, UI, Integration, MiPlatform Web Application 개별빌드를위한태스크가정의되어있음 Staging 서버디플로이를위한태스크가정의되어있음 JUnit, Clover, JDepend 등프로젝트문서화를위한태스크 * 가정의되어있음 * JUnit, Clover, JDepend와같은도구들은 build.xml에서 task 설정및 property 설정 ( 해당실행파일폴더, 실행후결과저장폴더등 ) 을통해간단히연동가능 page 18
Ⅲ. 개발환경구축 : 5. 도구연계 ( 연계스크립트 ), 계속 1. config.xml ( 구성스크립트 ) 빌드프로젝트관리와스케줄링에대한설정이정의되며, CI 서버인 CruiseControl 에서사용됨. 스케줄링은특정빌드시간을지정하거나빌드 Interval 을지정할수있음 config.xml 파일구조 <cruisecontrol> <project> <bootstrappers/> <modificationset/> <schedule/> <log> <merge/> </log> <publishers> <onsuccess/> <email/> </publishers/> </project> </cruisecontrol> * http://cruisecontrol.sourceforge.net 1) 빌드시간설정예제 <schedule> <ant anthome="apache-ant-1.7.0" </schedule> 2) 빌드 Interval 설정예제 <schedule interval="864000"> <ant anthome="apache-ant-1.7.0" </schedule> buildfile="projects/xxx/pre-build.xml target="build.xxx_ui" /> 10 일 (86,400 초 ) 간격으로 pre-build.xml 빌드파일의 build.xxx_ui 타겟실행 buildfile="projects/xxx/pre-build.xml target="build.xxx.full time= 0200 /> 매일 02 시 00 분에 pre-build.xml 빌드파일의 build.xxx.full 타겟 실행 page 19
Ⅲ. 개발환경구축 : 5. 도구연계 ( 연계스크립트 ), 계속 2. pre-build.xml ( 빌드스크립트 ) SVN 으로부터최신소스를체크아웃하는타겟및빌드타겟이정의되어있으며 CruiseControl 의 config.xml 에스케줄링되어호출됨. 빌드관련타겟은 build.xml 에정의된타겟을호출하는것으로구현됨 3. build.xml ( 빌드스크립트 ) 체크아웃을제외한실제 XXX 프로젝트빌드를위한모든 ANT 빌드태스크가정의되어있음 * 참고. ANT 에서사용하는빌드스크립트기본구조 기본적으로 project, target, task 의집합으로구성됨 (project : target = 1 : n, target : task = 1 : n) 추가적으로 class path 지정을위한 path, 속성값설정을위한 property 와같은요소가사용됨 빌드스크립트구조 <project> <property name="catalina.home" value="c:/tomcat5.5"/> <property name="build.home" value="c:/graph/build"/> <path id="compile.classpath"> <path element location="${catalina.home}/common/classes"/> </path> property path <target name="clean"> <delete dir= ${build.home}"/> </target> <target name="compile"> <mkdir dir= ${build.home}/classes"/> <javac srcdir = ${build.home}/src" destdir = ${build.home}/classes "/> </target> </project> task target target project page 20
Ⅲ. 개발환경구축 : 5. 도구연계 ( 연계스크립트 ), 계속 본사례에서사용된 pre-build.xml 각구성요소별설명예시 구분이름설명 Property xxx.root.dir xxx 빌드루트디렉토리 (D:/CTIP/xxx) 설정 Property xxx.checkout.dir xxx 체크아웃루트디렉토리 (D:/CTIP/xxx/checkout) 설정 Taskdef svntask.properties 서브버전태스크정의 Target build.xxx.full xxx 전체빌드타겟 (1 일간격으로스케줄링됨 ) mi_integration, xxx_ui, integration 빌드및 Staging Server 디플로이수행 Target build.xxx.part xxx 부분빌드타겟 (2 시간간격으로스케줄링됨 ) xxx_ui, integration 빌드및 Staging Server 디플로이수행 Target build.xxx_ui xxx_ui 빌드및 Staging Server 디플로이수행 Target build.mi_integration mi_integration 빌드및 Staging Server 디플로이수행 Target build.integration integration 빌드및 Staging Server 디플로이수행 Target build.batch batch 빌드수행 Target checkout 서브버전으로부터모든프로젝트 (xxx_unittest, mi_integration, xxx_ui, integration) 체크아웃수행 Target checkout.xxx_ui 서브버전으로부터 xxx_ui 프로젝트체크아웃수행 Target checkout.mi_integration 서브버전으로부터 mi_integration 프로젝트체크아웃수행 Target checkout.integration 서브버전으로부터 integration 프로젝트체크아웃수행 page 21
Ⅲ. 개발환경구축 : 5. 도구연계 ( 연계스크립트 ), 계속 본사례에서사용된 build.xml 각구성요소별설명예시 구분이름설명 Property ctip.root.dir CTIP 설치루트디렉토리 (D:/CTIP) Property xxx.checkout.dir 서브버전, FTP 로부터가져온파일을놓아둘디렉토리 Property ant.home Ant 설치디렉토리 Property jdepend.home JDepend 설치디렉토리 Property testresult.dir JUnit 단위테스트결과생성디렉토리 Property clover.dir Clover 테스트커버리지보고서생성디렉토리 TaskDef cloverlib.xml Clover 관련 Ant 태스크정의 TaskDef java2html 자바소스를 html 형태로생성해주는 java2html 관련 Ant 태스크정의 Target compile.proframe.test 프로프레임어플리케이션의 JUnit 테스트케이스를빌드디렉토리로컴파일함 Target run.ctip.proframe.test 프로프레임어플리케이션의 JUnit 테스트케이스를실행함 테스트케이스실행전 / 후에 CTIP WebLogic 서버를시작, 중지함 Target jdepend 오픈소스코드인스펙션지원도구인 JDepend를사용하여패키지간의존성분석 및코드품질결과보고서를생성함 Target clover.report Clover 테스트커버리지보고서를생성함 프로프레임어플리케이션에대한 JUnit 테스트케이스가먼저실행되어테스트결과가생성되어있어야함 page 22
Ⅳ. 도구연계성과 도구연계효과개요 지속적통합자동화 테스트자동화 디자인품질분석자동화 개발자노력, 소프트웨어품질 주요성과 [ 도입전 ] [ 도입후 ] 1. 개발막바지에이르러통합작업수행 수많은오류발생 Integration Hell 현상발생 오류의해결을위해많은시간할애 1. 통합측면 통합소요시간감소 개발자간코드충돌조기발견 통합후오류발생률감소 2. 수작업에의한테스트수행 테스트수행공수증가 기능변경에대한 side-effect 발생 테스트실행정도파악불가 2. 테스트측면 테스트케이스재사용으로인한개발시간단축 테스트코드커버리지증가 3. 패키지간의존성관리부족 결함수정에대한 side-effect 발생 소프트웨어복잡성증가 3. 디자인품질측면 유지보수성증가 ( 기능변경, 결함수정에대한공수감소 ) 아키텍처확장성및재사용성증가 page 23
END of DOCUMENT