[번역] DroidKaigi 2017 ~ 릴리즈 자동화 도입과 효율적인 릴리즈 흐름을 찾아

[번역] DroidKaigi 2017 ~ 릴리즈 자동화 도입과 효율적인 릴리즈 흐름을 찾아

Jun 17, 2017. | By: pluulove

본 포스팅은 DroidKaigi 2017 ~ リリース自動化と効率のよいリリースフローを求めて 을 기본으로 번역하여 작성했습니다

제 일본어 실력으로 인하여 오역이나 오타가 발생할 수 있습니다.

실제 슬라이드의 일본어 부분을 번역했다는 점 양해바랍니다.

1p 릴리즈 자동화 도입과 효율적인 릴리즈 흐름을 찾아

by Ryo Sakaguchi

@Droidkaigi2017 Day.1

2p About me

  • 두근두근씨(わくわくさん)이라고 불리고 있습니다. (회사에서 포교에는 실패했다)
  • Wantedly라는 회사에서 Wantedly People 개발을 하고 있습니다.
  • 원래 お値段以上 가구점에서 점원을 하고 있었습니다.

3p

Agenda

4p Agenda

  • 자동화 분위기
    • 목적이나 동기 부여, 가능한 것, 장점 등
  • 릴리즈 자동화 관련 도구 소개
    • Android 앱 릴리즈 자동화하는데 유용한 도구들을 소개합니다.
  • 어떻게 하는가? (도입 준비)
    • 여러 프로젝트를 예로 들어 자동화한 릴리즈 흐름을 도입하는 것을 생각해봅니다.
  • 어떻게 하는가? (도입)
    • 실제로 도입하는 데 필요한 작업을 확인하겠습니다.
  • 실패하기 쉬운 사례와 주의점
  • 정리
  • 질의응답

5p 오늘 가장 전하고 싶은 것

  • 자동화에 대한 자세한 소개 절차 등이 아니라 왜 하는 것인가, 동기 부여를 주로 전하고 싶습니다.
  • 도입 자체에 대해 어렵지 않다.
  • 필요한 것은 해나가는 마음

6p Agenda

  • 자동화 분위기
    • 목적이나 동기 부여, 가능한 것, 장점 등
  • 릴리즈 자동화 관련 도구 소개
    • Android 앱 릴리즈 자동화하는데 유용한 도구들을 소개합니다.
  • 어떻게 하는가? (도입 준비)
    • 여러 프로젝트를 예로 들어 자동화한 릴리즈 흐름을 도입하는 것을 생각해봅니다.
  • 어떻게 하는가? (도입)
    • 실제로 도입하는 데 필요한 작업을 확인하겠습니다.
  • 실패하기 쉬운 사례와 주의점
  • 정리
  • 질의응답

7p

애초에 자동화의 목적은?

8p 자동화의 목적

  • 일상 업무, 정형 작업과 같은 것이므로, 자동화함으로써 본질적인 업무에 집중하도록 하고 싶다.
  • 관리하는 앱이 많아지거나, 스토어 게재 내용의 다국어 대응 등을 하는 경우 업데이트 절차가 번잡하게 된다.
    • 그 실수를 줄이고 싶다.
  • 릴리즈 작업을 속인시키고 싶지 않다.

9p

이런 것이 가능합니다

10p 이런 일이 가능하게

  • Google Play Developer Console에 APK 업로드 (복수 APK 일괄 업로드도 OK!)
  • 상점 정보 업데이트
    • Change log
    • Long description
    • Short description
    • ScreenShots
  • 모니터링 도구 (Crashlytics이나 Firebase Crash Reporting, Bugsnag …)에 mapping.txt 파일 업로드

11p

더 다양하게 가능하지만 과한 것은 좋지 않으니 주의. (후술)

12p

자동화할 경우 무엇이 기쁘게 될까

13p

작업이 간단하게 되어 기쁘다!

14p

자동화하지 않은 릴리즈 작업은 운영 실수를 낳기 십상

