위메프에서 DevOps를 적용하기 위해서 공부하고 경험했던 내용을 정리한 자료입니다. DevOps를 왜 해야 하는 지, 그리고, 정확히 DevOps가 뭔지 이해하기 위해서 DevOps의 유래, CAMS/CALMS, 또, Gene Kim의 The three ways와 Patrick의 4 Areas에 대해서 설명하고 DevOps의 다양한 패턴에 대해서 설명했습니다.
그리고, Facebook, Flickr, Etsy, Netflix, Google에서는 어떻게 개발하고 배포 하는 지 사례를 설명 드리고 마지막엔 위메프에서 1년 동안 DevOps를 적용하기 위해 어떤 노력들을 했는 지 설명하려 노력했습니다.
DevOps를 적용하려 고민하는 분들께 조금이나마 도움이 되었으면 좋겠습니다.
위메프에서 DevOps를 적용하기 위해서 공부하고 경험했던 내용을 정리한 자료입니다. DevOps를 왜 해야 하는 지, 그리고, 정확히 DevOps가 뭔지 이해하기 위해서 DevOps의 유래, CAMS/CALMS, 또, Gene Kim의 The three ways와 Patrick의 4 Areas에 대해서 설명하고 DevOps의 다양한 패턴에 대해서 설명했습니다.
그리고, Facebook, Flickr, Etsy, Netflix, Google에서는 어떻게 개발하고 배포 하는 지 사례를 설명 드리고 마지막엔 위메프에서 1년 동안 DevOps를 적용하기 위해 어떤 노력들을 했는 지 설명하려 노력했습니다.
DevOps를 적용하려 고민하는 분들께 조금이나마 도움이 되었으면 좋겠습니다.
The New DevOps Designers: Cloud and The Big RethinkJames Urquhart
Virtualization and Cloud Computing are changing the focus of IT Operations. No longer able to focus on servicing application needs event-by-event, the modern IT ops professional has to set them themselves apart through automation and design.
The New DevOps Designers: Cloud and The Big RethinkJames Urquhart
Virtualization and Cloud Computing are changing the focus of IT Operations. No longer able to focus on servicing application needs event-by-event, the modern IT ops professional has to set them themselves apart through automation and design.
Experitest-Infosys Co-Webinar on Mobile Continuous IntegrationExperitest
Experitest & Infosys held a co-webinar, discussing Continuous Integration & Mobile Performance Test Strategies, Tools and Certification services that can guarantee a quality app for the end user.
개발은 혼자 할 수 있을까? 혹은 개발자들끼리 할 수 있을까? 저는 아니라고 생각합니다. 개발은 개발에 관여된 모든 부서와 종사자들이 함께하는 겁니다. 개발자가 어떻게 하냐에 따라 SE와 QA 그리고 심지어 Sales 까지 하나의 팀으로 공동의 목표를 쫓아 시너지를 낼 수 있습니다. 저는 그렇게 믿습니다.
Travis-ci를 이용한 CI/CD와 도커를 이용한 Jenkins for Android 구성하기인수 장
Travis CI 를 이용해서 Github 에 소스에 변경사항이 생기면 Buiild & Test 를 통해서 결과를 slack 에 알림을 주는 방법을 설명합니다. 많은 회사에서 이미 사용중인 Jenkins를 Docker로 이용해서 Android CI/CD를 하는 방법을 소개하고자 합니다.
이번 월간 웨비나에서는 AWS 클라우드를 통해 어떻게 손쉽게 소프트웨어를 개발하고, 배포하는 과정을 자동화 할 수 있는지를 알아 봅니다. 이를 위해 Amazon.com의 소프트웨어 개발 과정 상의 경험과 이를 토대로 만들어진 AWS CodeDeploy와 CodePipeline 서비스를 소개해 드리고, 이를 통해 EC2 인스턴스 뿐만 아니라 기존 서버에 손쉽게 배포하는 방법을 알려드립니다. 본 세션을 통해 클라우드를 통한 민첩하고 빠른 개발 및 배포를 통해 진화된 데브옵스(DevOps) 프로세스를 정립할 수 있는 방법을 안내해 드립니다.
1. CI in the Mobile World
Godfrey Nolan
RIIS LLC
godfrey@riis.com
2. 목차
• CI 란 무엇인가?
• 모바일 월드에서 CI 의 이득
• CI 설정
• Android
• iPhone
• 아직 진행중인 작업들
• Perfecto Mobile
• Test Flight App
3. 광고 #1
• RIIS LLC
• Based in Southfield, MI
• Clients
• Fandango
• DTE
• Comerica
• BCBSM
• Mobile Development
• DTE Outage Maps
• BroadSoft Front Office Assistant
13. CI Server
• Manage Jenkins 하위메뉴의 Configure System
• ant, JDK, 안드로이드 SDK 패스 추가
• Manage Jenkins 하위메뉴의 Plugin Manager
• Xcode, GitHub 그리고 TestFlight 설치
14.
15.
16. CI 에 대한 요구사항
Requirement Android iPhone
CI Server
소스코드 저장소
프로젝트 빌드
단위 테스트
기능 테스트
모바일 단말 테스트
배포
17. 소스코드 저장소
• 제공하는 것들
• 안정성
• 버전 콘트롤 등
• Subversion (SVN) 또는 GitHub
• Android 프로젝트를 위한 SVN
• iPhone 프로젝트를 위한 GitHub
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 를 클릭
21.
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 필드에
그 경로를 지정하라.
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. 이메일 설정
• android debug 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 설정을 변경
46.
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 테스트를 수행할 것이다.
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