Continuous Integration 변경될때마다소프트웨어를빌드하기 조영호카페PJT팀 2008.09.08 youngho.cho@nhncorp.com
목차 1. 빌드자동화 2. Maven 3. 빌드유형과메커니즘 4. 빌드시간을짧게만들기
1. 빌드자동화
빌드자동화 소프트웨어의개발은복잡할지몰라도소프트웨어의전달 (Delivery) 은버튼하나만누르면되는일이되어야합니다 4 / 문서의제목
빌드프로세스 빌드스크립트 문서 제품코드 스크립트 / 실행파일 테스트코드 벤더라이브러리 빌드프로세스 사용자정의라이브러리 문서 5 / 문서의제목 벤더라이브러리
자동화된통합빌드 소스코드컴파일하기 테스트돌리기 통합하기 검사수행하기 데이터베이스통합하기 소프트웨어배포하기 피드백주기 소프트웨어품질을향상시키고위험을줄이기 P ㅖㅔ { [ } ] \ \? / Integrate? / shift 6 / 문서의제목
파삭파삭 (CRISP) 한빌드 완전한 Complete 빌드조리법에지정된재료만으로빌드가능 자급자족하는빌드 반복가능한 Repeatable 빌드파일과빌드입력을버전관리저장소에보관 예전릴리즈를쉽게재생성 정보를주는 Informative 소프트웨어의상태를알수있는정보제공 피드백메커니즘 예약가능한 Schedulable 완전 (Complete) 하고반복가능 (Repeatable) 한빌드는예약가능 특정시간, 일정한시간간격, 이벤트발생시 이식가능한 Portable 어디에서도소프트웨어빌드가가능 빌드가특정 IDE, 기기의 IP 주소, 실행디렉토리에독립 7 / 문서의제목
빌드스크립트를구성하는프로세스 정리 (Clean) 하기 빌드스크립트 소스코드컴파일하기 데이터베이스통합하기 테스트돌리기 P ㅖㅔ { [ } ] \ \ 검사돌리기? / Integrate? / 8 / 문서의제목 shift 소프트웨어배포하기
명령어하나로빌드를수행하기 IDE 에독립된빌드 빌드에필요한모든재료를버전관리저장소에저장 수많은도구중에어느걸골라서사용할것이냐가중요한것이아니라, 손수솔루션을만들지않고만들어져있는빌드도구를잘사용하는것이중요합니다. 9 / 문서의제목
빌드스크립트를 IDE 에서떼어내기 개발자마다 IDE 의차이문제를해결하기어려울수도있기때문 CI 를통한자동화빌드를실행시키기위해 NO 의존 의존 빌드스크립트 10 / 문서의제목
빌드스크립트를 IDE 에서떼어내기 개발자마다 IDE 의차이문제를해결하기어려울수도있기때문 CI 를통한자동화빌드를실행시키기위해 OK 의존 의존 빌드스크립트 11 / 문서의제목
소프트웨어자산을중앙집중화하기 버전관리저장소에모든파일을보관 소스파일이나라이브러리파일과같은컴포넌트 JAR, 라이브러리, DLL과같은외부컴포넌트설정파일어플리케이션초기화데이터파일빌드스크립트와빌드환경설정일부컴포넌트를설치하는스크립트 하지만내컴퓨터에서는잘되는데요 12 / 문서의제목
빌드를빨리실패하게만들기 실패하는법을아는빌드가좋은빌드실패할가능성이높을수록먼저실행빨리실패할수록실행시간감소실패원인을찾기위한시간감소 Feedback 13 / 문서의제목
어떤환경에서라도빌드하기 다양한환경에맞는설정파일들을저장소에보관 로깅정도어플리케이션서버정보데이터베이스연결정보프레임워크설정 빌드스크립트매개변수사용 mvn P junit_alpha clean install war:inplace 설정파일사용 빌드스크립트 local.properties integration.properties qa.properties production. Properties 14 / 문서의제목
전용통합빌드머신사용하기 환경과설정에대한가정감소 내컴퓨터에선작동하는데요 문제방지 빌드를함께할사람구함 저는단일프로세서를가진, 조금오래된컴퓨터인데, 변화를수용할수있고, 지속적인통합서버 통합빌드머신 데이터를꾸준히제공할수있는사람과오랜관계를맺고싶습니다. 버전관리시스템저장소에접근할수있기때문에친구들은제가아주능력있다고합니다. 거만한노트북들과는달리저는하루종일사무실에대기하는것을즐깁니다. 제가마지막으로재부팅된것은 7일하고도더전이었습니다. 게다가곧바로회복되었습니다. 당신을직접만나길기대합니다. 아니면저의수많은원격인터페이스를통해채팅할수도있을겁니다. 15 / 문서의제목
2. Maven 16 / 문서의제목
Maven Convention over Configuration not How but What 17 / 문서의제목
Ant 와 Maven not How but What Declarative Execution POM Model DEMO 18 / 문서의제목
Super POM Convention over Configuration Every POM Inherits Super POM http://maven.apache.org/guides/introduction/introduction-to-the-pom.html 19 / 문서의제목
기본디렉토리레이아웃 project/ src/ main/ java/ test/ java/ Convention over target/ classes/ Configuration pom.xml test-classes/ Surefire-reports/ 20 / 문서의제목
의존성관리 pom.xml <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.2</version> </dependency> </dependencies> 라이브러리를어디에서찾는가? 라이브러리는어디에위치하는가? 21 / 문서의제목
Repository Remote Repository 다양한프로토콜 (file://, http://...) 을사용하여접속중앙저장소는 http://repo1.maven.org http://mvnrepository.com을통해쉽게검색가능 Local Repository 다운로드받은 artifact와최신빌드 artifact 캐시 ${user.home}/.m2/repository 22 / 문서의제목
Phase and Goal Build Lifecycle 은 Phase 의집합 Phase 들은정해진순서에따라순차적으로실행 Phase 는하나이상의 Goal 수행 clean compile test package install deploy 23 / 문서의제목
Phase Clean pre-clean clean post-clean Default validate generate-sources process-sources generate-resources process-resources compile process-classes generate-test-sources process-test-sources generate-test-resources process-test-resources test-compile test prepare-packaging package pre-integration-test integration-test post-integration-test verify install deploy Site pre-site Site post-site site-deploy 24 / 문서의제목
P ㅖ ㅔ? /? / { [ } ] s h if t In t egrate \ \ Phase and Plugin Phase 는작업을완료하기위해연관된 Plugin 호출 mvn compile generate-sources compile test-compile archetype compiler mvn test test package pom.xml surefire mvn install integration-test jar install deploy install 25 / 문서의제목 Lifecycle Phases Plugins
Phase, Plugin, and Goal Plugin은공통목표를가진 Goal들의집합 Goal은하나의태스크 하나이상의 Phase 에바인딩 Phase 에바인딩되지않은 Goal 은 Maven 실행시독립적으로실행가능 Plugin Phase goal goal Phase 실행시자동실행 Plugin goal Maven 실행시파라미터로명시 mvn clean package cobertura:cobertura 26 / 문서의제목
Maven Plugins Maven 은빌드생명주기내에서 Plugin 을실행하는플랫폼 Phase Mojo Plugins process-resources resource maven-resources-plugin compile compile maven-compiler-plugin process-test-resources testresources maven-resources-plugin test-compile testcompile maven-compiler-plpugin test test maven-surefire-plugin package jar maven-jar-plugin install install maven-install-plugin deploy deploy maven-deploy-plugin 27 / 문서의제목
Packaging 형태에따른 Phase-Goal 매핑 Packaging 형태에따른 Default Lifecycle Binding Clean Lifecycle Binding clean clean:clean ejb, ejb3, jar, par, rar, war process-resources compile process-test-resources test-compile test package install deploy resouces:resources compiler:compile resources:testresource compier:testcompile surefire:test jar:jar or war:war etc... install:install deploy:deploy mvn clean package 28 / 문서의제목
Packaging 형태에따른 Phase-Goal 매핑 Packaging 형태에따른 Default Lifecycle Binding ear generate-resources process-resources package install deploy ear:generateapplicationxml resources:resources ear:ear install:install deply:deploy pom package site:attach-descriptor process-resources resources:resources deploy deploy:deploy 29 / 문서의제목
Plugin 을통한 Plugin-Goal 실행 pom.xml 에 plugin 추가후 Maven 실행시파라미터로 plugin:goal 명시 pom.xml <plugin> <groupid>org.codehaus.mojo</groupid> <artifactid>cobertura-maven-plugin</artifactid> <version>2.2</version> <configuration> <formats> <format>xml</format> <format>html</format> </formats> <instrumentation> <excludes> <exclude>**/*unittestsuite.class</exclude> </excludes> </instrumentation> </configuration> </plugin> mvn cobertura:cobertura 30 / 문서의제목
실행순서는? jar packaging mvn clean package cobertura:cobertura 31 / 문서의제목
3. 빌드유형과메커니즘
빌드유형 개인빌드 Private Build 통합빌드 Integration Build 릴리즈빌드 Release Build 33 / 문서의제목
빌드유형 개인빌드 Private Build 개발자빌드 소스코드커밋전실행 버전관리저장소의최신변경사항과수정한코드통합 통합빌드 Integration Build 빌드스크립트 4 로컬에서 통합빌드 를돌린다 1 저장소에서코드를체크아웃한다 릴리즈빌드 Release Build 3 저장소에서변경사항을가져온다 개발자 2 소스코드를변경한다 5 코드를저장소에커밋한다 버전관리저장소 34 / 문서의제목
빌드유형 개인빌드 Private Build 통합빌드 Integration Build 릴리즈빌드 Release Build 팀이저장소에커밋한변경사항과주흐름통합 별도의전용컴퓨터에서실행 Commit Build 10분이내의가장빠른통합빌드컴파일과단위테스트 Secondary Build 속도가느린컴포넌트, 시스템, 성능테스트포함코딩표준준수, 코드복잡도검사와같은자동화된검사포함 35 / 문서의제목
빌드유형 개인빌드 Private Build 통합빌드 Integration Build 릴리즈빌드 Release Build 사용자에게출시할제품준비 한주기나이정표milestone 끝무렵실행 더많은성능및부하테스트포함 인수테스트는반드시포함 사용자의환경에서실행가능한설치매체생성 품질보증팀이사용하는것도가능 36 / 문서의제목
빌드메커니즘 예약자동화 (Scheduled Automation) 유발자동화 (Triggered Automation) 지시자동화 (Command Automation) 37 / 문서의제목
빌드메커니즘 예약자동화 (Scheduled Automation) 유발자동화 (Triggered Automation) 주문형지시자동화 (Command Automation) 38 / 문서의제목
빌드메커니즘 일정기반, 변경사항폴링예약자동화 (Scheduled Automation) 유발자동화 (Triggered Automation) 주문형지시자동화 (Command Automation) 39 / 문서의제목
빌드메커니즘 일정기반, 변경사항폴링예약자동화 (Scheduled Automation) 이벤트주도유발자동화 (Triggered Automation) 주문형지시자동화 (Command Automation) 40 / 문서의제목
빌드유형에따른메커니즘 개인빌드 Private Build 주문형 통합빌드 Integration Build 릴리즈빌드 Release Build 41 / 문서의제목
빌드유형에따른메커니즘 개인빌드 Private Build 주문형 통합빌드 Integration Build 주문형 이벤트주도 일정기반 변경사항폴링 릴리즈빌드 Release Build 42 / 문서의제목
빌드유형에따른메커니즘 개인빌드 Private Build 주문형 통합빌드 Integration Build 주문형 이벤트주도 일정기반 변경사항폴링 릴리즈빌드 Release Build 주문형 일정기반 43 / 문서의제목
4. 빌드시간을짧게만들기
통합빌드지속시간개선방안 확장성, 성능, 난이도에미치는영향 높음중간낮음 개선방안전술우선순위확장성성능난이도 전용통합빌드머신사용하기 1 통합빌드머신의하드웨어사양늘리기 2 테스트성능을개선하기 3 통합빌드를효율적으로만들기 4 하부구조를최적화하기 5 빌드프로세스를최적화하기 6 시스템컴포넌트를따로빌드하기 7 소프트웨어검사성능을개선하기 8 분산된통합빌드를수행하기 9 45 / 문서의제목
테스트성능을개선하기 자동화된빌드를여러범주로나누고다른시간대에테스트실행 단위, 컴포넌트, 시스템테스트 테스트리팩토링 Mock/Stub 사용 단위테스트환경에서사용하기복잡한컴포넌트일경우 오래걸리는통합테스트를별도의테스트스윗으로분리병렬로테스트실행빌드유형에따라테스트를나누어서실행 커밋빌드, 2 차빌드, 전체통합빌드, 릴리즈빌드 네트워크케이블을빼고데이터베이스를종료시키고나서도돌아 가는테스트가진짜단위테스트입니다 46 / 문서의제목
빌드를여러단계로나누기 피드백 피드백생성하기 개발자 피드백메커니즘 변경사항커밋하기 폴링 개발자 서브버전 버전관리저장소 지속적인통합서버 통합빌드머신 빌드스크립트 소스코드컴파일하기, 데이터베이스통합하기, 테스트돌리기, 검사돌리기, 소프트웨어배포하기 개발자 47 / 문서의제목
빌드를여러단계로나누기 개발자 피드백 피드백메커니즘 피드백생성하기 Commit Build ( 가벼운빌드 ) 소스코드컴파일하기, 데이터베이스통합하기, 테스트돌리기, 검사돌리기, 소프트웨어배포하기 변경사항커밋하기 폴링 개발자 서브버전 버전관리저장소 지속적인통합서버 통합빌드머신 개발자 48 / 문서의제목
빌드를여러단계로나누기 개발자 피드백 피드백메커니즘 피드백생성하기 Commit Build ( 가벼운빌드 ) 소스코드컴파일하기, 데이터베이스통합하기, 테스트돌리기, 검사돌리기, 소프트웨어배포하기 변경사항커밋하기 폴링 Commit Build 가 성공하면 개발자 개발자 서브버전 버전관리저장소 지속적인통합서버 통합빌드머신 Secondary Build ( 무거운빌드 ) 더오래걸리는테스트 ( 컴포넌트, 시스템, 기능, 성능 ), 코드적용범위 49 / 문서의제목
빌드를여러단계로나누기 개발자 피드백 변경사항커밋하기 피드백메커니즘 폴링 피드백생성하기 기벼운빌드를먼저실행시키고무거운빌드를나중에실행 빌드시간단축 Commit Build 가 성공하면 Commit Build ( 가벼운빌드 ) 소스코드컴파일하기, 데이터베이스통합하기, 테스트돌리기, 검사돌리기, 소프트웨어배포하기 개발자 개발자 서브버전 버전관리저장소 지속적인통합서버 통합빌드머신 Secondary Build ( 무거운빌드 ) 더오래걸리는테스트 ( 컴포넌트, 시스템, 기능, 성능 ), 코드적용범위 50 / 문서의제목
시스템컴포넌트를따로빌드하기 소프트웨어를더작은하위시스템으로분리개별적인하위시스템을따로빌드하위시스템을별도의프로젝트로구성 하위시스템중하나를마스터프로젝트로설정빌드의존성을설정마스터프로젝트변경시다른프로젝트자동빌드 51 / 문서의제목
Thank you.
Question.