15p 지금까지 릴리스 작업

  • 서명 파일을 가지고 릴리즈 매니저인 사람에게 릴리즈를 부탁한다.
  • ProductionAPK을 준비한다.
  • 업데이트 내용을 준비한다.
  • Console에 접속하여 WEB 인터페이스로 업로드
  • 업로드를 사내에 알림
  • 업데이트를 회사에 통지

를 모두 수작업

17p

이제부터의 릴리즈 작업

18p

git push origin master

20p

빠르다

21p

대체로 이걸로 된다.

이거라면…

22p

실수없이!

신속하게!

릴리즈를 돌린다!

23p

하지만 릴리즈 작업은 그렇게 횟수가 많지 않아…

24p

그것이 앱의 개선 사이클을 주 1 돌리면 상당히 힘듭니다

25p 왜 힘든지

  • 릴리즈를 고속으로 돌리면 아무래도 버그가 늘어난다.
    • 근본적인 해결책으로는 제대로 테스트를 작성하고, 애초에 버그가 생기기 어려운 환경을 갖추는 것이 필요하다.
    • 하지만 일어날 때 일어난다.
    • 결과적으로 hotfix를 하기도 한다
    • 그 hotfix를 포함하면 일주일에 한 번으로 끝나지 않는다
    • 그럴 때, 릴리즈할 수 있는 작업자가 1 명이라면?

라는게 있으면 확실히 실수가 늘어간다

26p 실제로 나 자신이 해버린 것 목록

  • 스토어 Changelog의 일본어에 영어를 영어에 일본어를 넣어버렸다
  • APK를 split하고 있었기 때문에 몇 번이나 이미 업로드 한 APK 파일을 업로드했다 (튕기기 때문에 실제 손해는 없다)

크리티컬 너무 실수는 범하지 않았지만, 다시 관련 작업을 해야 해 스트레스는 상당히 있었다.

27p

그럴 때 만난 것이 자동화였습니다.

28p Agenda

  • 자동화 분위기
    • 목적이나 동기 부여, 가능한 것, 장점 등
  • 릴리즈 자동화 관련 도구 소개
    • Android 앱 릴리즈 자동화하는데 유용한 도구들을 소개합니다.
  • 어떻게 하는가? (도입 준비)
    • 여러 프로젝트를 예로 들어 자동화한 릴리즈 흐름을 도입하는 것을 생각해봅니다.
  • 어떻게 하는가? (도입)
    • 실제로 도입하는 데 필요한 작업을 확인하겠습니다.
  • 실패하기 쉬운 사례와 주의점
  • 정리
  • 질의응답

29p

자동화에 필요한 도구들

30p 가정 환경

  • GitFlow를 사용하고 있다
    • master (릴리스 브런치)
    • develop
    • feature
    • hotfix
    • release
  • 개인・팀은 묻지 않는다

31p

CI

32p

Wercker 또는 Bitrise 를 추천

33p CI

  • Wercker
    1. Docker에서 컨테이너를 마음대로 만들고 빌드 환경을 상당히 자유롭게 조립할 수 있다
      • Dockerfile을 작성할 수 있으면 마음대로 만들 수 있다
    2. 그 밖에도 이미 완성되어있는 컨테이너를 사용할 수도 있다.
    3. 빠르다
    4. 지원이 솔직한 기분이 든다.
    5. 대체로 무료

34p CI

  • Bitrise
    1. 왠지 모르게 iOS의 이미지가 강할지도 모르지만, android 지원도 꽤 잘 되어있다.
    2. 대체로 기본적으로 GUI로 할 수 있으므로, 조금 수정할 때나 편리
    3. WEB 콘솔에서 빌드를 예약할 수 있다.
    4. 제대로 사용하려면 유료이지만, 제한된 무료 플랜도 있다.
    5. 귀찮은 서명 파일의 관리를 도와준다

35p CI

어느 쪽이 좋아?

  • 환경 구축 및 빌드 흐름의 구축의 용이성은 Bitrise에 손이 올라간다
  • 유연성이란 관점에서는 Wercker이려나라고 생각하고 있다.

36p

APK 업로드

37p APK 업로드

유명한 곳이 2곳 있습니다.

  1. Triple-T/gradle-play-publisher
  2. fastlane/fastlane

