N予備校iOSアプリ SwiftPM 移行

はじめに

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 に何か問題がありそうということが発覚しました。
ここから、発覚した問題の解決に向けて動いていくことになりました。

一体どんな問題が起きていたのか?

表1 調査ログ

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点です。

  1. Ventura と Ethon の問題がいつ解決するのか分からない
    • 待ってられない
  2. Bitrise で Monterey が提供されるのは 2023/03/13 まで(2/10 時点であと20営業日) ❗️❗️❗️
    • 対策せず放置してしまうと、再び CI が不安定になってしまう

このタイミングで一気に SwiftPM 移行をやると決断し行動を開始しました。

SwiftPM 完全移行に向けて

N予備校iOSアプリでは XcodeGen を採用しています。
XcodeGen は SwiftPM 対応しているので、CocoaPods で導入しているライブラリを全て SwiftPM に切り替えました。

対応の流れは以下の通りです。

表2 作業ログ

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 UIKitimport 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!

株式会社ドワンゴの教育事業では、一緒に未来の当たり前の教育をつくるメンバーを募集しています。 カジュアル面談も行っています。 お気軽にご連絡ください!

カジュアル面談応募フォームはこちら

【教育事業】iOSエンジニア募集要項はこちら

www.nnn.ed.nico

開発チームの取り組み、教育事業の今後については、他の記事や採用資料をご覧ください。

speakerdeck.com