빠르고 지속적으로 전달하기: continuous delivery for android

63
angkyoon Nam, Architecture Owner [email protected] 빠빠 빠빠빠빠빠 빠빠빠빠 ontinuous Delivery for Android

Upload: sangkyoon-nam

Post on 07-Apr-2017

21 views

Category:

Software


6 download

TRANSCRIPT

Sangkyoon Nam, Architecture [email protected]

빠르고 지속적으로 전달하기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 initsupply 를 설정

json_key_file “/path/to/your/downloaded/key.json”supply 를 설정

fastlane supply run

1. 각 빌드가 독립적으로 동작 - 의존성 있는 코드들 설치- 프로젝트를 빌드- 정적 분석 도구 실행 (lint, findbugs, pmd, checkstyle),- 테스트 실행- 아티팩트 아카이빙

2. 모던한 UI3. 메일 , 슬랙 등 다양한 서드파이와 연동 지원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:+HeapDumpOnOutOfMemoryError"' java: version: oraclejdk8

dependencies: pre: # if necessary SDK / build tools / support library folders do not exist, update the circle ci - if [ ! -d "/usr/local/android-sdk-linux/platforms/android-24" ]; then echo y | android update - if [ ! -d "/usr/local/android-sdk-linux/build-tools/24.0.2" ]; then echo y | android update sdk - if [ ! -d "/usr/local/android_sdk/extras/android/m2repository/com/android/support/support-core-

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:+HeapDumpOnOutOfMemoryError”' KEYSTORE: ${HOME}/${CIRCLE_PROJECT_REPONAME}/signing.keystore java: version: oraclejdk8

dependencies: pre: # if necessary SDK / build tools / support library folders do not exist, update the circle ci - if [ ! -d "/usr/local/android-sdk-linux/platforms/android-24" ]; then echo y | android update - if [ ! -d "/usr/local/android-sdk-linux/build-tools/24.0.2" ]; then echo y | android update sdk - if [ ! -d “/usr/local/android_sdk/extras/android/m2repository/com/android/support/support-core- - 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 과 같은 도구로 테스트 X2. CI 코드가 클라우드에 있어서 수정 시 이력이 함께 변경됨3. 일반적인 환경에 적합하여 안드로이드나 iOS 의 경우 예외적인 상황에 대한 처리가 필요

Circle CI 의 단점

워크플로우 에디터

workflows: primary: steps: - [email protected]: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' - [email protected]: {} - [email protected]: inputs: - source: "$BITRISEIO_ANDROID_KEYSTORE_URL" - destination: "$HOME/keystores/release.keystore" - [email protected]: {} - [email protected]: inputs: - gradle_task: "$GRADLE_TASK" - [email protected]: {}

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 과 같은 라이브러리는 어떻게 ?

감사합니다 .