38p 엉성하게 비교해봤습니다.

  fastlane gradle-play-publisher
업데이트 내역 갱신 O O
앱 설명문 (장문) 갱신 O O
앱 설명문 (단문) 갱신 O O
스토어 게재용 스크린샷 갱신 O O
스토어 게재 아이콘 갱신 O O
Crashlytics(Beta)와 결합 O X
Gradle만으로 완결 가능한가 X O
APK 버전 충돌 해결 △(issue로 논의 중) O(Beta판 전용)

39p 비교는 했습니다만

여러분이 염려되는 대로 큰 차이는 없습니다.

어느 쪽이라도 마음에 드는 쪽을 사용하면 좋다고 생각합니다.

결정에 나쁜 비교 되어 버렸습니다 …

40p

하지만

41p

fastlane라고하면 fablic

fablic라고하면

42p

Fabric is Joining

Google

— January 18, 2017

43p

그렇죠?

44p

fastlane is Joining

Google

— January 23, 2017

45p

향후가 기대!

46p

그 밖의 도구

47p 그 밖의 도구

  • Tonkotsu
    • GooglePlay 업데이트를 Slack에 알림!
    • PlayConsole 앱을 넣지 않은 사람이나 회사에 알림 할 때라든지에 매우 유용합니다

48p

대체로 이 도구만으로 자동화를 실천할 수 있습니다.

49p Agenda

  • 자동화 분위기
    • 목적이나 동기 부여, 가능한 것, 장점 등
  • 릴리즈 자동화 관련 도구 소개
    • Android 앱 릴리즈 자동화하는데 유용한 도구들을 소개합니다.
  • 어떻게 하는가? (도입 준비)
    • 여러 프로젝트를 예로 들어 자동화한 릴리즈 흐름을 도입하는 것을 생각해봅니다.
  • 어떻게 하는가? (도입)
    • 실제로 도입하는 데 필요한 작업을 확인하겠습니다.
  • 실패하기 쉬운 사례와 주의점
  • 정리
  • 질의응답

50p

도입 준비편

51p

자동화 정말 필요하세요?

52p 정말 필요하세요?

  • 왜 자동화하는가
    • 이에 대해 골똘히 생각하면 실제로 하지 않아도 좋은 케이스도 존재합니다.
    • 무엇을 어떻게 자동화할 것인가가 저절로 보입니다.
    • 그게 되면 도입 준비가 끝난 것 같습니다.
    • 자동화하는 장점이 있다라고 느끼면 실제로 작업에 착수합시다.
    • 장점이 느껴진다면 “foobar 이니까 자동화하고 싶다. 그래서 조금 시간 달라”적인 이야기를 팀에서 하면 좋습니다.
    • 개인이라면 신경 쓰지 않고 해버립니다.

53p

Case. 1

54p ~ 55p Case.1

완전히 국내용 케이스

→ 경우에 따라서는 자동화하지 않아도 된다

56p Case.1

왜 그럴까요?

  • 릴리즈에 걸리는 부담이 거기까지 크지 않을 것으로 예상할 수 있기 때문에.
    • 다국어 대응 시에 많은 업데이트 문장을 쓸 필요가 있지만, 완전히 국내용의 경우는 그 공정이 걸리지 않는다.

57p

Case.2

58p ~ 59p Case.2

글로벌하게 전개하고 현지화도 풍부한 앱

→ 필히 자동화하고 싶다

60p Case.2

왜 그럴까요?

  • 업데이트 문을 포근한 수작업으로 반복할 필요가 있다.
  • 솔직히 상당히 괴롭다.
  • APK 업로드뿐만 아니라 스토어 정보의 업데이트도 정말 귀찮아진다.
  • 14개국 언어 x 5장의 스크린샷을 업로드 해야하는 일이 생기면 어쩌지.

61p

Case.3

62p ~ 63p Case.3

주로 국내용, 하지만 NDK를 사용하거나 Realm을 사용하거나 하는 경우

→ APK Split을 하여 앱 사이즈를 줄일 수 있다면 매우 효과적입니다

64p ~ 65 APK Split?

