CI in the Mobile World
Godfrey Nolan
RIIS LLC
godfrey@riis.com
목차
• 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 설치
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
소스코드 저장소
• 제공하는 것들
  • 안정성
  • 버전 콘트롤 등


• 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 하기 위해서
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
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 필드에
 그 경로를 지정하라.
빌드
현재(아래 화면에서) 프로젝트 빌드 그리고
희망컨데 에러 없이 실행된다.
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
단위 테스트
• 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 를 변경
(루트에 있지 않다면 필드 파일을 바꿀 것을 잊지 말것)
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
다중 설정 잡(job)
• Jenkins 는 설정 조합에 따라 실행할 수 있도록 변수 지정에 의한
잡 매트릭스를 생성할 수 있다.
• Android 를 위해서는 단말간의 동일한 앱 동작을 보장하기 위해
여러 다른 에뮬레이터로 기능 테스트를 수행 할 수 있다.
설정 표(conf. matrixes)
• Jenkins 에서 새로운 프로젝트를 생성하고
 matrix configuration job 를 선택
• 설정의 모든 것은 하나 또는 더 많은 설정표(conf. matrixes) 를
 추가해야만 할 때를 제외하면 우리가 테스트를 실행하기
 위한 job 을 생성할 때와 같다.
설정 표(conf. matrixes) 계속.
• Configuration Matrix 탭 아래의 add axis 를 선택
• Jenkins 는 이름과 값을 물어보는데, 예제로 다른 OS 버전과
화면심도를 가진 에뮬레이터를 생성하는 것을 선택할 수 있다.
• 이 표는 실제로 4개의 다른 에뮬레이터가 될 것이다.
에뮬레이터 설정
• 지금 우리가 할 일은 어려운 값들 대신에 에뮬레이터를 위해
인자로 생성한 변수들을 사용하는 것이다.
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
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
 선택
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
iPhone 테스트 프로젝트 생성
• Build a free-style 옵션으로 IPhoneCIDemo 잡을 생성
iPhone 테스트 프로젝트 설정
• 소스코드 콘트롤(Soruce Code Man.) 탭에서 GitHub 선택
• Repository URL 필드에 프로젝트를 위한 GutHub URL 을 복사하고
 기본 브랜치가 아닌 경우 브랜치를 지정
iPhone 테스트 프로젝트 설정 계속.
• build 탭에서 XCode 빌드 단계 추가
• 빌드하기 원하는 XCode 타겟을 변경하고 루트가 아닌경우
 프로젝트 디렉토리와 파일을 지정
• XCode SDK 필드를 채우고 default 또는 debug 설정을 변경
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
단위 테스트
• 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 을 입력
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
기능 테스트
• 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 타깃을 실행하는 스크립트 추가

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
• FoneMonkey TestRunner 를 실행하는 명령어는
xcodebuild –target TestRunnerTargetName –sdk
  iPhonesimulatorsdk –configuration Debug
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
iPhone 배포
• 새로운 빌드 단계를 추가하고 Xcode 를 선택
• 일반필드를 추가하고 빌드 IPA 를 선택하고 keychain 도 잠금 해제.
 keychain 의 패스워드를 지정해야 할 것이다.
iPhone 배포
• 빌드 단계 실행 쉘을 추가하고 다음의 명령어를 추가:


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]



• 팀 토큰과 API 토큰은 당신의 testflight 계정 으로부터 얻을 수 있다.
CI 에 대한 요구사항
   Requirement   Android   iPhone


   CI Server


   소스코드 저장소


   프로젝트 빌드


   단위 테스트


   기능 테스트


   모바일 단말 테스트


   배포
