Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
「家族アルバム みてね」を支えるビルド環境の改善
Search
hicka04
September 12, 2022
Technology
2
2k
「家族アルバム みてね」を支えるビルド環境の改善
https://fortee.jp/iosdc-japan-2022/proposal/56a5bec9-6dcd-4a8e-9e33-312078af3acd
hicka04
September 12, 2022
Tweet
Share
More Decks by hicka04
See All by hicka04
SwiftUI, Jetpack Composeの導入で変化した「家族アルバム みてね」のアプリ開発体験
hicka04
6
750
UICollectionViewのAPIを活用してシンプルなコードにリファクタリングする
hicka04
1
1.3k
Swift Concurrencyを導入するにあたって決めたこと
hicka04
1
2.5k
業務と両立できる!開発環境の改善!
hicka04
2
2.6k
Other Decks in Technology
See All in Technology
OCI Network Firewall 概要
oracle4engineer
PRO
0
4.1k
Taming you application's environments
salaboy
0
180
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.6k
rootlessコンテナのすゝめ - 研究室サーバーでもできる安全なコンテナ管理
kitsuya0828
3
380
[CV勉強会@関東 ECCV2024 読み会] オンラインマッピング x トラッキング MapTracker: Tracking with Strided Memory Fusion for Consistent Vector HD Mapping (Chen+, ECCV24)
abemii
0
220
スクラム成熟度セルフチェックツールを作って得た学びとその活用法
coincheck_recruit
1
140
なぜ今 AI Agent なのか _近藤憲児
kenjikondobai
4
1.3k
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
470
社内で最大の技術的負債のリファクタリングに取り組んだお話し
kidooonn
1
550
OCI Vault 概要
oracle4engineer
PRO
0
9.7k
隣接領域をBeyondするFinatextのエンジニア組織設計 / beyond-engineering-areas
stajima
1
270
【令和最新版】AWS Direct Connectと愉快なGWたちのおさらい
minorun365
PRO
5
750
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
What's new in Ruby 2.0
geeforr
343
31k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Gamification - CAS2011
davidbonilla
80
5k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Side Projects
sachag
452
42k
BBQ
matthewcrist
85
9.3k
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Transcript
「家族アルバム みてね」を支える ビルド環境の改善 iOSDC Japan 2022 佐藤 光
mixi, Inc. 自己紹介 • 佐藤 光 ( @hicka04 ) •
株式会社ミクシィ みてね事業部 プロダクト開発グループ ◦ 2021/11 中途入社 • 私自身「家族アルバム みてね(以下みてね) 」ユーザー • 好きなもの ◦ ラーメン ◦ ポケモン
mixi, Inc. 家族アルバム みてね • 家族で子供の写真を簡単に共有できるサービス • 「世界中の家族の”こころのインフラ”を作る」 をミッションに掲げ、現在7言語対応 •
利用者数が1,500万人(※) を突破(2022年8月現在) ママやパパの「半数」が使うアプリに ※iOS・Android™ アプリ登録者数、ブラウザ版登録者数の合計
mixi, Inc. アジェンダ • Before: 2021年時点でのみてねiOSのビルド環境 • 改善のフロー • 実施してきた改善
• After: 2022年現在のみてねiOSのビルド環境 • 今後の展望 • まとめ
Before: 2021年時点でのみてねiOSのビルド環境
mixi, Inc. Before: 2021年時点でのみてねiOSのビルド環境 • Xcode 12.0 • iOS 11.0+
• マルチモジュール ◦ Embedded Framework • パッケージマネージャ ◦ CocoaPods, Carthage • Bitrise • MacBook (Intel)
mixi, Inc. 少し脱線: 2021年時点でのみてねiOSの開発環境 • アプリ開発チーム 約10人強 • iOS/Android/Serverのすべてのタスクを実施 ◦
各々の得意分野はありますが、得意分野にとらわれず様々なタスクにチャレンジする環境 ◦ AndroidやServerを得意とするメンバーもiOS開発に携わる
改善のフロー
mixi, Inc. 改善のフロー • 改善したいことリストをスクラムボードで管理 ◦ 各自課題だと思ったことをストーリーとして追加しておく • iOS定例 ◦
iOSを得意としているメンバーが週に1回集まる ◦ 優先順位をつけて、上から順番に実施 • 20%ルール ◦ 各自の時間のうち20%を好きな改善活動に当てることができる ▪ 毎週X曜日、毎日1.5時間など、20%ルールの時間の確保の仕方は人それぞれ ◦ ビルド環境の改善、コードベースの改善、運用フローの改善、など自由に選択
mixi, Inc. 少し脱線: iOS定例 • 定期的に集まって課題を確認し、より良い解決策がないか議論 • 設計やコーディングルールなど、全体に影響する内容について方針を決める ◦ 中長期に渡る大規模な変更時に移行計画を考える
実施してきた改善
mixi, Inc. 実施してきた改善 • Xcode, サポートOS バージョンアップ • Apple Silicon対応
• Swift Package Managerの活用 • ビルド時間の改善 • その他
実施してきた改善 Xcode, サポートOSのバージョンアップ
mixi, Inc. 実施してきた改善 - Xcode, サポートOSのバージョンアップ • iOS 直近3メジャーバージョンをサポートするポリシー ◦
iOS16のリリースに合わせて対応中 • スケジュール ◦ 8-9月: iOS β版で動作確認 ◦ 9月: iOSメジャーアップデート ◦ 10月: 一番古いサポートOSの利用状況の調査 & 報告 ◦ 11月: Xcode, サポートOSのメジャーバージョンアップ • 例外: Xcodeのマイナーバージョンは適宜対応 ◦ Xcode 13.2: Swift Concurrency iOS13以上サポート バックポート
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
実施してきた改善 Apple Silicon対応
mixi, Inc. 実施してきた改善 - Apple Silicon対応 • WWDC2020にて発表 • iOS開発:
シミュレーターのビルドがエラーに ◦ x86_64 → arm64 • 背景 ◦ 今後発売されるMacはApple Siliconの端末が中心になっていくと予想 ◦ Apple Silicon端末の利用によるビルド速度向上に期待 • Rosettaは使わない ◦ 環境構築の手間を減らす ◦ Apple Siliconが持つ本来のパフォーマンスで開発したい
mixi, Inc. 実施してきた改善 - Apple Silicon対応 • やることリスト ◦ ①
Carthageで生成するバイナリ .framework → .xcframework ◦ ② 他社からいただいているバイナリ .framework → .xcframework ◦ ③ ライブラリのアップデート (Apple Siliconに対応したバージョンへ)
mixi, Inc. 実施してきた改善 - Apple Silicon対応 • やることリスト ◦ ①
Carthageで生成するバイナリ .framework → .xcframework ◦ ② 他社からいただいているバイナリ .framework → .xcframework ◦ ③ ライブラリのアップデート (Apple Siliconに対応したバージョンへ) • すぐにすべて対応できなかったため、 iOSシミュレーターのアーキテクチャから arm64 を除外 → Apple Silicon端末でシミュレータービルドができる状態になった ◦ EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
mixi, Inc. 実施してきた改善 - Apple Silicon対応 • やることリスト ◦ ①
Carthageで生成するバイナリ .framework → .xcframework ◦ ② 他社からいただいているバイナリ .framework → .xcframework ◦ ③ ライブラリのアップデート (Apple Siliconに対応したバージョンへ) • すぐにすべて対応できなかったため、 iOSシミュレーターのアーキテクチャから arm64 を除外 → Apple Silicon端末でシミュレータービルドができる状態になった ◦ EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 • Swift Package Managerを使うとビルドエラーになってしまう
mixi, Inc. 実施してきた改善 - Apple Silicon対応 • ① Carthageで生成するバイナリ •
② 他社からいただいているバイナリ • ③ 依存ライブラリのアップデート
mixi, Inc. 実施してきた改善 - Apple Silicon対応 • ① Carthageで生成するバイナリ ◦
バイナリ生成時のコマンド引数に --use-xcframework オプションをつける • ② 他社からいただいているバイナリ • ③ 依存ライブラリのアップデート
mixi, Inc. 実施してきた改善 - Apple Silicon対応 • ① Carthageで生成するバイナリ ◦
バイナリ生成時のコマンド引数に --use-xcframework オプションをつける • ② 他社からいただいているバイナリ ◦ ライブラリ作成元の各社にApple Siliconに対応した .xcframework を作成依頼 → すべて対応いただいた • ③ 依存ライブラリのアップデート
mixi, Inc. 実施してきた改善 - Apple Silicon対応 • ① Carthageで生成するバイナリ ◦
バイナリ生成時のコマンド引数に --use-xcframework オプションをつける • ② 他社からいただいているバイナリ ◦ ライブラリ作成元の各社にApple Siliconに対応した .xcframework を作成依頼 → すべて対応いただいた • ③ 依存ライブラリのアップデート ◦ 中でもRealm v3系 → v10系 への大幅なメジャーバージョンアップが鬼門 ▪ 過去にバージョンアップを試して、クラッシュやフリーズ等の問題が発生していた ▪ 問題を再現させて着実に修正し、無事にアップデートできた
mixi, Inc. 実施してきた改善 - Apple Silicon対応 • iOSシミュレーターのアーキテクチャから arm64 を除外する設定を削除
→ Rosettaを使わずにApple Silicon端末で開発できる環境を実現できた! → Swift Package Managerを使えるようになった!
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メモリ
実施してきた改善 Swift Package Managerの活用
mixi, Inc. 実施してきた改善 - Swift Package Managerの活用 • WWDC2019にて発表 •
Xcode11以降、GUI上からSwift Package Manager (以下SwiftPM) を扱えるようになった • みてねではCocoaPodsとCarthageを中心にライブラリを管理 ◦ CocoaPods: Rubyのセットアップが必要 ◦ Carthage: 過去、Xcodeのアップデートでビルドできない問題が発生 • SwiftPM: 1st Partyのパッケージマネージャ ◦ 特別なセットアップが不要 ◦ Xcodeのアップデートに自動で追従してくれる
mixi, Inc. 実施してきた改善 - Swift Package Managerの活用 • 依存ライブラリの一覧を作成し、それぞれ対応方法を決定 ◦
不要なライブラリは削除 ▪ 現在はAppleが発表したフレームワークやSwiftの言語機能だけで実現できるようになったものなど ◦ 基本的にはSwiftPMに移行 ◦ ライブラリ側がSwiftPMに対応していない場合は、Carthage > CocoaPodsの優先順位 ▪ Carthageによる事前ビルドでビルド時間を短縮
mixi, Inc. 実施してきた改善 - Swift Package Managerの活用 • 依存ライブラリの一覧を作成し、それぞれ対応方法を決定 ◦
不要なライブラリは削除 ▪ 現在はAppleが発表したフレームワークやSwiftの言語機能だけで実現できるようになったものなど ◦ 基本的にはSwiftPMに移行 ◦ ライブラリ側がSwiftPMに対応していない場合は、Carthage > CocoaPodsの優先順位 ▪ Carthageによる事前ビルドでビルド時間を短縮 • 1個の不要ライブラリを削除完了 4個がSwiftPM利用 (14%)
実施してきた改善 ビルド時間の改善
mixi, Inc. 実施してきた改善 - ビルド時間の改善 • マルチモジュール化 • ビルドフェーズの整理
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - マルチモジュール化 • 期待している効果 ◦
変更していないモジュールのビルドをスキップ ◦ 並列ビルドが効きやすくなる • レイヤーごとにモジュール分割 ◦ クリーンアーキテクチャの円の境界 ≒ モジュールの境界 ◦ Embedded Frameworkでモジュールを作成
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - マルチモジュール化 • ビルド時間高速化の恩恵を十分に受けられていない ◦
モジュールをまたいでファイルを変更することが多い (特にUI層とPresentation層) • プロジェクトファイルのコンフリクトが発生しやすい ◦ XcodeGen等のコンフリクトを回避する手段が未導入
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - マルチモジュール化 • ビルド時間高速化の恩恵を十分に受けられていない ◦
モジュールをまたいでファイルを変更することが多い (特にUI層とPresentation層) → レイヤー × Feature のモジュール分割 • プロジェクトファイルのコンフリクトが発生しやすい ◦ XcodeGen等のコンフリクトを回避する手段が未導入
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - マルチモジュール化 • ビルド時間高速化の恩恵を十分に受けられていない ◦
モジュールをまたいでファイルを変更することが多い (特にUI層とPresentation層) → レイヤー × Feature のモジュール分割 • プロジェクトファイルのコンフリクトが発生しやすい ◦ XcodeGen等のコンフリクトを回避する手段が未導入 → SwiftPMのローカルパッケージに変更 参考: iOSDC2021「Swift Package中心のプロジェクト構成とその実践」 https://fortee.jp/iosdc-japan-2021/proposal/1338c9cc-363a-44a6-bbac-452b67b472fb
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - マルチモジュール化 • SwiftPM ローカルパッケージ
◦ Framework → Package • UI + Presentation = Feature 機能ごとにターゲットが分かれる • 移行計画 ◦ 依存関係の末端から切り出し
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - マルチモジュール化 • SwiftPM ローカルパッケージ
◦ Framework → Package • UI + Presentation = Feature 機能ごとにターゲットが分かれる • 移行計画 ◦ 依存関係の末端から切り出し • 現在移行中 ◦ ビルド速度が改善しているかは いずれどこかで共有したい
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理 • コードの自動生成系 ◦
SwiftGen (Image, Color, L10n) ◦ Sourcery (Mock, Stub, DI) • Lint, Format系 ◦ SwiftLint ◦ SwiftFormat
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理 • コードの自動生成系 ◦
SwiftGen (Image, Color, L10n) ◦ Sourcery (Mock, Stub, DI) → 開発時に自動生成されたコードを即時利用してコーディングしたい • Lint, Format系 ◦ SwiftLint ◦ SwiftFormat
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理 • コードの自動生成系 ◦
SwiftGen (Image, Color, L10n) ◦ Sourcery (Mock, Stub, DI) → 開発時に自動生成されたコードを即時利用してコーディングしたい • Lint, Format系 ◦ SwiftLint ◦ SwiftFormat → ビルドのたびに毎回実行するほど即効性が求められていない
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理 • SwiftLint ◦
CIで実行され、PR上で警告を確認できる → ビルドフェーズから削除: 約3.0s • SwiftFormat ◦ 実行時エラーを生み出すような危険な変更が行われない → ビルドフェーズから削除: 約2.4s ◦ Dailyでmainブランチに対してフォーマットを実行しPRを作る ※計測条件 • MacBook Air (M1, 2020) • 差分ビルド3回実行時の平均値
mixi, Inc. 実施してきた改善 - ビルド時間の改善 - ビルドフェーズの整理 • SwiftLint ◦
CIで実行され、PR上で警告を確認できる → ビルドフェーズから削除: 約3.0s • SwiftFormat ◦ 実行時エラーを生み出すような危険な変更が行われない → ビルドフェーズから削除: 約2.4s ◦ Dailyでmainブランチに対してフォーマットを実行しPRを作る • 差分ビルド約12.4sの改善 (約1.8倍高速化) ◦ SwiftFormatによる余分なファイル差分が生まれなくなり、 無駄に実行されていたビルドステップ減少 ※計測条件 • MacBook Air (M1, 2020) • 差分ビルド3回実行時の平均値
実施してきた改善 その他
mixi, Inc. 実施してきた改善 - その他 • QA用ビルド作成の簡略化 ◦ 各作業ブランチでQAを実施 ▪
ブランチ名をコピペしてビルド作成するのが地味に面倒 ◦ → PRに QA ラベルを付けておくと、最新コミットでQA用ビルド作成 ▪ ラベルの判別(GitHub Actions) → ビルド作成(Bitrise)
mixi, Inc. 実施してきた改善 - その他 • QA用ビルド作成の簡略化 ◦ 各作業ブランチでQAを実施 ▪
ブランチ名をコピペしてビルド作成するのが地味に面倒 ◦ → PRに QA ラベルを付けておくと、最新コミットでQA用ビルド作成 ▪ ラベルの判別(GitHub Actions) → ビルド作成(Bitrise) • Bitriseのワークフローの整理 ◦ 使われていないまま放置されていたワークフロー削除 ◦ ワークフローの共通化 ▪ Clone, CachePull, Bootstrap, CachePush, …etc ◦ Clone時のdepthを1に ▪ 4min → 2min
After: 2022年現在のみてねiOSのビルド環境
mixi, Inc. After: 2022年現在のみてねiOSのビルド環境 ※絶賛移行中 • Xcode 13.4.1 • iOS
13.0+ • マルチモジュール ◦ SwiftPM ローカルパッケージ ※ • パッケージマネージャ ◦ SwiftPM, CocoaPods, Carthage • Bitrise, GitHub Actions • MacBook (Apple Silicon, Intel)
今後の展望
mixi, Inc. 今後の展望 • 定期的なXcodeのバージョンアップ • サポートOSのバージョンアップ ◦ 新しいAPIの導入 •
SwiftPMへの移行 • マルチモジュール化の推進 • コードベースの改善 ◦ Swift Concurrencyへの移行 ◦ デザインシステム推進
まとめ
mixi, Inc. まとめ • iOSのビルド環境を取り巻く変化は激しい ◦ XcodeやSwift Package Managerのアップデート ◦
新しいMacの登場 ◦ …etc • 現状のプロジェクトが抱える課題の解決手段が増えるのはいいこと • 追従していくためには、日々の改善が重要 ◦ 課題を管理して着実に改善を進めていく
最後に
mixi, Inc. アプリエンジニアを積極採用してます! • 発表内容に興味を持ってくださった方 • ユーザーがたくさんいるサービスに携わりたい方 • iOS /
Android / Server など さまざまな技術分野にチャレンジしたい方 • 育児関連のサービスに携わりたい方 • …etc https://team.mitene.us/jobs
mixi, Inc.