SlideShare a Scribd company logo
Sangkyoon Nam, Architecture Owner
nam.sangkyoon@nbt.com
빠르고 지속적으로 전달하기
Continuous Delivery for Android
빠르고 지속적으로 전달하기: 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 시스템
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
아래 순서로 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
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
1. 각 빌드가 독립적으로 동작
- 의존성 있는 코드들 설치
- 프로젝트를 빌드
- 정적 분석 도구 실행 (lint, findbugs, pmd, checkstyle),
- 테스트 실행
- 아티팩트 아카이빙
2. 모던한 UI
3. 메일, 슬랙 등 다양한 서드파이와 연동 지원
4. 적절한 가격: 1달에 $50 (2 parallels)
5. circle.yml이라는 설정 파일을 수정하는 것만으로 간편하게 적용 가능
6. Github과 유기적인 연동
Circle CI의 장점
빠르고 지속적으로 전달하기: Continuous Delivery for Android
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
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
keystore 이슈
빌드시 필요한 keystore 파일을 다운로드 하기 위해 스크립트 작
빠르고 지속적으로 전달하기: Continuous Delivery for Android
# 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의 단점
빠르고 지속적으로 전달하기: Continuous Delivery for Android
워크플로우 에디터
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
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
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!
인수 테스트를 클라우드로…
빠르고 지속적으로 전달하기: Continuous Delivery for Android
AAR과 같은 라이브러리는 어떻게?
빠르고 지속적으로 전달하기: Continuous Delivery for Android
감사합니다.

More Related Content

PPTX
Eclipse RCP 2/2
PDF
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
PDF
지속적인 통합
PDF
자바 웹프로젝트 개발환경 셋팅
PPTX
Jenkins를 활용한 javascript 개발
PPTX
Gradle 사용하기
PPTX
Kinect 사용을 위한 OpenCV, PCL 라이브러리 설치
PPTX
Jenkins
Eclipse RCP 2/2
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
지속적인 통합
자바 웹프로젝트 개발환경 셋팅
Jenkins를 활용한 javascript 개발
Gradle 사용하기
Kinect 사용을 위한 OpenCV, PCL 라이브러리 설치
Jenkins

What's hot (20)

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

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

PDF
Hyperledger fabric practice(pdf)
PPTX
Deploying Hyperledger Fabric on Kubernetes.pptx
PPTX
bamboo 로 PHP 프로젝트 지속적인 배포
PDF
Eclipse git 튜토리알
PPTX
CI in the Mobile World (한글번역)
PDF
오픈소스를 사용하고, 준비하는 개발자를 위한 가이드
PPTX
Backend Master | 3.1.3 Build - Java build tool - Gradle
PPTX
N02 app engineseminar
PDF
웹 IDE 비교
PDF
31기 고지웅 "구글오픈소스"
PDF
DevOps - CI/CD 알아보기
PPTX
Travis-ci를 이용한 CI/CD와 도커를 이용한 Jenkins for Android 구성하기
PDF
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
PDF
CircleCI로 Serverless API의 CI/CD 환경 구축하기
PPTX
PDF
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
PPTX
GitLab과 Kubernetes를 통한 CI/CD 구축
PDF
초보 개발자/학생들을 위한 오픈소스 트랜드
PPTX
Git의 기초 및 Bitbucket을 이용한 Git 코드 협업 - Twoseed
PPTX
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
Hyperledger fabric practice(pdf)
Deploying Hyperledger Fabric on Kubernetes.pptx
bamboo 로 PHP 프로젝트 지속적인 배포
Eclipse git 튜토리알
CI in the Mobile World (한글번역)
오픈소스를 사용하고, 준비하는 개발자를 위한 가이드
Backend Master | 3.1.3 Build - Java build tool - Gradle
N02 app engineseminar
웹 IDE 비교
31기 고지웅 "구글오픈소스"
DevOps - CI/CD 알아보기
Travis-ci를 이용한 CI/CD와 도커를 이용한 Jenkins for Android 구성하기
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
CircleCI로 Serverless API의 CI/CD 환경 구축하기
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
GitLab과 Kubernetes를 통한 CI/CD 구축
초보 개발자/학생들을 위한 오픈소스 트랜드
Git의 기초 및 Bitbucket을 이용한 Git 코드 협업 - Twoseed
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
Ad

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

  • 1. Sangkyoon Nam, Architecture Owner nam.sangkyoon@nbt.com 빠르고 지속적으로 전달하기 Continuous Delivery for Android
  • 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 시스템
  • 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
  • 20. 1. 각 빌드가 독립적으로 동작 - 의존성 있는 코드들 설치 - 프로젝트를 빌드 - 정적 분석 도구 실행 (lint, findbugs, pmd, checkstyle), - 테스트 실행 - 아티팩트 아카이빙 2. 모던한 UI 3. 메일, 슬랙 등 다양한 서드파이와 연동 지원 4. 적절한 가격: 1달에 $50 (2 parallels) 5. circle.yml이라는 설정 파일을 수정하는 것만으로 간편하게 적용 가능 6. Github과 유기적인 연동 Circle CI의 장점
  • 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
  • 25. keystore 이슈 빌드시 필요한 keystore 파일을 다운로드 하기 위해 스크립트 작
  • 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의 단점
  • 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
  • 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!