splits {
   abi {
      enable true
      reset()
      include 'x86', 'armeabi', 'armeabi-v7a'
      universalApk false

      // true로하면 분해 한 APK 외에
      // 지금까지 빌드한 APK도 출력됩니다.
      // fablic과 DeployGate에 업로드 할 때 효과적
   }
}

66p ~ 67p Case.3

왜 Split 할 때 효과적인가?

→ 앱이 여러 개로 나뉩니다.

위의 예라면 universalAPK를 제외하고 3개의 APK가 완성됩니다.

이런 거 일일이 손으로 못하겠습니다.

그래서 자동으로 업로드하고 편하게 가자고 말하는 스타일입니다.

앱의 사이즈는 국내라면 그렇게도 없을지도 모르지만 해외라면 지속율에 영향을 줍니다.

그래서 만약 해당되는 사람이 계신다면 꼭 도입 해보세요!

68p Agenda

  • 자동화 분위기
    • 목적이나 동기 부여, 가능한 것, 장점 등
  • 릴리즈 자동화 관련 도구 소개
    • Android 앱 릴리즈 자동화하는데 유용한 도구들을 소개합니다.
  • 어떻게 하는가? (도입 준비)
    • 여러 프로젝트를 예로 들어 자동화한 릴리즈 흐름을 도입하는 것을 생각해봅니다.
  • 어떻게 하는가? (도입)
    • 실제로 도입하는 데 필요한 작업을 확인하겠습니다.
  • 실패하기 쉬운 사례와 주의점
  • 정리
  • 질의응답

69p

도입편

70p

실제로 절차와 코드에 도입부터 배포까지 쫓아갑시다!

71p 이번 요구 사항 (어디까지나 가정입니다)

  • 상황
    • 당신은 5명으로 구성된 개발팀의 Android 엔지니어입니다.
    • 앱은 국제 전개하고 있으며, 번역도 외부에 의뢰하거나 합니다.
    • 최근 1개월, 서비스 그로스를 위해 1주일에 1번 릴리즈 주기를 돌릴 일이 되었습니다.
    • 팀은 비즈니스쪽 사람도 있습니다. 또한 CS 팀에서 릴리즈되면 재빨리 가르쳐달라고 듣습니다.
    • 앱 내의 DB로는 Realm을 사용하고 있습니다.

72p 포근한 수작업 (1/3)

  • 릴리즈전이 되어 이번 업데이트 문장을 생각하고 10개국 언어분량의 번역 의뢰를 했습니다.
  • 번역을 기다리는 동안 최종 확인 검사를 했습니다.
  • 테스트 완료 후 APK를 빌드했습니다.
  • 번역된 업데이트 문장 모두가 수중에 모였습니다.
  • 이제 업로드합니다.
  • 앱 사이즈의 비대화를 억제하기 위해 APK split을 사용하기로 했기 때문에 총 5개의 APK를 업로드 하게 되었습니다.

73p ~ 74p 포근한 수작업 (2/3)

  • GooglePlay Developer Console에 접속합니다.
  • APK를 업로드하고(x5) 언어마다 업데이트 문을 복사 붙여넣기 합니다 (x10).
  • 이제 공개 버튼을 누릅니다!

75p

APK를 업로드하고(x5)

각 언어마다 업데이트 문을 복사 붙여넣기 합니다 (x10).

76p 포근한 수작업 (2/3)

  • APK를 업로드 후, CS팀과 개발팀에 “업로드가 완료되었습니다”라고 알립니다.
  • 스토어 업데이트를 PlayConsole 앱 알림으로 확인할 수 있기 때문에 CS팀에게 다시 알립니다.

77p

상당히 힘든 느낌이다.

78p

그러면 자동화하면 어떻게 될까

79p ~ 82p 이번에는 빠르게 가능한 자동화로 생각합니다.

  1. GooglePlay Developer Console에 접속합니다.

→ 모두 로컬로 준비&완결합시다 by fastlane

  1. APK를 업로드하고(x5) 각 언어마다 업데이트 문을 복사 붙여넣기 합니다(x10).

→ 프로그램에 맡겨보자 by fastlane && CI

  1. APK를 업로드 후, CS 팀과 개발팀에 “업로드가 완료되었습니다”라고 알립니다.

