Slide 1

Slide 1 text

マルチモジュールアーキテクチャへの移⾏と 開発プロセス改善の取り組み Sep 2nd, 2023 Natsumi Oishi Rakuten Group, Inc.

Slide 2

Slide 2 text

2 Natsumi Oishi Rakuten Group, Inc. Rakuten Rakuma

Slide 3

Slide 3 text

3 ラクマのこれまで

Slide 4

Slide 4 text

4 Objective-C to Swift Conversion (~2022) 👋

Slide 5

Slide 5 text

5 Architecture MVC MVP MVVM シンプルな ViewController のみ UIHostingController (SwiftUI) UIKit 製の ViewController

Slide 6

Slide 6 text

6 これから何をしていくか 🤔

Slide 7

Slide 7 text

7 Topics 1. SwiftUI の拡⼤、Interface Builder の削除 2. マルチモジュールアーキテクチャへの移⾏ 3. Gitブランチ戦略とリリースプロセスの⾃動化 4. リリースプロセスにおけるドキュメンテーション

Slide 8

Slide 8 text

8 SwiftUI の拡⼤、Interface Builder の削除

Slide 9

Slide 9 text

9 新しい技術を 積極的に取り⼊れていきたい 💪

Slide 10

Slide 10 text

10 Interface Builder は メンテナンスしづらい 🥺

Slide 11

Slide 11 text

11 How to proceed • ViewController / Viewコンポーネントを SwiftUI へ • 新規画⾯は SwiftUI で検討 • 残りの xib / storyboard をリストアップ • ⼿が空いている⼈が⾃由に着⼿ • UIKit or SwiftUI → 実装者が選択 SwiftUIの拡⼤、Interface Builderの削除

Slide 12

Slide 12 text

12 How to proceed • 現状の SwiftUI で実装が困難なものをすり合わせ • TextField 系 • Pull to refresh (iOS 16未満) • スクロールによる追加読み込み(ページング) SwiftUIの拡⼤、Interface Builderの削除

Slide 13

Slide 13 text

13 UI Framework (ViewController) UIKit SwiftUI SwiftUIの拡⼤、Interface Builderの削除

Slide 14

Slide 14 text

14 SwiftUI SwiftUIの拡⼤、Interface Builderの削除

Slide 15

Slide 15 text

15 UIKit TextField × Pull to refresh × ページング × SwiftUIの拡⼤、Interface Builderの削除

Slide 16

Slide 16 text

16 The number of Interface Builder files 0 40 80 120 160 2021年8⽉ 2022年8⽉ 2023年8⽉ storyboard xib • LaunchScreen • 廃⽌予定の ViewController SwiftUIの拡⼤、Interface Builderの削除

Slide 17

Slide 17 text

17 Problems 🤔 • 仕様の把握漏れによるバグがテスト中に発覚 • Interface Builder 上の設定を忘れがち • 実装途中に SwiftUI で実装不可能と判明 • 代替のコンポーネントで実装 • 実装前に実装可能か調査が必要 SwiftUIの拡⼤、Interface Builderの削除

Slide 18

Slide 18 text

18 Problems 🤔 • 親の View (UIKit) のコードが複雑になる • UIHostingController の view を UIView として扱うとシンプルに • サイズ可変な View コンポーネントのレイアウト崩れ • 画⾯全体を SwiftUI に書き換えてしまった⽅が楽 SwiftUIの拡⼤、Interface Builderの削除

Slide 19

Slide 19 text

19 マルチモジュールアーキテクチャへの移⾏

Slide 20

Slide 20 text

20 Purpose 🖊 • 責務の分離 • ローカルのテストの⾼速化 マルチモジュールアーキテクチャへの移⾏

Slide 21

Slide 21 text

21 AS-IS マルチモジュールアーキテクチャへの移⾏

Slide 22

Slide 22 text

22 Multi-Module Ph1 マルチモジュールアーキテクチャへの移⾏

Slide 23

Slide 23 text

23 Multi-Module Ph2 マルチモジュールアーキテクチャへの移⾏

Slide 24

Slide 24 text

24 Multi-Module Ph3 マルチモジュールアーキテクチャへの移⾏

Slide 25

Slide 25 text

25 Multi-Module Ph4, Ph5 Ph4 Ph5 マルチモジュールアーキテクチャへの移⾏

Slide 26

Slide 26 text

26 Migration Policy 🧭 • ⼀気に理想の形へ進めない • 前のフェーズが完了していなくても次のフェーズに進む • 現在 Ph3 の状態だが、 前段階の移⾏作業も同時並⾏で⾏なってい る マルチモジュールアーキテクチャへの移⾏

Slide 27

Slide 27 text

