麦芽を支える技術

麦芽(ばくが、英語:malt)とは、麦、特に大麦の種子を発芽させたもので、ビール、ウイスキー、水飴の原料となる。(Wikipediaより)

fastlaneでビルドしたiOSアプリがBitrise Shipに反映されない問題の対処

この記事はBitrise Advent Calenderの14日目の記事です。

はじめに

普段はiOSアプリをメインとしたネイティブアプリ開発を生業としておりまして、Bitriseさんには結構長らく大変お世話になっております。(振り返ってみると2015年に使い始めたらしくもう4年...!)

なので、Bitriseの情報は普段から割とチェックしているのですが、最近Bitriseの新しい機能として「Ship」が追加されました。

blog.bitrise.io

ShipはこれまでBitriseのStepとして存在していた「Deploy to Bitrise.io」Stepのアドオンという形で提供されており、これまで通りのStep使いながらもバージョン管理やストアメタ情報など含めた本番アップロードなどの機能を新たに利用することができるようになります。

利用に当たっては、以下のドキュメントの通りいくつかの手順で設定すれば簡単に始められます。

devcenter.bitrise.io

ただここでちょっと私のケースだと詰まってしまったので、その事象と対応について今回ご紹介します。

(おことわり:この記事を書いた2019/12/14現在Shipはまだベータ版であり、当然ながら今後仕様については変わる可能性がありますので、それを前提とした上でお読み下さい)

今回やりたいこと

基本的には先述のドキュメント通りの手順で進めていくわけですが、ドキュメントには以下の記載があります。

  • ワークフローの1つに、 Xcode Archive & Export for iOSAndroid Build のような、アプリをビルドするステップが必要です。
  • 同じワークフローには、アプリをビルドするステップのあとに、Deploy to Bitrise.io ステップの正しいバージョンが必要です。

2点目についてはそのままなのですが、1点目のアプリをビルドステップについて「Xcode Archive & Export for iOSAndroid Build のような」という記載があります。

ここで私の場合、アプリのビルドにはfastlaneのgymを利用し、ここで出来たipaファイルを「Deploy to Bitrise.io」Stepに投げる、というワークフローを元々組んでいました。

なので、「Xcode Archive & Export for iOSAndroid Build のような」ビルドステップとしては「fastlane gymでのビルド」が該当するので、それを単純に最新Verの「Deploy to Bitrise.io」Stepに投げてShipを利用しようと考えていました。

詰まったこと

というわけで、意気揚々と「Deploy to Bitrise.io」Stepを最新版に上げてBitriseのワークフローを走らせたわけですが、完了してShipページに行ってみてもどうも反映されていないご様子。

f:id:asmz0:20191214002946p:plain:w500
こんな感じ

Settings辺りを何度か変えて再実行しても同じ結果になるため、なんか手順が足りないのだろうなぁとなっていました。

調べたこと

本来のStepでの動作と見比べる

他にも色々調べたのですがここが決定的だったので書いておいます。

元々の手順で挙げられている「Xcode Archive & Export for iOS」Stepであればちゃんと出来るはずなので、そのStepの動作と今回の動作でどこが違うか、別プロジェクトで試してみてそのログを見比べてみました。

すると、以下のように「Xcode Archive & Export for iOS」では .ipa.xcarchive.zip をDeploy用ディレクトリに出力し、それらをどちらも「Deploy to Bitrise.io」Stepに投げていることが確認できました。

[xcode-archive log]

:
The xcarchive zip path is now available in the Environment Variable: BITRISE_XCARCHIVE_ZIP_PATH (value: /Users/vagrant/deploy/XXXX.xcarchive.zip)
The app directory is now available in the Environment Variable: BITRISE_APP_DIR_PATH (value: /Users/vagrant/deploy/XXXX.app)
:

[deploy-to-bitrise-io log]

List of files to deploy
- /Users/vagrant/deploy/export_options.plist
- /Users/vagrant/deploy/XXXX.dSYM.zip
- /Users/vagrant/deploy/XXXX.ipa
- /Users/vagrant/deploy/XXXX.xcarchive.zip

🤔<なるほど?それを投げればええんか

結論

というわけで、アプリの.ipaファイルだけではなく、アーカイブ時に生成される.xcarchiveをzip圧縮した.xcarchive.zipも一緒に「Deploy to Bitrise.io」Stepに投げてあげることで、Shipに反映されます。

なので、Fastfileで一旦以下のように適当なディレクトリ(この例では./deploy)に .ipa.xcarchive.zip を保管し、

[fastlane/Fastfile]

     gym(
       scheme: scheme,
       workspace: "XXXX.xcworkspace",
+      output_directory: "./deploy",
+      output_name: "XXXX.ipa",
+      archive_path: "./XXXX.xcarchive",
       configuration: configuration,
       export_method: export_method,
       clean: true
     )
+    zip path: "./XXXX.xcarchive", output_path: "./deploy/XXXX.xcarchive.zip"

その後の「Deploy to Bitrise.io」Stepでこのディレクトリを対象とすることで、うまくShipへの反映まで持っていけることがわかりました。

f:id:asmz0:20191214003636p:plain:w500

ちなみに、.ipaは投げず.xcarchive.zipだけDeploy Stepに投げると、Shipへは反映されるのですがそのバージョンに対する公開ページが作成されませんでした。公開ページがないと結局そのバイナリはインストール出来ないので、意味ないことになります。(今回試してないですが、公式Doc見る限り本番ビルドならこれでも良いのかも)

おわりに

というわけで、ちょっと詰まりつつも現在Shipはうまく利用できています。

ちなみにAndroidはこのような問題は特に発生せず、当初思惑の通り「Deploy to Bitrise.io」Stepの最新化のみで利用可能となっています。

一つ要望をあげると、今回より利用できるようになったバージョン管理機能を、QRコードで配ったテスターの人でも利用できる(テスターが好きな時に過去バージョン一覧から過去バージョンをインストールできる)ようになるといいなぁと感じました。

みなさまもぜひ一度お試しくださいな。