ci in the mobile world (한글번역)
DESCRIPTION
CI in the Mobile World 프리젠테이션을한글로 번역한 자료입니다.TRANSCRIPT
목차
• CI 란 무엇인가?
• 모바일 월드에서 CI 의 이득
• CI 설정
• Android
• iPhone
• 아직 진행중인 작업들
• Perfecto Mobile
• Test Flight App
광고 #1
• RIIS LLC
• Based in Southfield, MI
• Clients
• Fandango
• DTE
• Comerica
• BCBSM
• Mobile Development
• DTE Outage Maps
• BroadSoft Front Office Assistant
광고 #2
CI 란 무엇인가?
• 모든 것을 자동화
• 가능한 한 자주 빌드
• 이른 시간 내, 자주 빌드
• 보통 체크인 할 때마다
CI 란 무엇인가?
• 자동화는 ….
• 빌드
• 단위 테스트
• 기능 테스트
• 모바일 단말 테스트
• 코드 커버리지
• 배포
CI 의 이득
• 더 적은 에러
• iPhone vs. Andriod 이야기
• 수동 테스트는 더 이상 없음
• 회귀 테스트를 내장
Goal
CI 설정
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI Server
• Jenkins 는 사실상의 산업 표준
• 현재 최상의 선택 (기준)
• 플러그인의 개수
• 쉬운 사용법
• Android 와 iPhone 앱 둘 다에 좋음
CI Server
• http://jenkins-ci.org/ 에서 다운로드
• 커맨드 라인에서 “java –jar jenkins.war” 실행
• 브라우저에서 Jenkins 열기
http://localhost:8080
• Hudson 의 명복을 빕니다.
CI Server
CI Server
• Manage Jenkins 하위메뉴의 Configure System
• ant, JDK, 안드로이드 SDK 패스 추가
• Manage Jenkins 하위메뉴의 Plugin Manager
• Xcode, GitHub 그리고 TestFlight 설치
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
소스코드 저장소
• 제공하는 것들
• 안정성
• 버전 콘트롤 등
• Subversion (SVN) 또는 GitHub
• Android 프로젝트를 위한 SVN
• iPhone 프로젝트를 위한 GitHub
SVN
• SVN 호스트에 새 프로젝트 생성
SVN
• 간단히 오른 클릭을 사용하는 tortoise svn 을 사용하면,
import 라고 한다.
• 표준 트렁크 태그와 svn 의 브렌치는 프로젝트 root 에
없기 때문에 Jenkins 안의 build.xml 경로를 지정해야
함을 주의하라.
GitHub
• github.com 에서 다운로드
• 아래 명령어로 새로운 ssh key 를 생성
ssh-keygen –t rsa –C “your-email”
• 프롬프트가 나오면 패스워드 입력
• GitHub.com 의 account settings,
SSH public keys, SSS Key 를 클릭
• id_rsa.pub (public key) 의 내용을 복사하고 입력한 후
Add key 를 클릭
GitHub 계속.
• 저장소를 생성하기 위해서
• github.com 에서 create a repository 클릭
• 필요한 필드 채우기
• git init 실행 : 소스코드 디렉토리에서
• git add : 파일이 추가될 때
• git commit – m “메시지” : 저장소에 변경사항 기록
• git push : GitHub 에 push 하기 위해서
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
Android 테스트 프로젝트 생성
• AndroidCIDemo 라는 프로젝트를 새로 생성하고,
Build a free-style software project 선택
Android 테스트 프로젝트 설정
• SVN 상세정보 입력
• Jenkins 는 입력한 URL 에 연결하지 못하면 경고하는데,
가장 일반적인 이유는 credential 문제로 연결하지
못하는 것이다. credential box 를 클릭하고 입력하라.
Android 테스트 프로젝트 설정 계속.
• Build tab 아래에 프로젝트를 실제로 build/run 하는
명령이 필요하다.
• Add build step 을 클릭하고 execute shell 를 선택.
local.properties 파일을 생성하기 위해 android update 명령은
반드시 실행되어야 한다. 구문은 다음과 같다 :
[path_to_android_sdk]/tools/android update project –p ./[path_to_build.xml]
• android tool 이 이미 path 에 있고 build.xml 파일이 루트에 있다면,
명령어는 다음과 같다.
android update project –p ./
• 다른 빌드 단계로 Invoke Ant 를 추가하고, target : debug 를 추가하라.
build.xml 파일이 루트에 있지 않다면 advanced 를 클릭하고, build file 필드에
그 경로를 지정하라.
빌드
현재(아래 화면에서) 프로젝트 빌드 그리고
희망컨데 에러 없이 실행된다.
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
단위 테스트
• Android 에서 단위 테스트를 위해 우리는 JUnit
프레임워크의 내장 기능을 사용한다.
기능 테스트
• 우리는 Android 기능 테스트를 위해 Robotium 을 사용한다.
• Robotium 은 매우 빠르고 쉽게 기능테스트를 작성할 수 있도록 만든
테스트 프레임워크이다. 또한 테스트코드 작성에 적은 지식을 가진
팀원들도 테스트 코드를 작성할 수 있다.
• Robotium 을 구현하기 위해 테스트 프로젝트 필드 패스에 Robotium 을
추가해야 한다.
Android 프로젝트에 대한 수정사항
• 단위 테스트와 기능 테스트 모두 같은 방법으로 실행된다.
• Jenkins 를 통해 android tests 를 실행하기 위해서 빌드중 에뮬레이터를
실행할 필요가 있다.
• Build Environment 아래의 Run an Android emulator during build 를 선택.
android avd 를 사용하는 emulator 를
이미 생성했다면, Run existing emulator
를 선택하고, 그렇지 않다면
Run emulator with properties 를 선택.
• OS 버전, 화면밀도(density), 화면 해상도를
지정.
• 헤드없이 실행하기 위해,
Common emulator options 의
Show emulator window 체크 해제
수정사항 계속.
• 다른 실행 명령어 쉘 추가:
[path_to_android_sdk]/tools/android update test-project
–p ./[path_to_test_project] –m ./[path_to_main_project].
• 그리고, 인스톨 테스트를 디버깅하기 위해 ant target 를 변경
(루트에 있지 않다면 필드 파일을 바꿀 것을 잊지 말것)
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
다중 설정 잡(job)
• Jenkins 는 설정 조합에 따라 실행할 수 있도록 변수 지정에 의한
잡 매트릭스를 생성할 수 있다.
• Android 를 위해서는 단말간의 동일한 앱 동작을 보장하기 위해
여러 다른 에뮬레이터로 기능 테스트를 수행 할 수 있다.
설정 표(conf. matrixes)
• Jenkins 에서 새로운 프로젝트를 생성하고
matrix configuration job 를 선택
• 설정의 모든 것은 하나 또는 더 많은 설정표(conf. matrixes) 를
추가해야만 할 때를 제외하면 우리가 테스트를 실행하기
위한 job 을 생성할 때와 같다.
설정 표(conf. matrixes) 계속.
• Configuration Matrix 탭 아래의 add axis 를 선택
• Jenkins 는 이름과 값을 물어보는데, 예제로 다른 OS 버전과
화면심도를 가진 에뮬레이터를 생성하는 것을 선택할 수 있다.
• 이 표는 실제로 4개의 다른 에뮬레이터가 될 것이다.
에뮬레이터 설정
• 지금 우리가 할 일은 어려운 값들 대신에 에뮬레이터를 위해
인자로 생성한 변수들을 사용하는 것이다.
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
Android 배포
• Jenkins에서 빌드된 apk 를 email 로 발송하기 위해서 우리는
email-ext 라 불리는 Jenkins 플러그인을 사용한다.
• 플러그인을 다운로드 하려면 home 스크린,
manage Jenkins manage plugins 으로 간다.
available 을 클릭하면, Jenkins 는 email-extension 플러그인을
다운로드 한다.
이메일 설정
• android debug project 에서 Editable Email Notification 탭까지
아래로 스크롤 해서 체크박스를 선택
• 수신자, 제목, 메시지를 선택하고, Attachments 에는 **/*.apk 를 입력
• advanced add a trigger
on success 를 클릭하고
who it should be sent to
선택
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
iPhone 테스트 프로젝트 생성
• Build a free-style 옵션으로 IPhoneCIDemo 잡을 생성
iPhone 테스트 프로젝트 설정
• 소스코드 콘트롤(Soruce Code Man.) 탭에서 GitHub 선택
• Repository URL 필드에 프로젝트를 위한 GutHub URL 을 복사하고
기본 브랜치가 아닌 경우 브랜치를 지정
iPhone 테스트 프로젝트 설정 계속.
• build 탭에서 XCode 빌드 단계 추가
• 빌드하기 원하는 XCode 타겟을 변경하고 루트가 아닌경우
프로젝트 디렉토리와 파일을 지정
• XCode SDK 필드를 채우고 default 또는 debug 설정을 변경
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
단위 테스트
• iPhone 단위테스트를 위해 우리는 표준 OCunit 테스트
프레임워크를 사용한다.
• Jenkins 로부터 단위테스트를 실행하기 위해서 우리는
ruby 스크립트를 사용한다. 이 스크립트는 UI를 터치하는
그 어떤 테스트도 수행할 수 없다.
• XCode OCunit 테스트를 JUnit 테스트로 컨버팅 하는 Ocunit2junit 는
Christian Hedin 에 의해 만들어진 스크립트이다. Jenkins 는 현재
표준 OCunit 프레임워크를 이해하지 못한다.
iPhone 프로젝트를 위한 변경
• Jenkins 에서 ruby 스크립트가 동작하려면 Xcode 프로젝트에 가서
테스트 타겟을 위한 build setting 아래의 test host 값을 제거해야 한다.
• 새로운 build step 추가:
xcodebuild -target yourtarget -configuration Debug -sdk
iphonesdk | [path_to_ruby_script]/ocunit2junit.rb
• Publish JUnit test result report 를 선택하고,
test-report/*.xml 을 입력
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
기능 테스트
• RIIS 는 CI 로 부터 우리의 기능테스트를 수행하기 위해
FoneMonkey 를 사용한다.
• FoneMonkey 는 스크립트 레코딩 과
확인 단계 추가로 비교적 쉽게
자동화된 테스트를 만들 수
있게 하는 iOS 툴이다.
FoneMonkey
• FoneMonkey 를 구현하기 위해 첫 번째로 프라이머리 타깃을
복사하여 새로운 타깃을 만들어야 한다. FoneMonkey 를 사용한다.
• FoneMonkey Zip 파일을 다운로드하고 새 타깃에 그것을 추가.
• FoneMonkey 타깃의 build phases 탭 아래 binary, libraries
탭으로 이동
• + 버턴을 클릭하고 CoreGraphics.framework 과
QuartzCore.framework 를 추가
• libxml2.dylib 와 SenTestingKit.framework 도 추가
• 마지막으로 Build Settings 탭에서 Linking 섹션까지 아래로
스크롤하고 Other Linker Flags 를 –all_load 로 세팅
FoneMonkey 계속.
• XCode 실행 없이 커맨드 라인으로부터 FoneMonkey 를 실행하기
위해 우리는 TestRunner 를 생성이 필요하다.
• FoneMonkey 타깃의 새로운 타깃을 생성
• 빌드 단계 아래에 TestRunner 타깃을 실행하는 스크립트 추가
• 커맨드 라인으로부터 이 타깃을 실행할 수 있고, 그것은
당신을 위해 FoneMonkey 테스트를 수행할 것이다.
export FONEMONKEY_HOME=~/[Location_of_Fone_Monkey]
export FAMILY=[iphone|ipad]
export LOG_FILE="$PROJECT_DIR/$TARGETNAME.log“
export FONEMONKEY_ENV=$FONEMONKEY_HOME/FoneMonkeyRunner.plist rm -f "$LOG_FILE“
$FONEMONKEY_HOME/bin/iphonesim launch "$CODESIGNING_FOLDER_PATH" -verbose -sdk
$IPHONEOS_DEPLOYMENT_TARGET -family $FAMILY -stderr “ $LOG_FILE" -env
"$FONEMONKEY_ENV“
FoneMonkey
• FoneMonkey TestRunner 를 실행하는 명령어는
xcodebuild –target TestRunnerTargetName –sdk
iPhonesimulatorsdk –configuration Debug
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
iPhone 배포
• 새로운 빌드 단계를 추가하고 Xcode 를 선택
• 일반필드를 추가하고 빌드 IPA 를 선택하고 keychain 도 잠금 해제.
keychain 의 패스워드를 지정해야 할 것이다.
iPhone 배포
• 빌드 단계 실행 쉘을 추가하고 다음의 명령어를 추가:
• 팀 토큰과 API 토큰은 당신의 testflight 계정 으로부터 얻을 수 있다.
cd $WORKSPACE/build/Release-iphoneos/ curl
http://testflightapp.com/api/builds.json-F file=@[IPA_FILE_NAME] -F
api_token='[API_TOKEN]' -F team_token='[TEAM_TOKEN]' -F
notes='This is an auto deploy build from Jenkins!' -F notify=True -F
distribution_lists='[DISTRIBUTION_LIST]
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
CI 에 대한 요구사항
끝맺음
• 진행중인 작업들
• Executable Requirements
• Perfecto Mobile (http://www.perfectomobile.com)
• Test Flight App (https://testflightapp.com/)
• Demo
http://www.infoq.com/presentations/Continuous-Integration-in-the-Mobile-World
※ infoq.com 의 동영상 강좌와 슬라이드가 있는 원문
역자 첨부
http://www.infoq.com/presentations/Continuous-Integration-in-the-Mobile-World
• infoq.com 의 동영상 강좌와 슬라이드가 있는 원문
• 동일한 내용을 slideshare 에 올린 내용
http://www.slideshare.net/godfreynolan/ci-in-the-mobile-world
• git 의 codemash 소스
https://github.com/riis/RIIS-CodeMash
• git 의 codemash 소스
https://github.com/riis/RIIS-CodeMash
역자 요약Requirement Android iPhone
CI Server Jenkins Jenkins
소스코드 저장소 SVN, Git SVN, Git
프로젝트 빌드 Android SDK XCode SDK
단위 테스트 JUnit test framwork OCunit -> Ocunit2junit -> JUnit
기능 테스트 Robotium for Android FoneMonkey
모바일 단말 테스트 상동 상동
배포 Jenkins + email-ext Jenkins + testflightapp.com