はじめに
N予備校 iOS アプリ 開発チームです。
数ヶ月前までの教育iOSアプリでは、パッケージマネージャに CocoaPods(Ruby製) を使用していました。
環境構築の手間や Apple 標準ではないという点で、Apple 標準のパッケージマネージャである SwiftPM 移行に向けてこつこつと準備をしてきました。
macOS や CocoaPods・Bitrise が関係する問題がきっかけで、2023年2月に急遽 CocoaPods から SwiftPM に移行せざるを得ない状況になりました。
開発チームでどのように調査・検証・移行を実施したのかを紹介します。
SwiftPM 移行の準備
2021/12 〜 2023/02 (平和)
CocoaPods から SwiftPM への完全移行がスムーズにいくよう、以下のような取り組みをしてきました。
- 少しずつ不要なライブラリを取り除く
- 継続的なライブラリのアップデート
- 各ライブラリの SwiftPM 対応状況一覧を作成
途中の期間 2022/09 〜 2023/02 では、Xcode 13.4 → Xcode 14.2 への移行作業に取り組みました。
他の案件の合間に、様々な課題を少しずつ潰していきました。
2023/02 中旬 〜 2023/03 上旬 (問題発生と対応)
Bitrise も Xcode 14.2 に移行しました。
その直後から、高確率(90%くらい)でビルドエラーが発生するようになってしまいました。😣
Bitirse では、Xcode 14.2 は macOS Ventura でしか提供されていないので、
Xcode 14.1 & macOS Monterey で試してみました。
すると・・・ビルドエラーにならず安定稼働してくれました!
この時点で初めて、Xcode 14.2 & macOS Ventura に何か問題がありそうということが発覚しました。
ここから、発覚した問題の解決に向けて動いていくことになりました。
一体どんな問題が起きていたのか?
No | 日付 | 概要 | 説明 |
---|---|---|---|
1 | 2023/02/06 (月) | XcodeGen 実行時にクラッシュ | Ruby製OSSライブラリ Ethon でクラッシュしていた |
2 | 2023/02/07 (火) | Ethon はどこで使われている? | CocoaPods > CocoaPods-Core > Typhoeus > Ethon |
3 | 2023/02/07 (火) | クラッシュ情報収集 | 各ライブラリの GitHub Issue や PR を見たが、特に話題なし |
4 | 2023/02/07 (火) | CocoaPods アップデート | rbenv exec bundle update cocoapods を実行。すでに最新版だった。Ethon が 0.15.0 から 0.16.0 に更新された (淡い期待) |
5 | 2023/02/07 (火) | 再現確認 | だめだった😢 |
6 | 2023/02/07 (火) | Ruby アップデート | Bitrise で用意されている 3.0.3 から 3.1.3 にアップデート (淡い期待) |
7 | 2023/02/08 (水) | 再現確認 | だめだった😢 |
8 | 2023/02/10 (金) | Bitrise Xcode & OS 変更 | Xcode 14.1.x & macOS Monterey (淡い期待) ⚠ 大きな問題については後述 |
9 | 2023/02/10 (金) | 再現確認 | 成功!何回実行してもクラッシュしない!🎉 |
調査結果の詳細
XcodeGen 実行時にクラッシュ
表1 No.1 記載の Ethon
がクラッシュした際のログは以下の通りです。
$mint run xcodegen ⚙️ Generating plists... ⚙️ Generating project... ⚙️ Writing project... Created project at /Users/vagrant/git/App.xcodeproj Analyzing dependencies /Users/vagrant/git/vendor/bundle/ruby/3.0.0/gems/ethon-0.15.0/lib/ethon/multi/operations.rb:212: [BUG] Segmentation fault at 0xffffffffffffff8c ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-darwin22]
Bitrise でのビルド完了後、素早く SSH でログインし、
何度も手動で上記コマンドの実行を繰り返すことで、「クラッシュしたりしなかったり」が再現できました。
Bitrise Xcode & OS 変更
表1 No.8 記載の通り、試しに Xcode バージョンと macOS バージョンを下げてみました。
ですが、Xcode 14.2 移行作業を細く長く進めてきて、作業は一通り完了している状況です。
今更 Xcode 13.4 には戻したくない!なんとか解決させたい!という気持ちがあったので色々対策を考えていました。
そんな中、特に頭を抱えた問題は以下の2点です。
- Ventura と Ethon の問題がいつ解決するのか分からない
- 待ってられない
- Bitrise で Monterey が提供されるのは 2023/03/13 まで(2/10 時点であと20営業日) ❗️❗️❗️
- 対策せず放置してしまうと、再び CI が不安定になってしまう
このタイミングで一気に SwiftPM 移行をやると決断し行動を開始しました。
SwiftPM 完全移行に向けて
N予備校iOSアプリでは XcodeGen を採用しています。
XcodeGen は SwiftPM 対応しているので、CocoaPods で導入しているライブラリを全て SwiftPM に切り替えました。
対応の流れは以下の通りです。
No | 日付 | 概要 | 説明 |
---|---|---|---|
1 | 2023/02/16 (木) | SwiftPM 移行計画 | 開始: 今から、締切: 2023/03/13 (月) |
2 | 2023/02/21 (火) | 依存ライブラリの SwiftPM 移行 | ビルドは通らなくてもOK。移行できるものはしてしまう。 |
3 | 2023/02/21 (火) | CocoaPods ライブラリ削除 | Podfile からライブラリの参照を全て削除。スクリプトが残っているだけの状態。 |
4 | 2023/02/22 (水) | 内製ライブラリの SwiftPM 対応 | 計5つのリポジトリで対応 |
5 | 2023/02/23 (木) | Podfile 内のスクリプトを削除 | XcodeGen を使い、シェルスクリプトを Build Phases に書き込む |
6 | 2023/02/23 (木) | CocoaPods 削除 | ついにここまで来た! |
7 | 2023/02/24 (金) | ライブラリのアップデート | 特定ライブラリのバージョンが少し古く、Package.swift 先頭行の swift-tools-version が無い状態だった |
8 | 2023/02/24 (金) | 200件近くのコンパイルエラーをひたすら修正 | CocoaPods を削除したことで、明示的に import UIKit や import Foundation 等を書いていないファイルでコンパイルエラーになった。依存関係が明確になるので、明示的に import UIKit を書く方針に変更できて良かった。 |
9 | 2023/02/27 (月) | ビルド確認 | Debug・Release OK。アプリ動作もOK。ようやくここまで来た! |
10 | 2023/03/01 (水) | アプリクラッシュ修正 | アプリ側から、ライブラリ側で持っているリソースにアクセスできなかった |
11 | 2023/03/06 (月) | Bitrise Default Stack 変更 | ついに Xcode 14.2 & Ventura で安定稼働!🎉 3/13 に間に合った😂 |
アプリクラッシュ
表2 No.10 のクラッシュの原因は、内製ライブラリで以下の実装が漏れていたことでした。
#if SWIFT_PACKAGE var bundle = Bundle.module #else ... #endif
おわりに
今回の取り組みのおかげで、以下のものが実現できました。
- 念願の SwiftPM 完全移行
- 今後ライブラリ選定する際、「SwiftPMしか対応していない」ライブラリも検討できるようになった
- 記事執筆時点(2023/05) では Xcode 14.3 移行完了
- ユーザーが触れている最新OSバージョンでの開発・デバッグができる状況になった
最新 macOS & 最新 Xcode で安定した開発環境が実現できて良かったです。
(非常にエキサイティングな取り組みではありましたが、やはり平和に計画的に取り組んでいきたいですね。)
We are hiring!
株式会社ドワンゴの教育事業では、一緒に未来の当たり前の教育をつくるメンバーを募集しています。 カジュアル面談も行っています。 お気軽にご連絡ください!
開発チームの取り組み、教育事業の今後については、他の記事や採用資料をご覧ください。