Pro Yearly is on sale from $80 to $50! »

既存プロジェクトへCI/CDをどう導入するか? / How to introduce CI/CD into existing projects?

Dbab5e5a1fd54531e1119ede6b3b9e65?s=47 Ryosuke Horie
December 16, 2019

既存プロジェクトへCI/CDをどう導入するか? / How to introduce CI/CD into existing projects?

Dbab5e5a1fd54531e1119ede6b3b9e65?s=128

Ryosuke Horie

December 16, 2019
Tweet

Transcript

  1. 既存プロジェクトへCI/CDをどう導入 するか?
 ZOZOTOWN AndroidへのCI/CDの導入
 株式会社ZOZOテクノロジーズ
 開発部
 堀江 亮介 Copyright ©

    ZOZO Technologies, Inc.
  2. © ZOZO Technologies, Inc. 自己紹介
 2 ZOZOテクノロジーズ 開発部 Androidエンジニア Tech

    Lead 堀江 亮介 Ryosuke Horie ・自動化とビールが好き ・ @Horie1024
  3. © ZOZO Technologies, Inc. https://zozo.jp/
 • 日本最大級のファッション通販サイト
 • 1,200以上のショップ、7,300以上のブランドの取り扱い(ともに2019年6 月末時点)


    • 常時73万点以上の商品アイテム数と毎日平均3,200点以上の新着 商 品を掲載
 • 即日配送サービス
 • ギフトラッピングサービス
 • ツケ払い など
 3
  4. © ZOZO Technologies, Inc. • 導入の経緯
 • なぜCI/CDを導入するのか?
 • 導入の流れ


    ◦ 導入計画の策定
 ◦ 導入計画の実施
 • 継続的なCI/CD機能のアップデート
 今日話す内容
 4
  5. © ZOZO Technologies, Inc. 導入の経緯
 5

  6. © ZOZO Technologies, Inc. ZOZOTOWN Android
 6 • 2012年5月リリース
 •

    長い運用期間
 • それなりの規模のアプリ
 ◦ Activity: 8, Fragment: 94
 ◦ (ほぼ)Single Activity App

  7. © ZOZO Technologies, Inc. ZOZOTOWN Android 2019年4月〜
 7 • メンバーが増える

    3 → 8 (自分もこのタイミングで参加)

  8. © ZOZO Technologies, Inc. ZOZOTOWN Android 2019年4月〜
 8 • メンバーが増える

    3 → 8 (自分もこのタイミングで参加)
 • 高い品質で素早く開発できるチームづくりを求められる

  9. © ZOZO Technologies, Inc. ZOZOTOWN Android 2019年4月〜
 9 • メンバーが増える

    3 → 8 (自分もこのタイミングで参加)
 • 高い品質で素早く開発できるチームづくりを求められる
 • 2つの軸でアプローチ
 ◦ アジャイルな開発フローの導入
 ◦ CI/CDの導入

  10. © ZOZO Technologies, Inc. ZOZOTOWN Android 2019年4月〜
 10 • メンバーが増える

    3 → 8 (自分もこのタイミングで参加)
 • 高い品質で素早く開発できるチームづくりを求められる
 • 2つの軸でアプローチ
 ◦ アジャイルな開発フローの導入
 ◦ CI/CDの導入

  11. © ZOZO Technologies, Inc. なぜCI/CDを導入するのか?
 11

  12. © ZOZO Technologies, Inc. ユーザーに価値を素早く届ける
 12 • 品質の向上
 • 開発フローの効率化


    • リリースフローの効率化

  13. © ZOZO Technologies, Inc. CI/CD導入でチームに良い影響を与える
 13 • 単に技術の導入にとどまらない


  14. © ZOZO Technologies, Inc. CI/CD導入でチームに良い影響を与える
 14 • 単に技術の導入にとどまらない
 • 組織や組織文化にも影響を与える


  15. © ZOZO Technologies, Inc. CI/CD導入でチームに良い影響を与える
 15 • 単に技術の導入にとどまらない
 • 組織や組織文化にも影響を与える


    • 文化を変えることも目的
 ◦ アジャイルな開発への移行を促す
 ◦ ハイパフォーマンスなチームを目指す
 ▪ 書籍「LeanとDevOpsの科学」が参考になる

  16. © ZOZO Technologies, Inc. CI/CD導入の流れ
 16

  17. © ZOZO Technologies, Inc. CI/CD導入の流れ
 
 
 17 • 導入計画の決定


    • 導入計画の実施
 • 継続的なCI/CD機能のアップデート

  18. © ZOZO Technologies, Inc. CI/CD導入の流れ
 
 
 18 • 導入計画の決定


    ◦ CI/CDをどう導入していくか
 • 導入計画の実施
 ◦ プロジェクトへ実際に導入する
 • 継続的なCI/CD機能のアップデート
 ◦ チームの状況に応じてCI/CDの機能をアップデート

  19. © ZOZO Technologies, Inc. 導入計画の決定
 19

  20. © ZOZO Technologies, Inc. 段階的な導入
 20 • 一度に多くを変えるとチームへの負担が増す
 • CI/CDの機能のうち「どの機能」を「どの順番」で導入していくか


    • 最初からフル機能のCI/CDを実現しようとしない

  21. © ZOZO Technologies, Inc. CI/CDの機能
 21 • どの機能から導入を始めるか?
 ◦ ビルド


    ◦ 静的解析(Android Lintなど)
 ◦ テスト(Local Unit Test、Instrumentation Test)
 ◦ デリバリー(開発版の配布、リリース自動化)

  22. © ZOZO Technologies, Inc. 導入する機能をどう決めるか?
 22 • 導入による効果が高いものから導入する


  23. © ZOZO Technologies, Inc. 導入する機能をどう決めるか?
 23 • 導入による効果が高いものから導入する
 • プロジェクトの状況把握


    ◦ チームメンバーからのヒアリング
 ▪ 開発・リリースフローの課題
 ◦ コードを読む
 ▪ テストコードの有無
 ▪ Android Lintの結果

  24. © ZOZO Technologies, Inc. ZOZOTOWN Androidの状況
 24 • 開発・リリースフローの課題
 ◦

    手動でのビルドとQA-SETチームへの配布が煩雑

  25. © ZOZO Technologies, Inc. ZOZOTOWN Androidの状況
 25 • 開発・リリースフローの課題
 ◦

    手動でのビルドとQA-SETチームへの配布が煩雑
 • テストコードの有無
 ◦ テストコード有り
 ▪ Local Unit Test: 有り
 • カバレッジが低く、数も少ない
 ▪ Instrumentation Test: 無し

  26. © ZOZO Technologies, Inc. ZOZOTOWN Androidの状況
 26 • 開発・リリースフローの課題
 ◦

    手動でのビルドとQA-SETチームへの配布が煩雑
 • テストコードの有無
 ◦ テストコード有り
 ▪ Local Unit Test: 有り
 • カバレッジが低く、数も少ない
 ▪ Instrumentation Test: 無し
 • Android Lintの結果
 ◦ 膨大な指摘数、特に対策が行われていない

  27. © ZOZO Technologies, Inc. 導入計画
 27 次の順番で導入
 1. アプリのビルドと社内への配布
 2.

    静的解析(Android Lint)
 3. テスト(Local Unit Test)
 
 計画に含めず必要になったタイミングで導入
 • テスト(Instrumentation Test)
 • デリバリー(リリース自動化)

  28. © ZOZO Technologies, Inc. 導入計画の実施
 28

  29. © ZOZO Technologies, Inc. 導入計画の実施
 29 • 決定した計画に沿って実際にCI/CDの機能を導入していく
 • 導入しただけでは十分な効果が出ない場合がある


    • チームが効果的にCI/CDのプラクティスを行えるようフォロー

  30. © ZOZO Technologies, Inc. 導入計画
 30 1. アプリのビルドと社内への配布
 2. 静的解析(Android

    Lint)
 3. テスト(Local Unit Test)
 

  31. © ZOZO Technologies, Inc. アプリのビルドと社内への配布
 31 • 既存の開発・リリースフローを確認し置き換える
 ◦ APK生成しS3にアップロード


    ◦ QA-SETチームがダウンロードして使用
 S3 QA-SETチーム
  32. © ZOZO Technologies, Inc. アプリのビルドと社内への配布
 32 • 既存の開発・リリースフローの確認し置き換える
 ◦ Bitrise

    + DeployGateの構成
 ◦ developブランチへのマージで配布
 QA-SETチーム
  33. © ZOZO Technologies, Inc. 導入開始後: オールグリーンを保つ
 33 • ビルドをオールグリーンで保つのはCIの重要なプラクティス
 •

    チームの文化として根付かせる
 ◦ CIが通ったらマージを言い続ける 
 ◦ Require status checks to pass before mergingを有効化するのも良い

  34. © ZOZO Technologies, Inc. 導入計画
 34 1. アプリのビルドと社内への配布
 2. 静的解析(Android

    Lint)
 3. テスト(Local Unit Test)
 

  35. © ZOZO Technologies, Inc. 静的解析(Android Lint)
 35 • コミット単位での実行
 ◦

    常に検査する状況を作る
 • ただ導入しただけではLintの指摘に気づかない問題
 ◦ Dangerを導入する
 ▪ Dangerの指摘に対応して貰えるようレビューでコメント
 ▪ チームの文化として根付かせる

  36. © ZOZO Technologies, Inc. 導入計画
 36 1. アプリのビルドと社内への配布
 2. 静的解析(Android

    Lint)
 3. テスト(Local Unit Test)
 

  37. © ZOZO Technologies, Inc. テスト(Local Unit Test)
 37 • コミット単位での実行


    • 導入した効果を高めるにはテストコードを増やすことが不可欠
 ◦ テストが書きやすい設計・アーキテクチャの整備
 ◦ チーム全員で学習する機会を作る
 ▪ 設計・アーキテクチャの共有
 ▪ Codelab会

  38. © ZOZO Technologies, Inc. 設計・アーキテクチャの整備と共有
 38 • ドキュメント化
 • チーム内で共有


    • チーム全員で共通認識を持つ

  39. © ZOZO Technologies, Inc. 設計・アーキテクチャの整備と共有
 39 • Jetpackの標準アーキテクチャ + UseCase層


    • AAC ViewModel + Coroutine

  40. © 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

  41. © ZOZO Technologies, Inc. 継続的なCI/CD機能のアップデート
 41

  42. © ZOZO Technologies, Inc. 必要に応じてCI/CDの機能を追加していく
 42 • チームの活動や振り返りを通して課題を探す


  43. © ZOZO Technologies, Inc. 必要に応じてCI/CDの機能を追加していく
 43 • チームの活動や振り返りを通して課題を探す
 • ZOZOTOWN

    Androidチーム
 ◦ スクラムのプラクティスを取り入れた開発フロー
 ▪ スプリント
 ▪ スプリント計画・レビュー
 ▪ レトロスペクティブ(振り返り)
 ◦ 週次の振り返りで課題を把握
 ◦ CI/CDで解決できることなら機能を追加して対応

  44. © ZOZO Technologies, Inc. 機能の追加例
 44

  45. © ZOZO Technologies, Inc. 例: デザイン確認の効率化
 45 • 課題
 ◦

    都度APKをGoogleドライブ経由でデザイナーへ配布
 ◦ 確認用APKのビルドと配布の効率化
 • 解決策
 ◦ PR単位でのDeployGateによるアプリ配布をCI/CDの機能に追加
 ◦ 「GitHub Actionsを用いたDeployGateアプリ配布の自動化」としてスライドにまとめて います

  46. © 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の機能に追加

  47. © ZOZO Technologies, Inc. Shared Test
 47 • MigrationのテストはInstrumentation Testとして配置


    • 通常のRoomのテストはShared Testとして配置
 ◦ 開発中、コミット単位ではLocal Unit Testを実行
 ◦ PRのタイミングでInstrumentation Testを実行

  48. © ZOZO Technologies, Inc. Instrumentation Test
 48 • BitriseのVirtual Device

    Testingを利用
 • BitriseとGitHub Actionsの併用
 ◦ PR関連のタスクをGitHub Actionsへ移行し検証
 ◦ 試行錯誤

  49. © ZOZO Technologies, Inc. 例: AAB対応
 49 • 課題
 ◦

    AAB対応をする上で既存のリリースフローの変更が必要
 • 解決策
 ◦ リリースフローの洗い出しと再検討
 ◦ デリバリー(リリース自動化)をCI/CDの機能に追加
 ▪ 公開までの自動化はしない
 ▪ Play Consoleへのaabファイルのアップロードまでを自動化

  50. © ZOZO Technologies, Inc. まとめ
 50

  51. © ZOZO Technologies, Inc. まとめ
 51 • CI/CDはプロジェクトの状況に合わせて段階的に導入
 • 導入後CI/CDがチームに根付くようフォロー


    • 継続的な機能アップデートでより良い環境・チームを作っていきたい

  52. None