ci in the mobile world (한글번역)

61
CI in the Mobile World Godfrey Nolan RIIS LLC [email protected]

Upload: dongsu-kim

Post on 04-Jul-2015

4.471 views

Category:

Technology


2 download

DESCRIPTION

CI in the Mobile World 프리젠테이션을한글로 번역한 자료입니다.

TRANSCRIPT

Page 1: CI in the Mobile World (한글번역)

CI in the Mobile WorldGodfrey Nolan

RIIS LLC

[email protected]

Page 2: CI in the Mobile World (한글번역)

목차

• CI 란 무엇인가?

• 모바일 월드에서 CI 의 이득

• CI 설정

• Android

• iPhone

• 아직 진행중인 작업들

• Perfecto Mobile

• Test Flight App

Page 3: CI in the Mobile World (한글번역)

광고 #1

• RIIS LLC

• Based in Southfield, MI

• Clients

• Fandango

• DTE

• Comerica

• BCBSM

• Mobile Development

• DTE Outage Maps

• BroadSoft Front Office Assistant

Page 4: CI in the Mobile World (한글번역)

광고 #2

Page 5: CI in the Mobile World (한글번역)

CI 란 무엇인가?

• 모든 것을 자동화

• 가능한 한 자주 빌드

• 이른 시간 내, 자주 빌드

• 보통 체크인 할 때마다

Page 6: CI in the Mobile World (한글번역)

CI 란 무엇인가?

• 자동화는 ….

• 빌드

• 단위 테스트

• 기능 테스트

• 모바일 단말 테스트

• 코드 커버리지

• 배포

Page 7: CI in the Mobile World (한글번역)

CI 의 이득

• 더 적은 에러

• iPhone vs. Andriod 이야기

• 수동 테스트는 더 이상 없음

• 회귀 테스트를 내장

Page 8: CI in the Mobile World (한글번역)

Goal

Page 9: CI in the Mobile World (한글번역)

CI 설정

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

Page 10: CI in the Mobile World (한글번역)

CI Server

• Jenkins 는 사실상의 산업 표준

• 현재 최상의 선택 (기준)

• 플러그인의 개수

• 쉬운 사용법

• Android 와 iPhone 앱 둘 다에 좋음

Page 11: CI in the Mobile World (한글번역)

CI Server

• http://jenkins-ci.org/ 에서 다운로드

• 커맨드 라인에서 “java –jar jenkins.war” 실행

• 브라우저에서 Jenkins 열기

http://localhost:8080

• Hudson 의 명복을 빕니다.

Page 12: CI in the Mobile World (한글번역)

CI Server

Page 13: CI in the Mobile World (한글번역)

CI Server

• Manage Jenkins 하위메뉴의 Configure System

• ant, JDK, 안드로이드 SDK 패스 추가

• Manage Jenkins 하위메뉴의 Plugin Manager

• Xcode, GitHub 그리고 TestFlight 설치

Page 14: CI in the Mobile World (한글번역)
Page 15: CI in the Mobile World (한글번역)
Page 16: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 17: CI in the Mobile World (한글번역)

소스코드 저장소

• 제공하는 것들

• 안정성

• 버전 콘트롤 등

• Subversion (SVN) 또는 GitHub

• Android 프로젝트를 위한 SVN

• iPhone 프로젝트를 위한 GitHub

Page 18: CI in the Mobile World (한글번역)

SVN

• SVN 호스트에 새 프로젝트 생성

Page 19: CI in the Mobile World (한글번역)

SVN

• 간단히 오른 클릭을 사용하는 tortoise svn 을 사용하면,

import 라고 한다.

• 표준 트렁크 태그와 svn 의 브렌치는 프로젝트 root 에

없기 때문에 Jenkins 안의 build.xml 경로를 지정해야

함을 주의하라.

Page 20: CI in the Mobile World (한글번역)

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 를 클릭

Page 21: CI in the Mobile World (한글번역)
Page 22: CI in the Mobile World (한글번역)

GitHub 계속.

