既存プロジェクトへCI/CDをどう導入するか? ZOZOTOWN AndroidへのCI/CDの導入 株式会社ZOZOテクノロジーズ 開発部 堀江 亮介Copyright © ZOZO Technologies, Inc.
View Slide
© ZOZO Technologies, Inc.自己紹介 2ZOZOテクノロジーズ開発部 Androidエンジニア Tech Lead堀江 亮介 Ryosuke Horie・自動化とビールが好き・ @Horie1024
© ZOZO Technologies, Inc.https://zozo.jp/ ● 日本最大級のファッション通販サイト ● 1,200以上のショップ、7,300以上のブランドの取り扱い(ともに2019年6月末時点) ● 常時73万点以上の商品アイテム数と毎日平均3,200点以上の新着 商品を掲載 ● 即日配送サービス ● ギフトラッピングサービス ● ツケ払い など 3
© ZOZO Technologies, Inc.● 導入の経緯 ● なぜCI/CDを導入するのか? ● 導入の流れ ○ 導入計画の策定 ○ 導入計画の実施 ● 継続的なCI/CD機能のアップデート 今日話す内容 4
© ZOZO Technologies, Inc.導入の経緯 5
© ZOZO Technologies, Inc.ZOZOTOWN Android 6● 2012年5月リリース ● 長い運用期間 ● それなりの規模のアプリ ○ Activity: 8, Fragment: 94 ○ (ほぼ)Single Activity App
© ZOZO Technologies, Inc.ZOZOTOWN Android 2019年4月〜 7● メンバーが増える 3 → 8 (自分もこのタイミングで参加)
© ZOZO Technologies, Inc.ZOZOTOWN Android 2019年4月〜 8● メンバーが増える 3 → 8 (自分もこのタイミングで参加) ● 高い品質で素早く開発できるチームづくりを求められる
© ZOZO Technologies, Inc.ZOZOTOWN Android 2019年4月〜 9● メンバーが増える 3 → 8 (自分もこのタイミングで参加) ● 高い品質で素早く開発できるチームづくりを求められる ● 2つの軸でアプローチ ○ アジャイルな開発フローの導入 ○ CI/CDの導入
© ZOZO Technologies, Inc.ZOZOTOWN Android 2019年4月〜 10● メンバーが増える 3 → 8 (自分もこのタイミングで参加) ● 高い品質で素早く開発できるチームづくりを求められる ● 2つの軸でアプローチ ○ アジャイルな開発フローの導入 ○ CI/CDの導入
© ZOZO Technologies, Inc.なぜCI/CDを導入するのか? 11
© ZOZO Technologies, Inc.ユーザーに価値を素早く届ける 12● 品質の向上 ● 開発フローの効率化 ● リリースフローの効率化
© ZOZO Technologies, Inc.CI/CD導入でチームに良い影響を与える 13● 単に技術の導入にとどまらない
© ZOZO Technologies, Inc.CI/CD導入でチームに良い影響を与える 14● 単に技術の導入にとどまらない ● 組織や組織文化にも影響を与える
© ZOZO Technologies, Inc.CI/CD導入でチームに良い影響を与える 15● 単に技術の導入にとどまらない ● 組織や組織文化にも影響を与える ● 文化を変えることも目的 ○ アジャイルな開発への移行を促す ○ ハイパフォーマンスなチームを目指す ■ 書籍「LeanとDevOpsの科学」が参考になる
© ZOZO Technologies, Inc.CI/CD導入の流れ 16
© ZOZO Technologies, Inc.CI/CD導入の流れ 17● 導入計画の決定 ● 導入計画の実施 ● 継続的なCI/CD機能のアップデート
© ZOZO Technologies, Inc.CI/CD導入の流れ 18● 導入計画の決定 ○ CI/CDをどう導入していくか ● 導入計画の実施 ○ プロジェクトへ実際に導入する ● 継続的なCI/CD機能のアップデート ○ チームの状況に応じてCI/CDの機能をアップデート
© ZOZO Technologies, Inc.導入計画の決定 19
© ZOZO Technologies, Inc.段階的な導入 20● 一度に多くを変えるとチームへの負担が増す ● CI/CDの機能のうち「どの機能」を「どの順番」で導入していくか ● 最初からフル機能のCI/CDを実現しようとしない
© ZOZO Technologies, Inc.CI/CDの機能 21● どの機能から導入を始めるか? ○ ビルド ○ 静的解析(Android Lintなど) ○ テスト(Local Unit Test、Instrumentation Test) ○ デリバリー(開発版の配布、リリース自動化)
© ZOZO Technologies, Inc.導入する機能をどう決めるか? 22● 導入による効果が高いものから導入する
© ZOZO Technologies, Inc.導入する機能をどう決めるか? 23● 導入による効果が高いものから導入する ● プロジェクトの状況把握 ○ チームメンバーからのヒアリング ■ 開発・リリースフローの課題 ○ コードを読む ■ テストコードの有無 ■ Android Lintの結果
© ZOZO Technologies, Inc.ZOZOTOWN Androidの状況 24● 開発・リリースフローの課題 ○ 手動でのビルドとQA-SETチームへの配布が煩雑
© ZOZO Technologies, Inc.ZOZOTOWN Androidの状況 25● 開発・リリースフローの課題 ○ 手動でのビルドとQA-SETチームへの配布が煩雑 ● テストコードの有無 ○ テストコード有り ■ Local Unit Test: 有り ● カバレッジが低く、数も少ない ■ Instrumentation Test: 無し
© ZOZO Technologies, Inc.ZOZOTOWN Androidの状況 26● 開発・リリースフローの課題 ○ 手動でのビルドとQA-SETチームへの配布が煩雑 ● テストコードの有無 ○ テストコード有り ■ Local Unit Test: 有り ● カバレッジが低く、数も少ない ■ Instrumentation Test: 無し ● Android Lintの結果 ○ 膨大な指摘数、特に対策が行われていない
© ZOZO Technologies, Inc.導入計画 27次の順番で導入 1. アプリのビルドと社内への配布 2. 静的解析(Android Lint) 3. テスト(Local Unit Test) 計画に含めず必要になったタイミングで導入 ● テスト(Instrumentation Test) ● デリバリー(リリース自動化)
© ZOZO Technologies, Inc.導入計画の実施 28
© ZOZO Technologies, Inc.導入計画の実施 29● 決定した計画に沿って実際にCI/CDの機能を導入していく ● 導入しただけでは十分な効果が出ない場合がある ● チームが効果的にCI/CDのプラクティスを行えるようフォロー
© ZOZO Technologies, Inc.導入計画 301. アプリのビルドと社内への配布 2. 静的解析(Android Lint) 3. テスト(Local Unit Test)
© ZOZO Technologies, Inc.アプリのビルドと社内への配布 31● 既存の開発・リリースフローを確認し置き換える ○ APK生成しS3にアップロード ○ QA-SETチームがダウンロードして使用 S3QA-SETチーム
© ZOZO Technologies, Inc.アプリのビルドと社内への配布 32● 既存の開発・リリースフローの確認し置き換える ○ Bitrise + DeployGateの構成 ○ developブランチへのマージで配布 QA-SETチーム
© ZOZO Technologies, Inc.導入開始後: オールグリーンを保つ 33● ビルドをオールグリーンで保つのはCIの重要なプラクティス ● チームの文化として根付かせる ○ CIが通ったらマージを言い続ける ○ Require status checks to pass before mergingを有効化するのも良い
© ZOZO Technologies, Inc.導入計画 341. アプリのビルドと社内への配布 2. 静的解析(Android Lint) 3. テスト(Local Unit Test)
© ZOZO Technologies, Inc.静的解析(Android Lint) 35● コミット単位での実行 ○ 常に検査する状況を作る ● ただ導入しただけではLintの指摘に気づかない問題 ○ Dangerを導入する ■ Dangerの指摘に対応して貰えるようレビューでコメント ■ チームの文化として根付かせる
© ZOZO Technologies, Inc.導入計画 361. アプリのビルドと社内への配布 2. 静的解析(Android Lint) 3. テスト(Local Unit Test)
© ZOZO Technologies, Inc.テスト(Local Unit Test) 37● コミット単位での実行 ● 導入した効果を高めるにはテストコードを増やすことが不可欠 ○ テストが書きやすい設計・アーキテクチャの整備 ○ チーム全員で学習する機会を作る ■ 設計・アーキテクチャの共有 ■ Codelab会
© ZOZO Technologies, Inc.設計・アーキテクチャの整備と共有 38● ドキュメント化 ● チーム内で共有 ● チーム全員で共通認識を持つ
© ZOZO Technologies, Inc.設計・アーキテクチャの整備と共有 39● Jetpackの標準アーキテクチャ + UseCase層 ● AAC ViewModel + Coroutine
© ZOZO Technologies, Inc.Codelab会 40● チーム全員でCodelabを実施 ● 予め決めた担当がナビゲーターとして進める ● 今までやってみたCodelabの例 ○ Using Kotlin Coroutines in your Android App ○ Android Room with a View - Kotlin ○ Using Dagger in your Android app ○ Jetpack Compose Basic
© ZOZO Technologies, Inc.継続的なCI/CD機能のアップデート 41
© ZOZO Technologies, Inc.必要に応じてCI/CDの機能を追加していく 42● チームの活動や振り返りを通して課題を探す
© ZOZO Technologies, Inc.必要に応じてCI/CDの機能を追加していく 43● チームの活動や振り返りを通して課題を探す ● ZOZOTOWN Androidチーム ○ スクラムのプラクティスを取り入れた開発フロー ■ スプリント ■ スプリント計画・レビュー ■ レトロスペクティブ(振り返り) ○ 週次の振り返りで課題を把握 ○ CI/CDで解決できることなら機能を追加して対応
© ZOZO Technologies, Inc.機能の追加例 44
© ZOZO Technologies, Inc.例: デザイン確認の効率化 45● 課題 ○ 都度APKをGoogleドライブ経由でデザイナーへ配布 ○ 確認用APKのビルドと配布の効率化 ● 解決策 ○ PR単位でのDeployGateによるアプリ配布をCI/CDの機能に追加 ○ 「GitHub Actionsを用いたDeployGateアプリ配布の自動化」としてスライドにまとめています
© ZOZO Technologies, Inc.例: Roomの導入 46● 課題 ○ GreenDAOからRoomへの置き換えを推進 ○ Local Unit Test非推奨 ■ https://developer.android.com/training/data-storage/room/testing-db#host-machine ○ Local Unit TestとInstrumentation Testの両方で実行したい ● 解決策 ○ Shared Testを導入 ○ テスト(Instrumentation Test)をCI/CDの機能に追加
© ZOZO Technologies, Inc.Shared Test 47● MigrationのテストはInstrumentation Testとして配置 ● 通常のRoomのテストはShared Testとして配置 ○ 開発中、コミット単位ではLocal Unit Testを実行 ○ PRのタイミングでInstrumentation Testを実行
© ZOZO Technologies, Inc.Instrumentation Test 48● BitriseのVirtual Device Testingを利用 ● BitriseとGitHub Actionsの併用 ○ PR関連のタスクをGitHub Actionsへ移行し検証 ○ 試行錯誤
© ZOZO Technologies, Inc.例: AAB対応 49● 課題 ○ AAB対応をする上で既存のリリースフローの変更が必要 ● 解決策 ○ リリースフローの洗い出しと再検討 ○ デリバリー(リリース自動化)をCI/CDの機能に追加 ■ 公開までの自動化はしない ■ Play Consoleへのaabファイルのアップロードまでを自動化
© ZOZO Technologies, Inc.まとめ 50
© ZOZO Technologies, Inc.まとめ 51● CI/CDはプロジェクトの状況に合わせて段階的に導入 ● 導入後CI/CDがチームに根付くようフォロー ● 継続的な機能アップデートでより良い環境・チームを作っていきたい