Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Ryosuke Horie
December 16, 2019

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

Ryosuke Horie

December 16, 2019
Tweet

More Decks by Ryosuke Horie

Other Decks in Programming

Transcript

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

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


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


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

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

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

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

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

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

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

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

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


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

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


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

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


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

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


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

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


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

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

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

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

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

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

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

  16. © ZOZO Technologies, Inc. 導入開始後: オールグリーンを保つ
 33 • ビルドをオールグリーンで保つのはCIの重要なプラクティス
 •

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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