Xcode Cloud から MagicPod を動かしてみたよ

おはようございます。 note の watura です。

前回に引き続き Xcode Cloud です。前回の記事で、サブスクリプションができないから使えないと書いたのですが、無事にサブスクリプションできるようになったので、本格的に使いはじめました。

MagicPod

note の iOS アプリはテストの一環として、MagicPod を使っています。

MagicPodは、モバイルアプリテスト、ブラウザ(ウェブアプリ)テストの両方に対応したAIテスト自動化クラウドサービスです。

MagicPod どうなの??っていうのは以下の記事をみてください。

今までは、Circle CI からバイナリをアップロードして、テストを実行していたのですが、Xcode Cloud からできるようにしました。

Xcode Cloud から MagicPod を呼び出す方法

 MagicPod はウェブからポチポチやる以外に、API をたたいたり、クライアントアプリを経由したりで呼び出せます。

これらを駆使して、Xcode Cloud から実行するようにしました。

環境変数

Xcode Cloud にいくつかの環境変数を設定しています。各環境変数の意味等については、magicpod-api-client のヘルプを参照してください。

  • MAGICPOD_ORGANIZATION

  • MAGICPOD_PROJECT

  • MAGICPOD_API_TOKEN

利用可能端末数

note ではスタンダードプランを契約しています。スタンダードプランは同時に使える端末数が2台に制限されています。なので、3つ以上のテストが並列で走ってしまった場合、エラーになってしまいます。
MagicPod API から現在実行している端末数がわかるので、2以上だった場合はテストを実行せずに exit 0 するようにしました。

バイナリのアップロード

テストで使うバイナリをアップロードする必要があります。MagicPod にアップロードするバイナリは、サイン済みの物ではなくシミュレーター用のものである必要があります。
なので、Xcode Cloud でビルドが終わった時点のものを取り出してきて、アップロードすることになります。
ファイル名を一意にして、あとからわかるようにするために、note-{$version}-{$CI_BUILD_ID}.app としてアップロードするようにしています。なお、シミュレータ用のバイナリは ${CI_DERIVED_DATA_PATH}/Build/Products/Debug-iphonesimulator/app_name.app にあるはずです。

アップロードがおわったら、そのまま、./magicpod-api-client batch-run -s <なんかオプションいっぱい> を実行しています。

Xcode Cloud から実行

Xcode Cloud では Clone 後、ビルド前、ビルド後の3つのタイミングでスクリプトを実行できます。今回は、シミュレータ用のバイナリが必要なので、ビルド後(Post-Xcodebuild) で実行するようにしています。

Script を実行できるタイミング
https://developer.apple.com/documentation/xcode/writing-custom-build-scripts

ビルド後に実行されるスクリプトとして、以下のような ./ci_scripts/ci_post_xcodebuild.sh  を作成し、上記の script をmagicpod.shとして呼び出すようにしています。こうすると、Test以外のDeployみたいなワークフローでは実行されなくなり、不要な実行が行われなくなります。

#!/bin/sh -x

set -e

if [ $CI_WORKFLOW = 'Test' ]; then
 ./magicpod.sh
fi

というわけで、テストのタイミングでこれらのスクリプトを実行するようにしたので、Xcode Cloud から MagicPod を呼び出せるようになりました。

このようにしてじわじわと Xcode Cloud 本格導入をすすめています。

次回予告

Xcode Cloud のワークフローを Slack Slash Command で実行できるようにするぞという記事を書きます。書いています。


最後に一つ。現在 MagicPod は Safari 非対応なので、Safari ユーザーの私的には早く Safari 対応してくれないかなぁと待ち続けています。