LoginSignup
13
0

More than 1 year has passed since last update.

BitriseでのdSYMのアップロードに試行錯誤した話(Bitcodeなし & SPMでFirebaseを利用している場合)

Last updated at Posted at 2022-12-10

初めに

いま担当しているAppでは、CIにBitriseを利用しており諸々の運用プロセスを自動化しています。

  • Bitrise
    • ユニットテスト実行・AppStoreへのアップロードetc..を自動化
  • Firebase Crashlytics
    • FirebaseパッケージはSwift Package Managerで取得
  • dSYMアップロードはFastlaneのdownload_dsymsを利用してコマンドを一発叩くのみ

そんな環境下でdSYMアップロードが出来なくなったというトラブルの対処法について記しておきます。

経緯

BitcodeをOFFにする

あくる日にAppStoreへのアップロードを実行したところ、下記のエラーメッセージとともにバイナリが無効と判定されアップロードが失敗しました。

スクリーンショット 2022-12-02 17.53.22.png
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のアップロードを行おうとしたところ失敗。

スクリーンショット 2022-12-02 17.30.01.png
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アップロードが実行できそうだったので、早速組み込む作業に取り掛かりました。

スクリーンショット 2022-12-02 17.27.36.png

ところが...
この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を活用していきましょう。

13
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
0