→ Slack으로 자동으로 알리는 구조를 만들어보자 by Slack & CI

  1. 스토어 업데이트를 PlayConsole 앱 알림으로 확인할 수 있기 때문에 CS 팀에 다시 알립니다.

→ 이쪽도 Slack으로 자동으로 알리는 구조를 만들어보자 by tonkotsu

83p

이것만으로도 상당히 편해졌습니다!

그러면에서 실현해 봅시다.

84p Step.1 (1/2)

우선 fastlane의 준비

  • fastlane이 GooglePlay Developer Console에 접근하기 위한 Service Account를 만들고 생성된 json 파일을 준비합니다.
  • 다음으로 fastlane 설치합니다.
gem install fastlane

85p Step.1 (2/3)

  • fastlane를 사용하여 GoogelPlay에서 현재 최신 스토어 게재 정보를 취득하고 git 관리하에 둡니다.
  • 이때 주의할 점은 조금 전 다운로드한 json 파일은 git 저장소에 넣지 않도록 하십시오.
> cd your_project_folder
> fastlane supply init -j / path / to / json
> git add.
> git push

86p Step.1 (3/3)

이런 식으로 업데이트 문장이 들어간 디렉토리가 프로젝트 폴더에 생성됩니다.

업데이트를 배포할 때에는 텍스트 파일에 버전 코드명을 붙여서 업로드하는 것으로 스토어에 업데이트됩니다.

metadata
  └── android
  ├── en-US
  │ └── changelogs
  │ ├── 100000.txt // 버전 코드가 파일 이름이된다
  │ └── 100100.txt
  └── ja-JP
  └── changelogs
  └── 100100.txt

fastlane 준비는 끝났습니다.

87p Step.2(1/2)

  • CI가 master 푸시에 반응하여 릴리즈 빌드를 만들고 fastlane을 실행용에 설정하자.
release:
   steps:
      - script:
         name: Upload to GooglePlay.
         code: |
            ls -la $WERCKER_REPORT_ARTIFACTS_DIR
            ./script/deploy/deploy2googleplay.shv

88p Step.2(2/2)

  • /deploy2googleplay.sh 내부
fastlane supply run -p com.wakwak.awsomeglobalapp \
-j ./app/signingConfigs/json_key.json \
-u \
"./app/build/outputs/apk/app-production-arm64-v8a-release.apk",\
"./app/build/outputs/apk/app-production-armeabi-release.apk",\
"./app/build/outputs/apk/app-production-armeabi-v7a-release.apk",\
"./app/build/outputs/apk/app-production-mips-release.apk",\
"./app/build/outputs/apk/app-production-x86-release.apk",\
"./app/build/outputs/apk/app-production-x86_64-release.apk" \
--verbose --skip_upload_images --skip_upload_screenshots

여기까지하면

일단 빌드 → 릴리즈는 완성입니다

89p

Q. 왠지 귀찮은가?

90p

A. 예. 비교적 공정깁니다. 그래도 굉장히 생략했습니다

91p 의외로 귀찮다

  • 자동화의 흐름을 구성하는 것은 매우 재미있지만, 처음에는 자잘한 작업이 많기때문에 조금 귀찮게 느낄지도 모릅니다.
  • 포근한 수작업 릴리즈를 그만두려면 포근한 작업에 의해 의외로 할 수 없습니다.
  • 베스트는 스토어의 소유자가 처음에 확! 계속 작업해 버리는 것.

92p Step.3(1/2)

  • 업로드 완료를 알리자

release라는 channel에 빌드 완료를 알리는 step을 추가합니다.

after-steps:
   - slack-notifier:
      url: $SLACK_URL_RELEASE
      channel: release
      username: wercker

93p Step.3(2/2)

전체로 이런 느낌이 아닐까 생각됩니다.

release:
   steps:
      - script:
         name: Upload to GooglePlay.
         code: |
            ls -la $WERCKER_REPORT_ARTIFACTS_DIR
            ./script/deploy/deploy2googleplay.sh
   after-steps:
      - slack-notifier:
         url: $SLACK_URL_RELEASE
         channel: release
         username: wercker

