SlideShare ist ein Scribd-Unternehmen logo
1 von 63
Sangkyoon Nam, Architecture Owner
nam.sangkyoon@nbt.com
빠르고 지속적으로 전달하기
Continuous Delivery for Android
2012년 11월 첫 출시, 대략 2주 간격으로 업데이트 진행
반복!
01
03
02
04
COMMIT
애플리케이션에 대한 수정을 완료한 후 소스
코드를 저장소에 커밋한다.
BUILD
수정된 내용을 저장소에서 체크아웃하여 실
제 실행가능하도록 빌드한다.
TESTS
수정사항은 다양한 각도에서 테스트 되어 동
작이 이상이 없고 기존 동작에 영향을 주지 않
음을 확인한다.
DEPLOY
빌드가 완료된 현재 버전으로 프로덕션에 배포된다
.
소프트웨어 개발 파이프라인
Continuous 머시기?
Continuous Integration
지속적인 통합은 개발자가 체크인 할 때 마다
새로운 빌드와 단위 테스트를 수행한다.
팀에게 요구사항에 대응하고 신속하게 문제를 해결할 수 있는
빠른 피드백 제공한다.
Continuous Delivery
지속적인 인도는 소프트웨어가 언제든지 릴리즈 될 수 있도록 준비
지속적인 통합, 자동화 테스트 및 배포 기능으로 안정적이고 빠르게
개발하고 최소한의 수동 오버헤드로 제품을 전달한다.
Continuous Deployment
지속적인 배포는 코드 변경시 전체 파이프라인을 통해 제품이 자동
사용자에게 배포된다.
지속적인 인도는 소프트웨어가 항상 릴리즈를 준비하지만 비즈니스
결정이 필요하여 마지막 배포단계는 수동이지만 지속적인 배포는
업데이트 작업 버전이 자동으로 푸시된다.
Continuous Model
자동화
CI != CI 시스템
아래 순서로 Google Play 개발자 콘솔에서 제품 출시관리자 서비스 계정을 등록
1. Google Play 콘솔 사이트를 오픈한다.
2. 설정 탭의 API 액세스 탭을 선택한다.
3. 새 프로젝트 만들기 버튼을 클릭하면 나오는 다이얼로그에서 Google API 콘솔 링크를 클릭하여 이동한다.
4. 해당 콘솔에서 ’서비스 계정 만들기’를 클릭하면 다이얼로그가 열린다.
5. 서비스 계정의 이름을 입력 한다.
6. 역활 선택에서 프로젝트 > 서비스 계정 행위자를 선택한다.
7. 새 비공개 키 제공 체크박스 선택한다.
8. 그러면 하단에 생기는 키 유형에 JSON을 선택한다.
9. 만들기를 눌르면 다이얼로그가 닫힌다 .
10. 컴퓨터에 JSON파일이 다운로드 되고 그 파일을 기억해 놓는다.
11. Google Play 개발자 콘솔로 다시 이동 한다.
12. 새로 생성된 서비스 계정의 액세스 권한 부여 버튼을 클릭한다.
13. 액세스 권한부여 다이얼로그에서 역활 선택에서 제품출시관리자로 선택
14. 하단의 사용자 추가 버튼을 눌러서 적용한다.
적용할 프로젝트 폴더에서 fastlane을 초기화
sudo gem install fastlane
fastlane supply init
supply를 설정
json_key_file “/path/to/your/downloaded/key.json”
supply를 설정
fastlane supply run
1. 각 빌드가 독립적으로 동작
- 의존성 있는 코드들 설치
- 프로젝트를 빌드
- 정적 분석 도구 실행 (lint, findbugs, pmd, checkstyle),
- 테스트 실행
- 아티팩트 아카이빙
2. 모던한 UI
3. 메일, 슬랙 등 다양한 서드파이와 연동 지원
4. 적절한 가격: 1달에 $50 (2 parallels)
5. circle.yml이라는 설정 파일을 수정하는 것만으로 간편하게 적용 가능
6. Github과 유기적인 연동
Circle CI의 장점
machine:
environment:
PATH: $ANDROID_NDK:$PATH
GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryEr
java:
version: oraclejdk8
dependencies:
pre:
# if necessary SDK / build tools / support library folders do not exist, u
- if [ ! -d "/usr/local/android-sdk-linux/platforms/android-24" ]; then ec
- if [ ! -d "/usr/local/android-sdk-linux/build-tools/24.0.2" ]; then echo
- if [ ! -d "/usr/local/android_sdk/extras/android/m2repository/com/androi
test:
override:
- ./gradlew test assembleDebug -PdisablePreDex
circle.yml
keystore 이슈
빌드시 필요한 keystore 파일을 다운로드 하기 위해 스크립트 작
# use curl to download a keystore from $KEYSTORE_URI, if set,
# to the path/filename set in $KEYSTORE.
if [[ $KEYSTORE && ${KEYSTORE} && $KEYSTORE_URI && ${KEYSTORE_URI} ]]
then
echo "Keystore detected - downloading..."
# we're using curl instead of wget because it will not
# expose the sensitive uri in the build logs:
curl -L -o ${KEYSTORE} ${KEYSTORE_URI}
else
echo "Keystore uri not set. .APK artifact will not be signed."
fi
misc/download_keystore.sh
machine:
environment:
PATH: $ANDROID_NDK:$PATH
GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryEr
KEYSTORE: ${HOME}/${CIRCLE_PROJECT_REPONAME}/signing.keystore
java:
version: oraclejdk8
dependencies:
pre:
# if necessary SDK / build tools / support library folders do not exist, u
- if [ ! -d "/usr/local/android-sdk-linux/platforms/android-24" ]; then ec
- if [ ! -d "/usr/local/android-sdk-linux/build-tools/24.0.2" ]; then echo
- if [ ! -d “/usr/local/android_sdk/extras/android/m2repository/com/androi
- bash ./misc/download_keystore.sh
test:
override:
- ./gradlew test assembleDebug -PdisablePreDex
circle.yml
signingConfigs {
release {
storeFile file(System.getenv("KEYSTORE"))
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
build.gradle
1. KVM 에뮬레이터를 지원하지 않음 Genymotion과 같은 도구로 테스트 X
2. CI 코드가 클라우드에 있어서 수정 시 이력이 함께 변경됨
3. 일반적인 환경에 적합하여 안드로이드나 iOS의 경우 예외적인 상황에 대한 처리가 필
Circle CI의 단점
워크플로우 에디터
workflows:
primary:
steps:
- activate-ssh-key@3.1.1:
run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
- git-clone@3.4.1: {}
- file-downloader@0.9.1:
inputs:
- source: "$BITRISEIO_ANDROID_KEYSTORE_URL"
- destination: "$HOME/keystores/release.keystore"
- install-missing-android-tools@0.9.2: {}
- gradle-runner@1.5.4:
inputs:
- gradle_task: "$GRADLE_TASK"
- deploy-to-bitrise-io@1.2.7: {}
bitrise.yml
app:
envs:
- opts:
is_expand: false
GRADLE_BUILD_FILE_PATH: build.gradle
- opts:
is_expand: false
GRADLE_TASK: assembleDebug crashlyticsUploadDistributionDevelopmentDebug
- opts:
is_expand: false
GRADLEW_PATH: "./gradlew"
bitrise.yml
Bitrise 장점
1. 기존의 circle ci의 장점은 대부분 수용
2. 워크플로우를 UI로 조정할 수 있음
3. fastlane을 자동화 툴로 지원
4. 가장 많고 간단한 서드파이와 연동 지원
5. preset이 잘 지정되어 있어 극단적으로 빠르게 적용 가능
6. docker 기반으로 circle ci보다 약간 빠른 느낌
check in hook
prod deploy
Continuous Model
테스트와 배포
check in hook
prod deploy
unit & integration tests
acceptance tests
test deploy
자동화된 테스트와 배포로
짧은 주기의 피드백과 개선을 반복하여
빠르고 지속적인 제품(= 가치)를 전달한다.
TODO!
인수 테스트를 클라우드로…
AAR과 같은 라이브러리는 어떻게?
감사합니다.

Weitere ähnliche Inhalte

Was ist angesagt?

Continuous Integration
Continuous IntegrationContinuous Integration
Continuous IntegrationDonghyun Seo
 
Eclipse basic(조현종)
Eclipse basic(조현종)Eclipse basic(조현종)
Eclipse basic(조현종)cho hyun jong
 
[오픈소스컨설팅] Atlassian Confluence User Guide Part-1
[오픈소스컨설팅] Atlassian Confluence User Guide Part-1[오픈소스컨설팅] Atlassian Confluence User Guide Part-1
[오픈소스컨설팅] Atlassian Confluence User Guide Part-1Ji-Woong Choi
 
Gradle 한번 살펴보기
Gradle 한번 살펴보기Gradle 한번 살펴보기
Gradle 한번 살펴보기Junseo Youn
 
CLT 소스품질 Jenkins 사용가이드
CLT 소스품질 Jenkins 사용가이드CLT 소스품질 Jenkins 사용가이드
CLT 소스품질 Jenkins 사용가이드jSoboro
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodedpTablo
 
빌드교육자료 작성중
빌드교육자료 작성중빌드교육자료 작성중
빌드교육자료 작성중Sukjin Yun
 
Setting open cv for vs2012, and use Image Watch tool
Setting open cv for vs2012, and use Image Watch toolSetting open cv for vs2012, and use Image Watch tool
Setting open cv for vs2012, and use Image Watch tooljongho lim
 
Eclipse 4 RCP - 2nd Week
Eclipse 4 RCP - 2nd WeekEclipse 4 RCP - 2nd Week
Eclipse 4 RCP - 2nd WeekTaewoo Kim
 
uEngineBPM 개발자교육 1 개발환경
uEngineBPM 개발자교육 1 개발환경 uEngineBPM 개발자교육 1 개발환경
uEngineBPM 개발자교육 1 개발환경 flowcontrol
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자Sewon Ann
 
올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발cho hyun jong
 
Envoy 를 이용한 코드 배포 자동화
Envoy 를 이용한 코드 배포 자동화Envoy 를 이용한 코드 배포 자동화
Envoy 를 이용한 코드 배포 자동화Juwon Kim
 
안드로이드를 위한 Gradle 맛들이기
안드로이드를 위한 Gradle 맛들이기안드로이드를 위한 Gradle 맛들이기
안드로이드를 위한 Gradle 맛들이기DongHwan Yu
 
gradle로 안드로이드 앱 빌드하기
gradle로 안드로이드 앱 빌드하기gradle로 안드로이드 앱 빌드하기
gradle로 안드로이드 앱 빌드하기Manjong Han
 
Selenium and XpressEngine
Selenium and XpressEngineSelenium and XpressEngine
Selenium and XpressEngineSol Kim
 
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHubXECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHubXpressEngine
 

Was ist angesagt? (20)

Continuous Integration
Continuous IntegrationContinuous Integration
Continuous Integration
 
Eclipse basic(조현종)
Eclipse basic(조현종)Eclipse basic(조현종)
Eclipse basic(조현종)
 
[오픈소스컨설팅] Atlassian Confluence User Guide Part-1
[오픈소스컨설팅] Atlassian Confluence User Guide Part-1[오픈소스컨설팅] Atlassian Confluence User Guide Part-1
[오픈소스컨설팅] Atlassian Confluence User Guide Part-1
 
Gradle 한번 살펴보기
Gradle 한번 살펴보기Gradle 한번 살펴보기
Gradle 한번 살펴보기
 
Eclipse RCP 1/2
Eclipse RCP 1/2Eclipse RCP 1/2
Eclipse RCP 1/2
 
CLT 소스품질 Jenkins 사용가이드
CLT 소스품질 Jenkins 사용가이드CLT 소스품질 Jenkins 사용가이드
CLT 소스품질 Jenkins 사용가이드
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCode
 
빌드교육자료 작성중
빌드교육자료 작성중빌드교육자료 작성중
빌드교육자료 작성중
 
Setting open cv for vs2012, and use Image Watch tool
Setting open cv for vs2012, and use Image Watch toolSetting open cv for vs2012, and use Image Watch tool
Setting open cv for vs2012, and use Image Watch tool
 
Eclipse 4 RCP - 2nd Week
Eclipse 4 RCP - 2nd WeekEclipse 4 RCP - 2nd Week
Eclipse 4 RCP - 2nd Week
 
uEngineBPM 개발자교육 1 개발환경
uEngineBPM 개발자교육 1 개발환경 uEngineBPM 개발자교육 1 개발환경
uEngineBPM 개발자교육 1 개발환경
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자
 
올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발
 
Envoy 를 이용한 코드 배포 자동화
Envoy 를 이용한 코드 배포 자동화Envoy 를 이용한 코드 배포 자동화
Envoy 를 이용한 코드 배포 자동화
 
안드로이드를 위한 Gradle 맛들이기
안드로이드를 위한 Gradle 맛들이기안드로이드를 위한 Gradle 맛들이기
안드로이드를 위한 Gradle 맛들이기
 
gradle로 안드로이드 앱 빌드하기
gradle로 안드로이드 앱 빌드하기gradle로 안드로이드 앱 빌드하기
gradle로 안드로이드 앱 빌드하기
 
Selenium and XpressEngine
Selenium and XpressEngineSelenium and XpressEngine
Selenium and XpressEngine
 
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHubXECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
 
WIPI.ppt
WIPI.pptWIPI.ppt
WIPI.ppt
 
Maven
MavenMaven
Maven
 

Ähnlich wie 빠르고 지속적으로 전달하기: Continuous Delivery for Android

DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기SeungYong Baek
 
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발Jinuk Kim
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST_NHNent
 
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트Ji-Woong Choi
 
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재Hankyo
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdfssuserb942d2
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: YeomanJae Sung Park
 
Sencha touch2-sdk-tools-window
Sencha touch2-sdk-tools-windowSencha touch2-sdk-tools-window
Sencha touch2-sdk-tools-windowByoung Do Ahn
 
[오픈소스컨설팅]애플리케이션 빌드 및_배포가이드_v1.0_20140211
[오픈소스컨설팅]애플리케이션 빌드 및_배포가이드_v1.0_20140211[오픈소스컨설팅]애플리케이션 빌드 및_배포가이드_v1.0_20140211
[오픈소스컨설팅]애플리케이션 빌드 및_배포가이드_v1.0_20140211Ji-Woong Choi
 
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Nanha Park
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page ApplicationSangmin Yoon
 
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017Amazon Web Services Korea
 
[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)Ildoo Kim
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트Dae Kim
 
Internship backend
Internship backendInternship backend
Internship backendYein Sim
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)YEONG-CHEON YOU
 
regular.express 발표자료
regular.express 발표자료regular.express 발표자료
regular.express 발표자료bdh92123
 
델파이XE2와 파이어몽키(FireMoneky)
델파이XE2와 파이어몽키(FireMoneky)델파이XE2와 파이어몽키(FireMoneky)
델파이XE2와 파이어몽키(FireMoneky)Devgear
 
LetsSwift(강민규스피커,안정민서포터).pptx
LetsSwift(강민규스피커,안정민서포터).pptxLetsSwift(강민규스피커,안정민서포터).pptx
LetsSwift(강민규스피커,안정민서포터).pptxssuser2601f7
 

Ähnlich wie 빠르고 지속적으로 전달하기: Continuous Delivery for Android (20)

DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기
 
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
 
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
 
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman
 
Sencha touch2-sdk-tools-window
Sencha touch2-sdk-tools-windowSencha touch2-sdk-tools-window
Sencha touch2-sdk-tools-window
 
[오픈소스컨설팅]애플리케이션 빌드 및_배포가이드_v1.0_20140211
[오픈소스컨설팅]애플리케이션 빌드 및_배포가이드_v1.0_20140211[오픈소스컨설팅]애플리케이션 빌드 및_배포가이드_v1.0_20140211
[오픈소스컨설팅]애플리케이션 빌드 및_배포가이드_v1.0_20140211
 
Docker Container
Docker ContainerDocker Container
Docker Container
 
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page Application
 
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017
효과적인 데브옵스를 위한 AWS 개발 도구 활용하기 - AWS Summit Seoul 2017
 
[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
Internship backend
Internship backendInternship backend
Internship backend
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
regular.express 발표자료
regular.express 발표자료regular.express 발표자료
regular.express 발표자료
 
델파이XE2와 파이어몽키(FireMoneky)
델파이XE2와 파이어몽키(FireMoneky)델파이XE2와 파이어몽키(FireMoneky)
델파이XE2와 파이어몽키(FireMoneky)
 
LetsSwift(강민규스피커,안정민서포터).pptx
LetsSwift(강민규스피커,안정민서포터).pptxLetsSwift(강민규스피커,안정민서포터).pptx
LetsSwift(강민규스피커,안정민서포터).pptx
 

빠르고 지속적으로 전달하기: Continuous Delivery for Android

  • 1. Sangkyoon Nam, Architecture Owner nam.sangkyoon@nbt.com 빠르고 지속적으로 전달하기 Continuous Delivery for Android
  • 2.
  • 3. 2012년 11월 첫 출시, 대략 2주 간격으로 업데이트 진행
  • 5. 01 03 02 04 COMMIT 애플리케이션에 대한 수정을 완료한 후 소스 코드를 저장소에 커밋한다. BUILD 수정된 내용을 저장소에서 체크아웃하여 실 제 실행가능하도록 빌드한다. TESTS 수정사항은 다양한 각도에서 테스트 되어 동 작이 이상이 없고 기존 동작에 영향을 주지 않 음을 확인한다. DEPLOY 빌드가 완료된 현재 버전으로 프로덕션에 배포된다 . 소프트웨어 개발 파이프라인
  • 7. Continuous Integration 지속적인 통합은 개발자가 체크인 할 때 마다 새로운 빌드와 단위 테스트를 수행한다. 팀에게 요구사항에 대응하고 신속하게 문제를 해결할 수 있는 빠른 피드백 제공한다.
  • 8. Continuous Delivery 지속적인 인도는 소프트웨어가 언제든지 릴리즈 될 수 있도록 준비 지속적인 통합, 자동화 테스트 및 배포 기능으로 안정적이고 빠르게 개발하고 최소한의 수동 오버헤드로 제품을 전달한다.
  • 9. Continuous Deployment 지속적인 배포는 코드 변경시 전체 파이프라인을 통해 제품이 자동 사용자에게 배포된다. 지속적인 인도는 소프트웨어가 항상 릴리즈를 준비하지만 비즈니스 결정이 필요하여 마지막 배포단계는 수동이지만 지속적인 배포는 업데이트 작업 버전이 자동으로 푸시된다.
  • 12. CI != CI 시스템
  • 13.
  • 14.
  • 15.
  • 16. 아래 순서로 Google Play 개발자 콘솔에서 제품 출시관리자 서비스 계정을 등록 1. Google Play 콘솔 사이트를 오픈한다. 2. 설정 탭의 API 액세스 탭을 선택한다. 3. 새 프로젝트 만들기 버튼을 클릭하면 나오는 다이얼로그에서 Google API 콘솔 링크를 클릭하여 이동한다. 4. 해당 콘솔에서 ’서비스 계정 만들기’를 클릭하면 다이얼로그가 열린다. 5. 서비스 계정의 이름을 입력 한다. 6. 역활 선택에서 프로젝트 > 서비스 계정 행위자를 선택한다. 7. 새 비공개 키 제공 체크박스 선택한다. 8. 그러면 하단에 생기는 키 유형에 JSON을 선택한다. 9. 만들기를 눌르면 다이얼로그가 닫힌다 . 10. 컴퓨터에 JSON파일이 다운로드 되고 그 파일을 기억해 놓는다. 11. Google Play 개발자 콘솔로 다시 이동 한다. 12. 새로 생성된 서비스 계정의 액세스 권한 부여 버튼을 클릭한다. 13. 액세스 권한부여 다이얼로그에서 역활 선택에서 제품출시관리자로 선택 14. 하단의 사용자 추가 버튼을 눌러서 적용한다.
  • 17. 적용할 프로젝트 폴더에서 fastlane을 초기화 sudo gem install fastlane fastlane supply init supply를 설정 json_key_file “/path/to/your/downloaded/key.json” supply를 설정 fastlane supply run
  • 18.
  • 19.
  • 20. 1. 각 빌드가 독립적으로 동작 - 의존성 있는 코드들 설치 - 프로젝트를 빌드 - 정적 분석 도구 실행 (lint, findbugs, pmd, checkstyle), - 테스트 실행 - 아티팩트 아카이빙 2. 모던한 UI 3. 메일, 슬랙 등 다양한 서드파이와 연동 지원 4. 적절한 가격: 1달에 $50 (2 parallels) 5. circle.yml이라는 설정 파일을 수정하는 것만으로 간편하게 적용 가능 6. Github과 유기적인 연동 Circle CI의 장점
  • 21.
  • 22. machine: environment: PATH: $ANDROID_NDK:$PATH GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryEr java: version: oraclejdk8 dependencies: pre: # if necessary SDK / build tools / support library folders do not exist, u - if [ ! -d "/usr/local/android-sdk-linux/platforms/android-24" ]; then ec - if [ ! -d "/usr/local/android-sdk-linux/build-tools/24.0.2" ]; then echo - if [ ! -d "/usr/local/android_sdk/extras/android/m2repository/com/androi test: override: - ./gradlew test assembleDebug -PdisablePreDex circle.yml
  • 23.
  • 24.
  • 25. keystore 이슈 빌드시 필요한 keystore 파일을 다운로드 하기 위해 스크립트 작
  • 26.
  • 27. # use curl to download a keystore from $KEYSTORE_URI, if set, # to the path/filename set in $KEYSTORE. if [[ $KEYSTORE && ${KEYSTORE} && $KEYSTORE_URI && ${KEYSTORE_URI} ]] then echo "Keystore detected - downloading..." # we're using curl instead of wget because it will not # expose the sensitive uri in the build logs: curl -L -o ${KEYSTORE} ${KEYSTORE_URI} else echo "Keystore uri not set. .APK artifact will not be signed." fi misc/download_keystore.sh
  • 28. machine: environment: PATH: $ANDROID_NDK:$PATH GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryEr KEYSTORE: ${HOME}/${CIRCLE_PROJECT_REPONAME}/signing.keystore java: version: oraclejdk8 dependencies: pre: # if necessary SDK / build tools / support library folders do not exist, u - if [ ! -d "/usr/local/android-sdk-linux/platforms/android-24" ]; then ec - if [ ! -d "/usr/local/android-sdk-linux/build-tools/24.0.2" ]; then echo - if [ ! -d “/usr/local/android_sdk/extras/android/m2repository/com/androi - bash ./misc/download_keystore.sh test: override: - ./gradlew test assembleDebug -PdisablePreDex circle.yml
  • 29. signingConfigs { release { storeFile file(System.getenv("KEYSTORE")) storePassword System.getenv("KEYSTORE_PASSWORD") keyAlias System.getenv("KEY_ALIAS") keyPassword System.getenv("KEY_PASSWORD") } } build.gradle
  • 30. 1. KVM 에뮬레이터를 지원하지 않음 Genymotion과 같은 도구로 테스트 X 2. CI 코드가 클라우드에 있어서 수정 시 이력이 함께 변경됨 3. 일반적인 환경에 적합하여 안드로이드나 iOS의 경우 예외적인 상황에 대한 처리가 필 Circle CI의 단점
  • 31.
  • 33. workflows: primary: steps: - activate-ssh-key@3.1.1: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' - git-clone@3.4.1: {} - file-downloader@0.9.1: inputs: - source: "$BITRISEIO_ANDROID_KEYSTORE_URL" - destination: "$HOME/keystores/release.keystore" - install-missing-android-tools@0.9.2: {} - gradle-runner@1.5.4: inputs: - gradle_task: "$GRADLE_TASK" - deploy-to-bitrise-io@1.2.7: {} bitrise.yml
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51. app: envs: - opts: is_expand: false GRADLE_BUILD_FILE_PATH: build.gradle - opts: is_expand: false GRADLE_TASK: assembleDebug crashlyticsUploadDistributionDevelopmentDebug - opts: is_expand: false GRADLEW_PATH: "./gradlew" bitrise.yml
  • 52. Bitrise 장점 1. 기존의 circle ci의 장점은 대부분 수용 2. 워크플로우를 UI로 조정할 수 있음 3. fastlane을 자동화 툴로 지원 4. 가장 많고 간단한 서드파이와 연동 지원 5. preset이 잘 지정되어 있어 극단적으로 빠르게 적용 가능 6. docker 기반으로 circle ci보다 약간 빠른 느낌
  • 56. check in hook prod deploy unit & integration tests acceptance tests test deploy
  • 57. 자동화된 테스트와 배포로 짧은 주기의 피드백과 개선을 반복하여 빠르고 지속적인 제품(= 가치)를 전달한다.
  • 58. TODO!
  • 60.
  • 62.