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

「家族アルバム みてね」を支えるビルド環境の改善

hicka04
September 12, 2022

「家族アルバム みてね」を支えるビルド環境の改善

hicka04

September 12, 2022
Tweet

More Decks by hicka04

Other Decks in Technology

Transcript

  1. 「家族アルバム みてね」を支える
    ビルド環境の改善
    iOSDC Japan 2022
    佐藤 光

    View Slide

  2. mixi, Inc.
    自己紹介
    ● 佐藤 光 ( @hicka04 )
    ● 株式会社ミクシィ みてね事業部 プロダクト開発グループ
    ○ 2021/11 中途入社
    ● 私自身「家族アルバム みてね(以下みてね)
    」ユーザー
    ● 好きなもの
    ○ ラーメン
    ○ ポケモン

    View Slide

  3. mixi, Inc.
    家族アルバム みてね
    ● 家族で子供の写真を簡単に共有できるサービス
    ● 「世界中の家族の”こころのインフラ”を作る」
    をミッションに掲げ、現在7言語対応
    ● 利用者数が1,500万人(※)
    を突破(2022年8月現在)
    ママやパパの「半数」が使うアプリに
    ※iOS・Android™ アプリ登録者数、ブラウザ版登録者数の合計

    View Slide

  4. mixi, Inc.
    アジェンダ
    ● Before: 2021年時点でのみてねiOSのビルド環境
    ● 改善のフロー
    ● 実施してきた改善
    ● After: 2022年現在のみてねiOSのビルド環境
    ● 今後の展望
    ● まとめ

    View Slide

  5. Before: 2021年時点でのみてねiOSのビルド環境

    View Slide

  6. mixi, Inc.
    Before: 2021年時点でのみてねiOSのビルド環境
    ● Xcode 12.0
    ● iOS 11.0+
    ● マルチモジュール
    ○ Embedded Framework
    ● パッケージマネージャ
    ○ CocoaPods, Carthage
    ● Bitrise
    ● MacBook (Intel)

    View Slide

  7. mixi, Inc.
    少し脱線: 2021年時点でのみてねiOSの開発環境
    ● アプリ開発チーム 約10人強
    ● iOS/Android/Serverのすべてのタスクを実施
    ○ 各々の得意分野はありますが、得意分野にとらわれず様々なタスクにチャレンジする環境
    ○ AndroidやServerを得意とするメンバーもiOS開発に携わる

    View Slide

  8. 改善のフロー

    View Slide

  9. mixi, Inc.
    改善のフロー
    ● 改善したいことリストをスクラムボードで管理
    ○ 各自課題だと思ったことをストーリーとして追加しておく
    ● iOS定例
    ○ iOSを得意としているメンバーが週に1回集まる
    ○ 優先順位をつけて、上から順番に実施
    ● 20%ルール
    ○ 各自の時間のうち20%を好きな改善活動に当てることができる
    ■ 毎週X曜日、毎日1.5時間など、20%ルールの時間の確保の仕方は人それぞれ
    ○ ビルド環境の改善、コードベースの改善、運用フローの改善、など自由に選択

    View Slide

  10. mixi, Inc.
    少し脱線: iOS定例
    ● 定期的に集まって課題を確認し、より良い解決策がないか議論
    ● 設計やコーディングルールなど、全体に影響する内容について方針を決める
    ○ 中長期に渡る大規模な変更時に移行計画を考える

    View Slide

  11. 実施してきた改善

    View Slide

  12. mixi, Inc.
    実施してきた改善
    ● Xcode, サポートOS バージョンアップ
    ● Apple Silicon対応
    ● Swift Package Managerの活用
    ● ビルド時間の改善
    ● その他

    View Slide

  13. 実施してきた改善
    Xcode, サポートOSのバージョンアップ

    View Slide

  14. mixi, Inc.
    実施してきた改善 - Xcode, サポートOSのバージョンアップ
    ● iOS 直近3メジャーバージョンをサポートするポリシー
    ○ iOS16のリリースに合わせて対応中
    ● スケジュール
    ○ 8-9月: iOS β版で動作確認
    ○ 9月: iOSメジャーアップデート
    ○ 10月: 一番古いサポートOSの利用状況の調査 & 報告
    ○ 11月: Xcode, サポートOSのメジャーバージョンアップ
    ● 例外: Xcodeのマイナーバージョンは適宜対応
    ○ Xcode 13.2: Swift Concurrency iOS13以上サポート バックポート

    View Slide

  15. mixi, Inc.
    実施してきた改善 - Xcode, サポートOSのバージョンアップ
    ● Xcode 13.4.1
    ● iOS 13.0+
    ● 直近の導入実績
    ○ Diffable Data Source
    ○ Swift Concurrency →
    https://speakerdeck.com/hicka04/swift-concurrencywodao-ru-suruniatatutejue-metakoto

    View Slide

  16. 実施してきた改善
    Apple Silicon対応

    View Slide

  17. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● WWDC2020にて発表
    ● iOS開発: シミュレーターのビルドがエラーに
    ○ x86_64 → arm64
    ● 背景
    ○ 今後発売されるMacはApple Siliconの端末が中心になっていくと予想
    ○ Apple Silicon端末の利用によるビルド速度向上に期待
    ● Rosettaは使わない
    ○ 環境構築の手間を減らす
    ○ Apple Siliconが持つ本来のパフォーマンスで開発したい

    View Slide

  18. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● やることリスト
    ○ ① Carthageで生成するバイナリ .framework → .xcframework
    ○ ② 他社からいただいているバイナリ .framework → .xcframework
    ○ ③ ライブラリのアップデート (Apple Siliconに対応したバージョンへ)

    View Slide

  19. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● やることリスト
    ○ ① Carthageで生成するバイナリ .framework → .xcframework
    ○ ② 他社からいただいているバイナリ .framework → .xcframework
    ○ ③ ライブラリのアップデート (Apple Siliconに対応したバージョンへ)
    ● すぐにすべて対応できなかったため、
    iOSシミュレーターのアーキテクチャから arm64 を除外
    → Apple Silicon端末でシミュレータービルドができる状態になった
    ○ EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

    View Slide

  20. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● やることリスト
    ○ ① Carthageで生成するバイナリ .framework → .xcframework
    ○ ② 他社からいただいているバイナリ .framework → .xcframework
    ○ ③ ライブラリのアップデート (Apple Siliconに対応したバージョンへ)
    ● すぐにすべて対応できなかったため、
    iOSシミュレーターのアーキテクチャから arm64 を除外
    → Apple Silicon端末でシミュレータービルドができる状態になった
    ○ EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
    ● Swift Package Managerを使うとビルドエラーになってしまう

    View Slide

  21. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● ① Carthageで生成するバイナリ
    ● ② 他社からいただいているバイナリ
    ● ③ 依存ライブラリのアップデート

    View Slide

  22. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● ① Carthageで生成するバイナリ
    ○ バイナリ生成時のコマンド引数に --use-xcframework オプションをつける
    ● ② 他社からいただいているバイナリ
    ● ③ 依存ライブラリのアップデート

    View Slide

  23. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● ① Carthageで生成するバイナリ
    ○ バイナリ生成時のコマンド引数に --use-xcframework オプションをつける
    ● ② 他社からいただいているバイナリ
    ○ ライブラリ作成元の各社にApple Siliconに対応した .xcframework を作成依頼
    → すべて対応いただいた
    ● ③ 依存ライブラリのアップデート

    View Slide

  24. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● ① Carthageで生成するバイナリ
    ○ バイナリ生成時のコマンド引数に --use-xcframework オプションをつける
    ● ② 他社からいただいているバイナリ
    ○ ライブラリ作成元の各社にApple Siliconに対応した .xcframework を作成依頼
    → すべて対応いただいた
    ● ③ 依存ライブラリのアップデート
    ○ 中でもRealm v3系 → v10系 への大幅なメジャーバージョンアップが鬼門
    ■ 過去にバージョンアップを試して、クラッシュやフリーズ等の問題が発生していた
    ■ 問題を再現させて着実に修正し、無事にアップデートできた

    View Slide

  25. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● iOSシミュレーターのアーキテクチャから arm64 を除外する設定を削除
    → Rosettaを使わずにApple Silicon端末で開発できる環境を実現できた!
    → Swift Package Managerを使えるようになった!

    View Slide

  26. mixi, Inc.
    実施してきた改善 - Apple Silicon対応
    ● iOSシミュレーターのアーキテクチャから arm64 を除外する設定を削除
    → Rosettaを使わずにApple Silicon端末で開発できる環境を実現できた!
    → Swift Package Managerを使えるようになった!
    ● ビルド時間はIntelと比較して約1.5倍以上高速 ※1
    ○ 適宜Apple Silicon端末へのリプレイスを行って生産性向上
    チップ フルビルド 差分ビルド
    Intel ※2 300s 33.8s
    Apple Silicon ※3 200s 19.3s
    ※1 ビルド3回実行時の平均値で比較
    ※2 MacBook Pro (16-inch, 2019) 32GBメモリ
    ※3 MacBook Air (M1, 2020) 16GBメモリ

    View Slide

  27. 実施してきた改善
    Swift Package Managerの活用

    View Slide

  28. mixi, Inc.
    実施してきた改善 - Swift Package Managerの活用
    ● WWDC2019にて発表
    ● Xcode11以降、GUI上からSwift Package Manager (以下SwiftPM)
    を扱えるようになった
    ● みてねではCocoaPodsとCarthageを中心にライブラリを管理
    ○ CocoaPods: Rubyのセットアップが必要
    ○ Carthage: 過去、Xcodeのアップデートでビルドできない問題が発生
    ● SwiftPM: 1st Partyのパッケージマネージャ
    ○ 特別なセットアップが不要
    ○ Xcodeのアップデートに自動で追従してくれる

    View Slide

  29. mixi, Inc.
    実施してきた改善 - Swift Package Managerの活用
    ● 依存ライブラリの一覧を作成し、それぞれ対応方法を決定
    ○ 不要なライブラリは削除
    ■ 現在はAppleが発表したフレームワークやSwiftの言語機能だけで実現できるようになったものなど
    ○ 基本的にはSwiftPMに移行
    ○ ライブラリ側がSwiftPMに対応していない場合は、Carthage > CocoaPodsの優先順位
    ■ Carthageによる事前ビルドでビルド時間を短縮

    View Slide

  30. mixi, Inc.
    実施してきた改善 - Swift Package Managerの活用
    ● 依存ライブラリの一覧を作成し、それぞれ対応方法を決定
    ○ 不要なライブラリは削除
    ■ 現在はAppleが発表したフレームワークやSwiftの言語機能だけで実現できるようになったものなど
    ○ 基本的にはSwiftPMに移行
    ○ ライブラリ側がSwiftPMに対応していない場合は、Carthage > CocoaPodsの優先順位
    ■ Carthageによる事前ビルドでビルド時間を短縮
    ● 1個の不要ライブラリを削除完了
    4個がSwiftPM利用 (14%)

    View Slide

  31. 実施してきた改善
    ビルド時間の改善

    View Slide

  32. mixi, Inc.
    実施してきた改善 - ビルド時間の改善
    ● マルチモジュール化
    ● ビルドフェーズの整理

    View Slide

  33. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - マルチモジュール化
    ● 期待している効果
    ○ 変更していないモジュールのビルドをスキップ
    ○ 並列ビルドが効きやすくなる
    ● レイヤーごとにモジュール分割
    ○ クリーンアーキテクチャの円の境界
    ≒ モジュールの境界
    ○ Embedded Frameworkでモジュールを作成

    View Slide

  34. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - マルチモジュール化
    ● ビルド時間高速化の恩恵を十分に受けられていない
    ○ モジュールをまたいでファイルを変更することが多い
    (特にUI層とPresentation層)
    ● プロジェクトファイルのコンフリクトが発生しやすい
    ○ XcodeGen等のコンフリクトを回避する手段が未導入

    View Slide

  35. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - マルチモジュール化
    ● ビルド時間高速化の恩恵を十分に受けられていない
    ○ モジュールをまたいでファイルを変更することが多い
    (特にUI層とPresentation層)
    → レイヤー × Feature のモジュール分割
    ● プロジェクトファイルのコンフリクトが発生しやすい
    ○ XcodeGen等のコンフリクトを回避する手段が未導入

    View Slide

  36. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - マルチモジュール化
    ● ビルド時間高速化の恩恵を十分に受けられていない
    ○ モジュールをまたいでファイルを変更することが多い
    (特にUI層とPresentation層)
    → レイヤー × Feature のモジュール分割
    ● プロジェクトファイルのコンフリクトが発生しやすい
    ○ XcodeGen等のコンフリクトを回避する手段が未導入
    → SwiftPMのローカルパッケージに変更
    参考: iOSDC2021「Swift Package中心のプロジェクト構成とその実践」
    https://fortee.jp/iosdc-japan-2021/proposal/1338c9cc-363a-44a6-bbac-452b67b472fb

    View Slide

  37. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - マルチモジュール化
    ● SwiftPM ローカルパッケージ
    ○ Framework → Package
    ● UI + Presentation = Feature
    機能ごとにターゲットが分かれる
    ● 移行計画
    ○ 依存関係の末端から切り出し

    View Slide

  38. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - マルチモジュール化
    ● SwiftPM ローカルパッケージ
    ○ Framework → Package
    ● UI + Presentation = Feature
    機能ごとにターゲットが分かれる
    ● 移行計画
    ○ 依存関係の末端から切り出し
    ● 現在移行中
    ○ ビルド速度が改善しているかは
    いずれどこかで共有したい

    View Slide

  39. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理
    ● コードの自動生成系
    ○ SwiftGen (Image, Color, L10n)
    ○ Sourcery (Mock, Stub, DI)
    ● Lint, Format系
    ○ SwiftLint
    ○ SwiftFormat

    View Slide

  40. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理
    ● コードの自動生成系
    ○ SwiftGen (Image, Color, L10n)
    ○ Sourcery (Mock, Stub, DI)
    → 開発時に自動生成されたコードを即時利用してコーディングしたい
    ● Lint, Format系
    ○ SwiftLint
    ○ SwiftFormat

    View Slide

  41. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理
    ● コードの自動生成系
    ○ SwiftGen (Image, Color, L10n)
    ○ Sourcery (Mock, Stub, DI)
    → 開発時に自動生成されたコードを即時利用してコーディングしたい
    ● Lint, Format系
    ○ SwiftLint
    ○ SwiftFormat
    → ビルドのたびに毎回実行するほど即効性が求められていない

    View Slide

  42. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理
    ● SwiftLint
    ○ CIで実行され、PR上で警告を確認できる
    → ビルドフェーズから削除: 約3.0s
    ● SwiftFormat
    ○ 実行時エラーを生み出すような危険な変更が行われない
    → ビルドフェーズから削除: 約2.4s
    ○ Dailyでmainブランチに対してフォーマットを実行しPRを作る
    ※計測条件
    ● MacBook Air (M1, 2020)
    ● 差分ビルド3回実行時の平均値

    View Slide

  43. mixi, Inc.
    実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理
    ● SwiftLint
    ○ CIで実行され、PR上で警告を確認できる
    → ビルドフェーズから削除: 約3.0s
    ● SwiftFormat
    ○ 実行時エラーを生み出すような危険な変更が行われない
    → ビルドフェーズから削除: 約2.4s
    ○ Dailyでmainブランチに対してフォーマットを実行しPRを作る
    ● 差分ビルド約12.4sの改善 (約1.8倍高速化)
    ○ SwiftFormatによる余分なファイル差分が生まれなくなり、
    無駄に実行されていたビルドステップ減少
    ※計測条件
    ● MacBook Air (M1, 2020)
    ● 差分ビルド3回実行時の平均値

    View Slide

  44. 実施してきた改善
    その他

    View Slide

  45. mixi, Inc.
    実施してきた改善 - その他
    ● QA用ビルド作成の簡略化
    ○ 各作業ブランチでQAを実施
    ■ ブランチ名をコピペしてビルド作成するのが地味に面倒
    ○ → PRに QA ラベルを付けておくと、最新コミットでQA用ビルド作成
    ■ ラベルの判別(GitHub Actions) → ビルド作成(Bitrise)

    View Slide

  46. mixi, Inc.
    実施してきた改善 - その他
    ● QA用ビルド作成の簡略化
    ○ 各作業ブランチでQAを実施
    ■ ブランチ名をコピペしてビルド作成するのが地味に面倒
    ○ → PRに QA ラベルを付けておくと、最新コミットでQA用ビルド作成
    ■ ラベルの判別(GitHub Actions) → ビルド作成(Bitrise)
    ● Bitriseのワークフローの整理
    ○ 使われていないまま放置されていたワークフロー削除
    ○ ワークフローの共通化
    ■ Clone, CachePull, Bootstrap, CachePush, …etc
    ○ Clone時のdepthを1に
    ■ 4min → 2min

    View Slide

  47. After: 2022年現在のみてねiOSのビルド環境

    View Slide

  48. mixi, Inc.
    After: 2022年現在のみてねiOSのビルド環境
    ※絶賛移行中
    ● Xcode 13.4.1
    ● iOS 13.0+
    ● マルチモジュール
    ○ SwiftPM ローカルパッケージ ※
    ● パッケージマネージャ
    ○ SwiftPM, CocoaPods, Carthage
    ● Bitrise, GitHub Actions
    ● MacBook (Apple Silicon, Intel)

    View Slide

  49. 今後の展望

    View Slide

  50. mixi, Inc.
    今後の展望
    ● 定期的なXcodeのバージョンアップ
    ● サポートOSのバージョンアップ
    ○ 新しいAPIの導入
    ● SwiftPMへの移行
    ● マルチモジュール化の推進
    ● コードベースの改善
    ○ Swift Concurrencyへの移行
    ○ デザインシステム推進

    View Slide

  51. まとめ

    View Slide

  52. mixi, Inc.
    まとめ
    ● iOSのビルド環境を取り巻く変化は激しい
    ○ XcodeやSwift Package Managerのアップデート
    ○ 新しいMacの登場
    ○ …etc
    ● 現状のプロジェクトが抱える課題の解決手段が増えるのはいいこと
    ● 追従していくためには、日々の改善が重要
    ○ 課題を管理して着実に改善を進めていく

    View Slide

  53. 最後に

    View Slide

  54. mixi, Inc.
    アプリエンジニアを積極採用してます!
    ● 発表内容に興味を持ってくださった方
    ● ユーザーがたくさんいるサービスに携わりたい方
    ● iOS / Android / Server など
    さまざまな技術分野にチャレンジしたい方
    ● 育児関連のサービスに携わりたい方
    ● …etc
    https://team.mitene.us/jobs

    View Slide

  55. mixi, Inc.

    View Slide