• 저장소를 생성하기 위해서

• github.com 에서 create a repository 클릭

• 필요한 필드 채우기

• git init 실행 : 소스코드 디렉토리에서

• git add : 파일이 추가될 때

• git commit – m “메시지” : 저장소에 변경사항 기록

• git push : GitHub 에 push 하기 위해서

Page 23: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 24: CI in the Mobile World (한글번역)

Android 테스트 프로젝트 생성

• AndroidCIDemo 라는 프로젝트를 새로 생성하고,

Build a free-style software project 선택

Page 25: CI in the Mobile World (한글번역)

Android 테스트 프로젝트 설정

• SVN 상세정보 입력

• Jenkins 는 입력한 URL 에 연결하지 못하면 경고하는데,

가장 일반적인 이유는 credential 문제로 연결하지

못하는 것이다. credential box 를 클릭하고 입력하라.

Page 26: CI in the Mobile World (한글번역)

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 필드에

그 경로를 지정하라.

Page 27: CI in the Mobile World (한글번역)
Page 28: CI in the Mobile World (한글번역)

빌드

현재(아래 화면에서) 프로젝트 빌드 그리고

희망컨데 에러 없이 실행된다.

Page 29: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 30: CI in the Mobile World (한글번역)

단위 테스트

• Android 에서 단위 테스트를 위해 우리는 JUnit

프레임워크의 내장 기능을 사용한다.

Page 31: CI in the Mobile World (한글번역)

기능 테스트

• 우리는 Android 기능 테스트를 위해 Robotium 을 사용한다.

• Robotium 은 매우 빠르고 쉽게 기능테스트를 작성할 수 있도록 만든

테스트 프레임워크이다. 또한 테스트코드 작성에 적은 지식을 가진

팀원들도 테스트 코드를 작성할 수 있다.

• Robotium 을 구현하기 위해 테스트 프로젝트 필드 패스에 Robotium 을

추가해야 한다.

Page 32: CI in the Mobile World (한글번역)

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 체크 해제

Page 33: CI in the Mobile World (한글번역)

수정사항 계속.

• 다른 실행 명령어 쉘 추가:

[path_to_android_sdk]/tools/android update test-project

–p ./[path_to_test_project] –m ./[path_to_main_project].

• 그리고, 인스톨 테스트를 디버깅하기 위해 ant target 를 변경

(루트에 있지 않다면 필드 파일을 바꿀 것을 잊지 말것)

Page 34: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 35: CI in the Mobile World (한글번역)

다중 설정 잡(job)

• Jenkins 는 설정 조합에 따라 실행할 수 있도록 변수 지정에 의한

잡 매트릭스를 생성할 수 있다.

• Android 를 위해서는 단말간의 동일한 앱 동작을 보장하기 위해

여러 다른 에뮬레이터로 기능 테스트를 수행 할 수 있다.

Page 36: CI in the Mobile World (한글번역)

설정 표(conf. matrixes)

• Jenkins 에서 새로운 프로젝트를 생성하고

matrix configuration job 를 선택

• 설정의 모든 것은 하나 또는 더 많은 설정표(conf. matrixes) 를

추가해야만 할 때를 제외하면 우리가 테스트를 실행하기

위한 job 을 생성할 때와 같다.

Page 37: CI in the Mobile World (한글번역)

설정 표(conf. matrixes) 계속.

• Configuration Matrix 탭 아래의 add axis 를 선택

• Jenkins 는 이름과 값을 물어보는데, 예제로 다른 OS 버전과

화면심도를 가진 에뮬레이터를 생성하는 것을 선택할 수 있다.

• 이 표는 실제로 4개의 다른 에뮬레이터가 될 것이다.

Page 38: CI in the Mobile World (한글번역)

에뮬레이터 설정

• 지금 우리가 할 일은 어려운 값들 대신에 에뮬레이터를 위해

인자로 생성한 변수들을 사용하는 것이다.

Page 39: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 40: CI in the Mobile World (한글번역)

Android 배포

