初めに
いま担当しているAppでは、CIにBitriseを利用しており諸々の運用プロセスを自動化しています。
- Bitrise
- ユニットテスト実行・AppStoreへのアップロードetc..を自動化
- Firebase Crashlytics
- FirebaseパッケージはSwift Package Managerで取得
- dSYMアップロードはFastlaneのdownload_dsymsを利用してコマンドを一発叩くのみ
そんな環境下でdSYMアップロードが出来なくなったというトラブルの対処法について記しておきます。
経緯
BitcodeをOFFにする
あくる日にAppStoreへのアップロードを実行したところ、下記のエラーメッセージとともにバイナリが無効と判定されアップロードが失敗しました。
ITMS-90562: Invalid Bundle - One or more dynamic libraries that are referenced by your app are not present in the dylib search path.
AppleのForumで類似事象を参照するとConcurrencyを導入していて、なおかつBitcodeがONになっていると発生する模様。
早速BitcodeをOFFにし再度アップロードしたところ無事成功。
Xcode 14 Release NotesのDeprecationsにあるようにBitcodeが非推奨となっているのでBitcodeは恒久的にOFFにすることにしました。
ちゃんちゃん。
FastlaneでのdSYMの取得に失敗している
ところが後日、AppStoreでのAppリリースと同時にFirebase CrashlyticsへのdSYMのアップロードを行おうとしたところ失敗。
Couldn't find any dSYMs, please pass them using the dsym_path option
どうやらBitcodeをOFFにしたことでAppStoreからのdSYMダウンロードができなくなったことが原因の模様。
ということでFastlaneでdSYMをダウンロードするフローはやめることとしました。
Firebase dSYM UploadはSPMで取得したFirebaseには対応していない
BitriseではFirebase dSYM UploadというworkflowがWorkflow Recipes上に公開されています。
こちらへ切り替えることでBitcode=OFFの場合でのdSYMアップロードが実行できそうだったので、早速組み込む作業に取り掛かりました。
ところが...
このworkflowではFirebaseのパッケージをCocoapodsのキャッシュディレクトリ経由で参照する仕様となっており、Swift Package ManagerでFirebaseのパッケージを取得している場合にはそのまま利用することができませんでした。
利用したい場合には、こちらで紹介されているようにxcodebuildのオプションでキャッシュディレクトリを変更してあげる必要があります。
ですが、AppStoreへのアップロード時のみdSYMアップロードを実行できればよいので、影響は最小限にしておきたいという考えから既存のXcode Archive&Exportなどのフローには手を加えない方針とし、「一旦、手動にしとくか...」という方針になりました。
しかし、ひと手間掛けたところで美味しくなるようなものでも無いので、やっぱり自動化しておきたい...
ということで。
シェルスクリプトでやってしまおう
やりたいこととしては、
- upload-symbolsを持ってくる
- xcarchiveファイルからdSYMを取ってくる
- upload-symbolsを実行する
ということなので、これをBashで書いてしまってscriptのworkflowで実行すれば良さそうと判断しました。
- upload-symbolsを持ってくる
FirebaseのGitHubリポジトリにupload-symbolsのバイナリもきちんといたので、git clone
して持ってくることとします。
- xcarchiveファイルからdSYMを取ってくる
こちらは$BITRISE_XCARCHIVE_ZIP_PATH
からpathを取得できるので指定は簡単です。
結果としては以下のような実装を行いました。
### xcarchiveのパス・ファイル名の定義
xcarchive_package=MyApp.xcarchive
xcarchive_file=${xcarchive_package}.zip
### プロジェクト内のGoogleService-Info.plistの在り処を把握しておく
google_info_path=$BITRISE_SOURCE_DIR/MyApp/Supporting\ Files/GoogleServices/MyApp/GoogleService-Info.plist
### Firebaseリポジトリでのupload-symbolsのパス
upload_symbols=./firebase-ios-sdk/Crashlytics/upload-symbols
### プロジェクトのディレクトリへ移動
cd $BITRISE_SOURCE_DIR/MyApp
### GitHubのFirebaseのリポジトリからclone
echo "download binary from GitHub"
git clone https://github.com/firebase/firebase-ios-sdk.git
### upload-symbolsのバイナリの実行権限を変更しておく
chmod 755 $upload_symbols
### xcarchiveのファイルをcurrentにコピーしておく
cp $BITRISE_XCARCHIVE_ZIP_PATH .
### xcarchiveのzipファイルを展開
echo "extract App xcarchive file"
unzip $xcarchive_file
### upload-symbolsの実行
$upload_symbols -gsp "$google_info_path" -p ios ./$xcarchive_package/dSYMs
このスクリプトで無事アップロードも自動化出来ました。
自身でメンテナンスすることを考えると極力Workflow Recipesで公開されているworkflowを使うのが良いと思うので、可能な限りWorkflow Recipesにあるworkflowを使ってあげたいところです。
ですがかゆいところに手の届かない、という状況の場合はscriptのworkflowを活用していきましょう。