94p Step.4 (1/1)

  • 스토어의 업데이트를 알리자

tonkotsu을 사용합니다

설정 방법은 스토어에 자세하게 쓰여 있습니다.

> go run tonkotsu.go config.go -c config.toml
  • 이제 스토어가 업데이트되었을 때 Slack의 알림을 보낼 수 있기 때문에 기동만 해두면 다른 작업에 집중할 수 있습니다

95p

이만큼 준비해두면 이후에는

96p ~ 97p

(대략) git push origin master 로 OK 입니다

98p Agenda

  • 자동화 분위기
    • 목적이나 동기 부여, 가능한 것, 장점 등
  • 릴리즈 자동화 관련 도구 소개
    • Android 앱 릴리즈 자동화하는데 유용한 도구들을 소개합니다.
  • 어떻게 하는가? (도입 준비)
    • 여러 프로젝트를 예로 들어 자동화한 릴리즈 흐름을 도입하는 것을 생각해봅니다.
  • 어떻게 하는가? (도입)
    • 실제로 도입하는 데 필요한 작업을 확인하겠습니다.
  • 실패하기 쉬운 사례와 주의점
  • 정리
  • 질의응답

99p

실패하기 쉬운 사례와 주의점

100p Case.1

뭐든지 자동화하려고 한다

101p 뭐든지 자동화하려고 한다

  • 앞서 언급했지만, 자동화 작업 자체는 귀찮고 여러 가지 해야 합니다.
  • 그래서 릴리즈 사이클 중에 병목 현상이 발생하는 곳에 한정하여 자동화를 적용함으로써 효과가 극대화됩니다.

102p 예를 들어

  • 릴리즈 알림의 Twitter나 사내 정보 공유 도구에 업데이트 내용을 게시하세요!
    • 멋진 생각입니다만, 원래는 각 도구에 직접 쓰는 것이 유연성이 높은 것을 일일이 자동화하면 업데이트 단계가 발생합니다.
    • 과도한 자동화는 속인성을 높여버린다고 생각합니다.

103p Case.2

자신이 레포지토리 소유자는 아니다

104p 자신이 레포지토리 소유자는 아니다

  • 자동화함에 있어서는 민감한 파일이나 정보를 다루게 됩니다.
  • 그럴 때 그 사람마다 정보 확인하고 자동화 흐름을 추가해 나가는 것은 어렵습니다.
  • 가능한 자동화 레포지토리 소유자에 가까운 상태에서 실시하여 도입의 용이성이 달라집니다.
  • 레일을 깔아주면 후속 개발자는 거기에 얹혀서 갑니다.

105p Agenda

  • 자동화 분위기
    • 목적이나 동기 부여, 가능한 것, 장점 등
  • 릴리즈 자동화 관련 도구 소개
    • Android 앱 릴리즈 자동화하는데 유용한 도구들을 소개합니다.
  • 어떻게 하는가? (도입 준비)
    • 여러 프로젝트를 예로 들어 자동화한 릴리즈 흐름을 도입하는 것을 생각해봅니다.
  • 어떻게 하는가? (도입)
    • 실제로 도입하는 데 필요한 작업을 확인하겠습니다.
  • 실패하기 쉬운 사례와 주의점
  • 정리
  • 질의응답

106p

정리해 보겠습니다

107p 정리

  • 자동화 공정이 걸리기 때문에 도입할 곳을 결정하고 거기만 할 것.
    • “여기까지 필요한가…?”라고 한 번이라도 생각되면 그 부분에 대해서는 하지 않는다.
  • 애초에 자동화 필요 없는 프로젝트도 있다.
    • 팀에서 대화를 해보면 좋을지도 모른다.
  • 자동화하면 혜택은 있다. 그래서 적극적으로 검토해보면 좋겠다!

108p

이상입니다!

경청해 주셔서 감사합니다!

comments powered by Disqus

Currnte Pages Tags

Android DroidKaigi

About

Pluu, Android Developer Blog Site

이전 블로그 링크 :네이버 블로그

Using Theme : SOLID SOLID Github

Social Links