27 Good 👍 • 責務を分離できた • 移⾏時に Unit Test の実装漏れに気づけた • テストカバレッジ向上 💪 • モジュールごとに Unit Test を実⾏できる • ローカルでのUnit Testが⾼速化 マルチモジュールアーキテクチャへの移⾏

Slide 28

Slide 28 text

28 Problems 🤔 • CIのビルド時間が増加 • M1マシンで許容範囲に • 同時の移⾏作業で project.pbxproj がコンフリクト • モジュール追加時に必要な設定を忘れがち • 移⾏時のみの悩みになるはず マルチモジュールアーキテクチャへの移⾏

Slide 29

Slide 29 text

29 Gitブランチ戦略と リリースプロセスの⾃動化

Slide 30

Slide 30 text

30 Previous Gitブランチ戦略とリリースプロセスの⾃動化

Slide 31

Slide 31 text

31 Previous • develop ブランチで開発・QA • リリース直前に master へマージ • リリースは master からアーカイブ Gitブランチ戦略とリリースプロセスの⾃動化

Slide 32

Slide 32 text

32 Previous Gitブランチ戦略とリリースプロセスの⾃動化

Slide 33

Slide 33 text

33 NEW Gitブランチ戦略とリリースプロセスの⾃動化

Slide 34

Slide 34 text

34 NEW • develop ブランチを廃⽌ • QA開始時に release ブランチを作成 • リリースは tag からアーカイブ Gitブランチ戦略とリリースプロセスの⾃動化

Slide 35

Slide 35 text

35 NEW Gitブランチ戦略とリリースプロセスの⾃動化

Slide 36

Slide 36 text

36 Problems 🤔 • Pull Request の⼀覧が取得できず • バージョンに含まれる差分 ≠ master / release ブランチ間の差分 • リリース作業にも変更が必要 • できるだけアクション数を減らしたい Gitブランチ戦略とリリースプロセスの⾃動化

Slide 37

Slide 37 text

37 リリースプロセスの⾃動化 (Bitrise) 1. tag を⽣成 2. アプリのアーカイブ 3. AppStore へアップロード 4. GitHub のリリースページ作成 Bitrise Gitブランチ戦略とリリースプロセスの⾃動化

Slide 38

Slide 38 text

38 リリースプロセスの⾃動化 (Bitrise) 1. Slack から workflow を実⾏ 2. ⼿動でAppStoreに submit 🚀 Gitブランチ戦略とリリースプロセスの⾃動化

Slide 39

Slide 39 text

39 リリースプロセスの⾃動化 (GitHub Actions) • 差分があれば Pull Request を⾃動⽣成 • PR の description にリストアップ • 最新のタグと⽐較 GitHub Actions Gitブランチ戦略とリリースプロセスの⾃動化

Slide 40

Slide 40 text

40 Gitブランチ戦略とリリースプロセスの⾃動化

Slide 41

Slide 41 text

41 Problems & Next Action 🌟 • Bitrise と GitHub Actions のメンテナーが偏りがち • ハンズオン等で触れる機会を作る

Slide 42

Slide 42 text

42 リリースプロセスにおけるドキュメンテーション

Slide 43

Slide 43 text

43 Problems 🤔 • 仕様の把握漏れでバグ発⽣ • 影響範囲があいまい → QAに時間が掛かる • 不必要な確認作業が増加 • 実装からリリースまでのタイムラグは増加 リリースプロセスにおけるドキュメンテーション

Slide 44

Slide 44 text

44 Problems 🤔 • 修正内容の社内への共有不⾜ • GitHub の Milestone : アプリエンジニア以外不向き • iOS / Android で共通の修正を確認しにくい リリースプロセスにおけるドキュメンテーション

Slide 45

Slide 45 text

45 Document for release details リリースプロセスにおけるドキュメンテーション

Slide 46

Slide 46 text

46 Document for release details • 変更の種別 • 新機能・仕様変更 • 不具合修正 • リファクタリング リリースプロセスにおけるドキュメンテーション

Slide 47

Slide 47 text

47 Document for release details • Pull Request のリンク • QAの要否 • Impact Level • QAのターゲットOS / デバイス リリースプロセスにおけるドキュメンテーション

Slide 48

Slide 48 text

48 Impact Level リリースプロセスにおけるドキュメンテーション

Slide 49

Slide 49 text

49 まとめ

Slide 50

Slide 50 text

50 Summary 1. SwiftUI の拡⼤、Interface Builder の削除 2. マルチモジュールアーキテクチャへの移⾏ 3. Gitブランチ戦略とリリースプロセスの⾃動化 4. リリースプロセスにおけるドキュメンテーション

Slide 51

Slide 51 text

51 円滑かつ安全にやっていきたい 💪

Slide 52

Slide 52 text

Thank you for listening!