$30 off During Our Annual Pro Sale. View Details »

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

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. 既存プロジェクトへCI/CDをどう導入
    するか?

    ZOZOTOWN AndroidへのCI/CDの導入

    株式会社ZOZOテクノロジーズ

    開発部

    堀江 亮介
    Copyright © ZOZO Technologies, Inc.

    View Slide

  2. © ZOZO Technologies, Inc.
    自己紹介

    2
    ZOZOテクノロジーズ
    開発部 Androidエンジニア Tech Lead
    堀江 亮介 Ryosuke Horie
    ・自動化とビールが好き
    ・ @Horie1024

    View Slide

  3. © ZOZO Technologies, Inc.
    https://zozo.jp/

    ● 日本最大級のファッション通販サイト

    ● 1,200以上のショップ、7,300以上のブランドの取り扱い(ともに2019年6
    月末時点)

    ● 常時73万点以上の商品アイテム数と毎日平均3,200点以上の新着 商
    品を掲載

    ● 即日配送サービス

    ● ギフトラッピングサービス

    ● ツケ払い など

    3

    View Slide

  4. © ZOZO Technologies, Inc.
    ● 導入の経緯

    ● なぜCI/CDを導入するのか?

    ● 導入の流れ

    ○ 導入計画の策定

    ○ 導入計画の実施

    ● 継続的なCI/CD機能のアップデート

    今日話す内容

    4

    View Slide

  5. © ZOZO Technologies, Inc.
    導入の経緯

    5

    View Slide

  6. © ZOZO Technologies, Inc.
    ZOZOTOWN Android

    6
    ● 2012年5月リリース

    ● 長い運用期間

    ● それなりの規模のアプリ

    ○ Activity: 8, Fragment: 94

    ○ (ほぼ)Single Activity App


    View Slide

  7. © ZOZO Technologies, Inc.
    ZOZOTOWN Android 2019年4月〜

    7
    ● メンバーが増える 3 → 8 (自分もこのタイミングで参加)


    View Slide

  8. © ZOZO Technologies, Inc.
    ZOZOTOWN Android 2019年4月〜

    8
    ● メンバーが増える 3 → 8 (自分もこのタイミングで参加)

    ● 高い品質で素早く開発できるチームづくりを求められる


    View Slide

  9. © ZOZO Technologies, Inc.
    ZOZOTOWN Android 2019年4月〜

    9
    ● メンバーが増える 3 → 8 (自分もこのタイミングで参加)

    ● 高い品質で素早く開発できるチームづくりを求められる

    ● 2つの軸でアプローチ

    ○ アジャイルな開発フローの導入

    ○ CI/CDの導入


    View Slide

  10. © ZOZO Technologies, Inc.
    ZOZOTOWN Android 2019年4月〜

    10
    ● メンバーが増える 3 → 8 (自分もこのタイミングで参加)

    ● 高い品質で素早く開発できるチームづくりを求められる

    ● 2つの軸でアプローチ

    ○ アジャイルな開発フローの導入

    ○ CI/CDの導入


    View Slide

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

    11

    View Slide

  12. © ZOZO Technologies, Inc.
    ユーザーに価値を素早く届ける

    12
    ● 品質の向上

    ● 開発フローの効率化

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


    View Slide

  13. © ZOZO Technologies, Inc.
    CI/CD導入でチームに良い影響を与える

    13
    ● 単に技術の導入にとどまらない


    View Slide

  14. © ZOZO Technologies, Inc.
    CI/CD導入でチームに良い影響を与える

    14
    ● 単に技術の導入にとどまらない

    ● 組織や組織文化にも影響を与える


    View Slide

  15. © ZOZO Technologies, Inc.
    CI/CD導入でチームに良い影響を与える

    15
    ● 単に技術の導入にとどまらない

    ● 組織や組織文化にも影響を与える

    ● 文化を変えることも目的

    ○ アジャイルな開発への移行を促す

    ○ ハイパフォーマンスなチームを目指す

    ■ 書籍「LeanとDevOpsの科学」が参考になる


    View Slide

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

    16

    View Slide

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



    17
    ● 導入計画の決定

    ● 導入計画の実施

    ● 継続的なCI/CD機能のアップデート


    View Slide

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



    18
    ● 導入計画の決定

    ○ CI/CDをどう導入していくか

    ● 導入計画の実施

    ○ プロジェクトへ実際に導入する

    ● 継続的なCI/CD機能のアップデート

    ○ チームの状況に応じてCI/CDの機能をアップデート


    View Slide

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

    19

    View Slide

  20. © ZOZO Technologies, Inc.
    段階的な導入

    20
    ● 一度に多くを変えるとチームへの負担が増す

    ● CI/CDの機能のうち「どの機能」を「どの順番」で導入していくか

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


    View Slide

  21. © ZOZO Technologies, Inc.
    CI/CDの機能

    21
    ● どの機能から導入を始めるか?

    ○ ビルド

    ○ 静的解析(Android Lintなど)

    ○ テスト(Local Unit Test、Instrumentation Test)

    ○ デリバリー(開発版の配布、リリース自動化)


    View Slide

  22. © ZOZO Technologies, Inc.
    導入する機能をどう決めるか?

    22
    ● 導入による効果が高いものから導入する


    View Slide

  23. © ZOZO Technologies, Inc.
    導入する機能をどう決めるか?

    23
    ● 導入による効果が高いものから導入する

    ● プロジェクトの状況把握

    ○ チームメンバーからのヒアリング

    ■ 開発・リリースフローの課題

    ○ コードを読む

    ■ テストコードの有無

    ■ Android Lintの結果


    View Slide

  24. © ZOZO Technologies, Inc.
    ZOZOTOWN Androidの状況

    24
    ● 開発・リリースフローの課題

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


    View Slide

  25. © ZOZO Technologies, Inc.
    ZOZOTOWN Androidの状況

    25
    ● 開発・リリースフローの課題

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

    ● テストコードの有無

    ○ テストコード有り

    ■ Local Unit Test: 有り

    ● カバレッジが低く、数も少ない

    ■ Instrumentation Test: 無し


    View Slide

  26. © ZOZO Technologies, Inc.
    ZOZOTOWN Androidの状況

    26
    ● 開発・リリースフローの課題

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

    ● テストコードの有無

    ○ テストコード有り

    ■ Local Unit Test: 有り

    ● カバレッジが低く、数も少ない

    ■ Instrumentation Test: 無し

    ● Android Lintの結果

    ○ 膨大な指摘数、特に対策が行われていない


    View Slide

  27. © ZOZO Technologies, Inc.
    導入計画

    27
    次の順番で導入

    1. アプリのビルドと社内への配布

    2. 静的解析(Android Lint)

    3. テスト(Local Unit Test)


    計画に含めず必要になったタイミングで導入

    ● テスト(Instrumentation Test)

    ● デリバリー(リリース自動化)


    View Slide

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

    28

    View Slide

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

    29
    ● 決定した計画に沿って実際にCI/CDの機能を導入していく

    ● 導入しただけでは十分な効果が出ない場合がある

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


    View Slide

  30. © ZOZO Technologies, Inc.
    導入計画

    30
    1. アプリのビルドと社内への配布

    2. 静的解析(Android Lint)

    3. テスト(Local Unit Test)


    View Slide

  31. © ZOZO Technologies, Inc.
    アプリのビルドと社内への配布

    31
    ● 既存の開発・リリースフローを確認し置き換える

    ○ APK生成しS3にアップロード

    ○ QA-SETチームがダウンロードして使用

    S3
    QA-SETチーム

    View Slide

  32. © ZOZO Technologies, Inc.
    アプリのビルドと社内への配布

    32
    ● 既存の開発・リリースフローの確認し置き換える

    ○ Bitrise + DeployGateの構成

    ○ developブランチへのマージで配布

    QA-SETチーム

    View Slide

  33. © ZOZO Technologies, Inc.
    導入開始後: オールグリーンを保つ

    33
    ● ビルドをオールグリーンで保つのはCIの重要なプラクティス

    ● チームの文化として根付かせる

    ○ CIが通ったらマージを言い続ける 

    ○ Require status checks to pass before mergingを有効化するのも良い


    View Slide

  34. © ZOZO Technologies, Inc.
    導入計画

    34
    1. アプリのビルドと社内への配布

    2. 静的解析(Android Lint)

    3. テスト(Local Unit Test)


    View Slide

  35. © ZOZO Technologies, Inc.
    静的解析(Android Lint)

    35
    ● コミット単位での実行

    ○ 常に検査する状況を作る

    ● ただ導入しただけではLintの指摘に気づかない問題

    ○ Dangerを導入する

    ■ Dangerの指摘に対応して貰えるようレビューでコメント

    ■ チームの文化として根付かせる


    View Slide

  36. © ZOZO Technologies, Inc.
    導入計画

    36
    1. アプリのビルドと社内への配布

    2. 静的解析(Android Lint)

    3. テスト(Local Unit Test)


    View Slide

  37. © ZOZO Technologies, Inc.
    テスト(Local Unit Test)

    37
    ● コミット単位での実行

    ● 導入した効果を高めるにはテストコードを増やすことが不可欠

    ○ テストが書きやすい設計・アーキテクチャの整備

    ○ チーム全員で学習する機会を作る

    ■ 設計・アーキテクチャの共有

    ■ Codelab会


    View Slide

  38. © ZOZO Technologies, Inc.
    設計・アーキテクチャの整備と共有

    38
    ● ドキュメント化

    ● チーム内で共有

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


    View Slide

  39. © ZOZO Technologies, Inc.
    設計・アーキテクチャの整備と共有

    39
    ● Jetpackの標準アーキテクチャ + UseCase層

    ● AAC ViewModel + Coroutine


    View Slide

  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


    View Slide

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

    41

    View Slide

  42. © ZOZO Technologies, Inc.
    必要に応じてCI/CDの機能を追加していく

    42
    ● チームの活動や振り返りを通して課題を探す


    View Slide

  43. © ZOZO Technologies, Inc.
    必要に応じてCI/CDの機能を追加していく

    43
    ● チームの活動や振り返りを通して課題を探す

    ● ZOZOTOWN Androidチーム

    ○ スクラムのプラクティスを取り入れた開発フロー

    ■ スプリント

    ■ スプリント計画・レビュー

    ■ レトロスペクティブ(振り返り)

    ○ 週次の振り返りで課題を把握

    ○ CI/CDで解決できることなら機能を追加して対応


    View Slide

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

    44

    View Slide

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

    45
    ● 課題

    ○ 都度APKをGoogleドライブ経由でデザイナーへ配布

    ○ 確認用APKのビルドと配布の効率化

    ● 解決策

    ○ PR単位でのDeployGateによるアプリ配布をCI/CDの機能に追加

    ○ 「GitHub Actionsを用いたDeployGateアプリ配布の自動化」としてスライドにまとめて
    います


    View Slide

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


    View Slide

  47. © ZOZO Technologies, Inc.
    Shared Test

    47
    ● MigrationのテストはInstrumentation Testとして配置

    ● 通常のRoomのテストはShared Testとして配置

    ○ 開発中、コミット単位ではLocal Unit Testを実行

    ○ PRのタイミングでInstrumentation Testを実行


    View Slide

  48. © ZOZO Technologies, Inc.
    Instrumentation Test

    48
    ● BitriseのVirtual Device Testingを利用

    ● BitriseとGitHub Actionsの併用

    ○ PR関連のタスクをGitHub Actionsへ移行し検証

    ○ 試行錯誤


    View Slide

  49. © ZOZO Technologies, Inc.
    例: AAB対応

    49
    ● 課題

    ○ AAB対応をする上で既存のリリースフローの変更が必要

    ● 解決策

    ○ リリースフローの洗い出しと再検討

    ○ デリバリー(リリース自動化)をCI/CDの機能に追加

    ■ 公開までの自動化はしない

    ■ Play Consoleへのaabファイルのアップロードまでを自動化


    View Slide

  50. © ZOZO Technologies, Inc.
    まとめ

    50

    View Slide

  51. © ZOZO Technologies, Inc.
    まとめ

    51
    ● CI/CDはプロジェクトの状況に合わせて段階的に導入

    ● 導入後CI/CDがチームに根付くようフォロー

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


    View Slide

  52. View Slide