• Jenkins에서 빌드된 apk 를 email 로 발송하기 위해서 우리는

email-ext 라 불리는 Jenkins 플러그인을 사용한다.

• 플러그인을 다운로드 하려면 home 스크린,

manage Jenkins manage plugins 으로 간다.

available 을 클릭하면, Jenkins 는 email-extension 플러그인을

다운로드 한다.

Page 41: CI in the Mobile World (한글번역)

이메일 설정

• android debug project 에서 Editable Email Notification 탭까지

아래로 스크롤 해서 체크박스를 선택

• 수신자, 제목, 메시지를 선택하고, Attachments 에는 **/*.apk 를 입력

• advanced add a trigger

on success 를 클릭하고

who it should be sent to

선택

Page 42: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 43: CI in the Mobile World (한글번역)

iPhone 테스트 프로젝트 생성

• Build a free-style 옵션으로 IPhoneCIDemo 잡을 생성

Page 44: CI in the Mobile World (한글번역)

iPhone 테스트 프로젝트 설정

• 소스코드 콘트롤(Soruce Code Man.) 탭에서 GitHub 선택

• Repository URL 필드에 프로젝트를 위한 GutHub URL 을 복사하고

기본 브랜치가 아닌 경우 브랜치를 지정

Page 45: CI in the Mobile World (한글번역)

iPhone 테스트 프로젝트 설정 계속.

• build 탭에서 XCode 빌드 단계 추가

• 빌드하기 원하는 XCode 타겟을 변경하고 루트가 아닌경우

프로젝트 디렉토리와 파일을 지정

• XCode SDK 필드를 채우고 default 또는 debug 설정을 변경

Page 46: CI in the Mobile World (한글번역)
Page 47: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 48: CI in the Mobile World (한글번역)

단위 테스트

• iPhone 단위테스트를 위해 우리는 표준 OCunit 테스트

프레임워크를 사용한다.

• Jenkins 로부터 단위테스트를 실행하기 위해서 우리는

ruby 스크립트를 사용한다. 이 스크립트는 UI를 터치하는

그 어떤 테스트도 수행할 수 없다.

• XCode OCunit 테스트를 JUnit 테스트로 컨버팅 하는 Ocunit2junit 는

Christian Hedin 에 의해 만들어진 스크립트이다. Jenkins 는 현재

표준 OCunit 프레임워크를 이해하지 못한다.

Page 49: CI in the Mobile World (한글번역)

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 을 입력

Page 50: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 51: CI in the Mobile World (한글번역)

기능 테스트

• RIIS 는 CI 로 부터 우리의 기능테스트를 수행하기 위해

FoneMonkey 를 사용한다.

• FoneMonkey 는 스크립트 레코딩 과

확인 단계 추가로 비교적 쉽게

자동화된 테스트를 만들 수

있게 하는 iOS 툴이다.

Page 52: CI in the Mobile World (한글번역)

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 로 세팅

Page 53: CI in the Mobile World (한글번역)

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“

Page 54: CI in the Mobile World (한글번역)

FoneMonkey

• FoneMonkey TestRunner 를 실행하는 명령어는

xcodebuild –target TestRunnerTargetName –sdk

iPhonesimulatorsdk –configuration Debug

Page 55: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 56: CI in the Mobile World (한글번역)

iPhone 배포

• 새로운 빌드 단계를 추가하고 Xcode 를 선택

• 일반필드를 추가하고 빌드 IPA 를 선택하고 keychain 도 잠금 해제.

keychain 의 패스워드를 지정해야 할 것이다.

Page 57: CI in the Mobile World (한글번역)

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]

Page 58: CI in the Mobile World (한글번역)

Requirement Android iPhone

CI Server

소스코드 저장소

프로젝트 빌드

단위 테스트

기능 테스트

모바일 단말 테스트

배포

CI 에 대한 요구사항

Page 60: CI in the Mobile World (한글번역)

역자 첨부

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

Page 61: CI in the Mobile World (한글번역)

역자 요약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