끝맺음
• 진행중인 작업들
   • Executable Requirements
   • Perfecto Mobile (http://www.perfectomobile.com)
   • Test Flight App (https://testflightapp.com/)

• Demo



※ infoq.com 의 동영상 강좌와 슬라이드가 있는 원문
http://www.infoq.com/presentations/Continuous-Integration-in-the-Mobile-World
역자 첨부
• infoq.com 의 동영상 강좌와 슬라이드가 있는 원문
 http://www.infoq.com/presentations/Continuous-Integration-in-the-Mobile-World

• 동일한 내용을 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

CI in the Mobile World (한글번역)

  • 1.
    CI in theMobile World Godfrey Nolan RIIS LLC godfrey@riis.com
  • 2.
    목차 • CI 란무엇인가? • 모바일 월드에서 CI 의 이득 • CI 설정 • Android • iPhone • 아직 진행중인 작업들 • Perfecto Mobile • Test Flight App
  • 3.
    광고 #1 • RIISLLC • Based in Southfield, MI • Clients • Fandango • DTE • Comerica • BCBSM • Mobile Development • DTE Outage Maps • BroadSoft Front Office Assistant
  • 4.
  • 5.
    CI 란 무엇인가? •모든 것을 자동화 • 가능한 한 자주 빌드 • 이른 시간 내, 자주 빌드 • 보통 체크인 할 때마다
  • 6.
    CI 란 무엇인가? •자동화는 …. • 빌드 • 단위 테스트 • 기능 테스트 • 모바일 단말 테스트 • 코드 커버리지 • 배포
  • 7.
    CI 의 이득 •더 적은 에러 • iPhone vs. Andriod 이야기 • 수동 테스트는 더 이상 없음 • 회귀 테스트를 내장
  • 8.
  • 9.
    CI 설정 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 10.
    CI Server • Jenkins는 사실상의 산업 표준 • 현재 최상의 선택 (기준) • 플러그인의 개수 • 쉬운 사용법 • Android 와 iPhone 앱 둘 다에 좋음
  • 11.
    CI Server • http://jenkins-ci.org/에서 다운로드 • 커맨드 라인에서 “java –jar jenkins.war” 실행 • 브라우저에서 Jenkins 열기 http://localhost:8080 • Hudson 의 명복을 빕니다.
  • 12.
  • 13.
    CI Server • ManageJenkins 하위메뉴의 Configure System • ant, JDK, 안드로이드 SDK 패스 추가 • Manage Jenkins 하위메뉴의 Plugin Manager • Xcode, GitHub 그리고 TestFlight 설치
  • 16.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 17.
    소스코드 저장소 • 제공하는것들 • 안정성 • 버전 콘트롤 등 • Subversion (SVN) 또는 GitHub • Android 프로젝트를 위한 SVN • iPhone 프로젝트를 위한 GitHub
  • 18.
    SVN • SVN 호스트에새 프로젝트 생성
  • 19.
    SVN • 간단히 오른클릭을 사용하는 tortoise svn 을 사용하면, import 라고 한다. • 표준 트렁크 태그와 svn 의 브렌치는 프로젝트 root 에 없기 때문에 Jenkins 안의 build.xml 경로를 지정해야 함을 주의하라.
  • 20.
    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 를 클릭
  • 22.
    GitHub 계속. • 저장소를생성하기 위해서 • github.com 에서 create a repository 클릭 • 필요한 필드 채우기 • git init 실행 : 소스코드 디렉토리에서 • git add : 파일이 추가될 때 • git commit – m “메시지” : 저장소에 변경사항 기록 • git push : GitHub 에 push 하기 위해서
  • 23.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 24.
    Android 테스트 프로젝트생성 • AndroidCIDemo 라는 프로젝트를 새로 생성하고, Build a free-style software project 선택
  • 25.
    Android 테스트 프로젝트설정 • SVN 상세정보 입력 • Jenkins 는 입력한 URL 에 연결하지 못하면 경고하는데, 가장 일반적인 이유는 credential 문제로 연결하지 못하는 것이다. credential box 를 클릭하고 입력하라.
  • 26.
    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 필드에 그 경로를 지정하라.
  • 28.
    빌드 현재(아래 화면에서) 프로젝트빌드 그리고 희망컨데 에러 없이 실행된다.
  • 29.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 30.
    단위 테스트 • Android에서 단위 테스트를 위해 우리는 JUnit 프레임워크의 내장 기능을 사용한다.
  • 31.
    기능 테스트 • 우리는Android 기능 테스트를 위해 Robotium 을 사용한다. • Robotium 은 매우 빠르고 쉽게 기능테스트를 작성할 수 있도록 만든 테스트 프레임워크이다. 또한 테스트코드 작성에 적은 지식을 가진 팀원들도 테스트 코드를 작성할 수 있다. • Robotium 을 구현하기 위해 테스트 프로젝트 필드 패스에 Robotium 을 추가해야 한다.
  • 32.
    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 체크 해제
  • 33.
    수정사항 계속. • 다른실행 명령어 쉘 추가: [path_to_android_sdk]/tools/android update test-project –p ./[path_to_test_project] –m ./[path_to_main_project]. • 그리고, 인스톨 테스트를 디버깅하기 위해 ant target 를 변경 (루트에 있지 않다면 필드 파일을 바꿀 것을 잊지 말것)
  • 34.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 35.
    다중 설정 잡(job) •Jenkins 는 설정 조합에 따라 실행할 수 있도록 변수 지정에 의한 잡 매트릭스를 생성할 수 있다. • Android 를 위해서는 단말간의 동일한 앱 동작을 보장하기 위해 여러 다른 에뮬레이터로 기능 테스트를 수행 할 수 있다.
  • 36.
    설정 표(conf. matrixes) •Jenkins 에서 새로운 프로젝트를 생성하고 matrix configuration job 를 선택 • 설정의 모든 것은 하나 또는 더 많은 설정표(conf. matrixes) 를 추가해야만 할 때를 제외하면 우리가 테스트를 실행하기 위한 job 을 생성할 때와 같다.
  • 37.
    설정 표(conf. matrixes)계속. • Configuration Matrix 탭 아래의 add axis 를 선택 • Jenkins 는 이름과 값을 물어보는데, 예제로 다른 OS 버전과 화면심도를 가진 에뮬레이터를 생성하는 것을 선택할 수 있다. • 이 표는 실제로 4개의 다른 에뮬레이터가 될 것이다.
  • 38.
    에뮬레이터 설정 • 지금우리가 할 일은 어려운 값들 대신에 에뮬레이터를 위해 인자로 생성한 변수들을 사용하는 것이다.
  • 39.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 40.
    Android 배포 • Jenkins에서빌드된 apk 를 email 로 발송하기 위해서 우리는 email-ext 라 불리는 Jenkins 플러그인을 사용한다. • 플러그인을 다운로드 하려면 home 스크린, manage Jenkins manage plugins 으로 간다. available 을 클릭하면, Jenkins 는 email-extension 플러그인을 다운로드 한다.
  • 41.
    이메일 설정 • androiddebug project 에서 Editable Email Notification 탭까지 아래로 스크롤 해서 체크박스를 선택 • 수신자, 제목, 메시지를 선택하고, Attachments 에는 **/*.apk 를 입력 • advanced add a trigger on success 를 클릭하고 who it should be sent to 선택
  • 42.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 43.
    iPhone 테스트 프로젝트생성 • Build a free-style 옵션으로 IPhoneCIDemo 잡을 생성
  • 44.
    iPhone 테스트 프로젝트설정 • 소스코드 콘트롤(Soruce Code Man.) 탭에서 GitHub 선택 • Repository URL 필드에 프로젝트를 위한 GutHub URL 을 복사하고 기본 브랜치가 아닌 경우 브랜치를 지정
  • 45.
    iPhone 테스트 프로젝트설정 계속. • build 탭에서 XCode 빌드 단계 추가 • 빌드하기 원하는 XCode 타겟을 변경하고 루트가 아닌경우 프로젝트 디렉토리와 파일을 지정 • XCode SDK 필드를 채우고 default 또는 debug 설정을 변경
  • 47.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 48.
    단위 테스트 • iPhone단위테스트를 위해 우리는 표준 OCunit 테스트 프레임워크를 사용한다. • Jenkins 로부터 단위테스트를 실행하기 위해서 우리는 ruby 스크립트를 사용한다. 이 스크립트는 UI를 터치하는 그 어떤 테스트도 수행할 수 없다. • XCode OCunit 테스트를 JUnit 테스트로 컨버팅 하는 Ocunit2junit 는 Christian Hedin 에 의해 만들어진 스크립트이다. Jenkins 는 현재 표준 OCunit 프레임워크를 이해하지 못한다.
  • 49.
    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 을 입력
  • 50.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 51.
    기능 테스트 • RIIS는 CI 로 부터 우리의 기능테스트를 수행하기 위해 FoneMonkey 를 사용한다. • FoneMonkey 는 스크립트 레코딩 과 확인 단계 추가로 비교적 쉽게 자동화된 테스트를 만들 수 있게 하는 iOS 툴이다.
  • 52.
    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 로 세팅
  • 53.
    FoneMonkey 계속. • XCode 실행 없이 커맨드 라인으로부터 FoneMonkey 를 실행하기 위해 우리는 TestRunner 를 생성이 필요하다. • FoneMonkey 타깃의 새로운 타깃을 생성 • 빌드 단계 아래에 TestRunner 타깃을 실행하는 스크립트 추가 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 테스트를 수행할 것이다.
  • 54.
    FoneMonkey • FoneMonkey TestRunner를 실행하는 명령어는 xcodebuild –target TestRunnerTargetName –sdk iPhonesimulatorsdk –configuration Debug
  • 55.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 56.
    iPhone 배포 • 새로운빌드 단계를 추가하고 Xcode 를 선택 • 일반필드를 추가하고 빌드 IPA 를 선택하고 keychain 도 잠금 해제. keychain 의 패스워드를 지정해야 할 것이다.
  • 57.
    iPhone 배포 • 빌드단계 실행 쉘을 추가하고 다음의 명령어를 추가: 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] • 팀 토큰과 API 토큰은 당신의 testflight 계정 으로부터 얻을 수 있다.
  • 58.
    CI 에 대한요구사항 Requirement Android iPhone CI Server 소스코드 저장소 프로젝트 빌드 단위 테스트 기능 테스트 모바일 단말 테스트 배포
  • 59.
    끝맺음 • 진행중인 작업들 • Executable Requirements • Perfecto Mobile (http://www.perfectomobile.com) • Test Flight App (https://testflightapp.com/) • Demo ※ infoq.com 의 동영상 강좌와 슬라이드가 있는 원문 http://www.infoq.com/presentations/Continuous-Integration-in-the-Mobile-World
  • 60.
    역자 첨부 • infoq.com의 동영상 강좌와 슬라이드가 있는 원문 http://www.infoq.com/presentations/Continuous-Integration-in-the-Mobile-World • 동일한 내용을 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
  • 61.
    역자 요약 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