dSYMファイルのダウンロード・アップロードを2FAに対応して(ほぼ)自動化してみた #bitrise_meetup
今年の2月よりApp Store Connect上の操作は2段階認証もしくは2要素認証(以下2FA)が必須とアナウンスがありました。(実際に実施されたのは3月3日)
手動で操作する場合にはいいのですがCIで操作したい場合に2FAに対応するのは面倒くさいですよね。ただ、大抵の操作はAPIを利用すれば問題ないので基本的には困らないことがほとんどかと思います。しかし、dSYMファイルのダウンロードに関してはAPIが対応していないので2FAの対応が必要なものでした。そんな中、岸川さんのブログで同様の課題を解決する記事が掲載されました。
ここではVonageというサービスを利用する例が紹介されていましたが、規約的に正しくないとのことで推奨されませんでした。記事内にはAndroid端末を利用すれば自動化も可能という記述もありますが、こちらはiOSアプリの開発者なのでなるべくAppleのプラットフォームで完結させたいですよね。そんな中でふと思い立ってAppleのショートカットアプリのオートメーションの一覧を眺めているとメッセージを受け取ったことをトリガーにワークフローが実行できることが分かりました。
これなら2FAのコードを受け取れるのでは無いかと思ったので早速試してみました。全体の概要図は以下のような感じです。
実装方法
上記の番号でいう後ろから実装していきます。
(8) 保存済みのコードをAPIを作成して返す
下記のようなスプレッドシートを用意します。A2セルに保存済みのコードが入っているイメージです。
続いてスクリプトエディタを起動します。
このようなコードを書きます。A2の値を文字列化してJSONとして出力するだけです。
作成されたURLを叩いて下記のようなレスポンスが返れば作成成功です。
{"code": "AAAAAA"}
(6) (7) ZapierのWebHookが呼ばれたらスプレッドシートに値を保存
続いてショートカットアプリが呼ぶWebHookを作成します。こちらもGASでコードを更新するようなAPIを作ってもよかったんですがZapierの方が圧倒的に簡単なのでZapierを利用しました。
Catch Hookが呼ばれた時の挙動を設定します。
codeというパラメータを受け取ることを明示します。
テスト的に生成されたURLを叩いてきちんとcodeが取得されることを確認します。続いてスプレッドシートの値を更新するアクションを追加します。
Googleの認証を行なって先ほど作成したスプレッドシートを指定します。更新するセルに先ほど受け取ったcodeを設定します。
動作確認をしてZapをONにします。
(4) (5) (6) SMSを受け取ったらショートカットアプリのワークフローを実行してZapierのWebHookを呼び出す
Apple IDの2FAで電話番号を設定していること、Fastlaneのインストールが済んでいることを前提にしています。前述した通りショートカットアプリのメッセージを受信したことをトリガーとするオートメーションを作成します。
メッセージが次を含む欄にYour Apple ID Verification Code isと入力して完了します。
コード部分以外を削除し、先ほど作成したZapierのURLにcodeを付与してリクエストします。最後にQuick Lookで念の為結果を確認します。
動作確認としてターミナルで下記のように環境変数にログイン情報を設定します。
export FASTLANE_USER=YOUR_APPLE_ID@icloud.com
export FASTLANE_PASSWORD=YOUR_PASSWORD
export SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER=+818012345678 #YOUR PHONE NUMBER
ターミナル上でfastlane spaceauthを実行すると設定した電話番号のSMSに認証コードが飛びます。そうすると下記のようにワークフローが反応するのでRunボタンをタップすることでワークフローが実行されます。(Runボタン押さんとあかんのかーい)
(1) (2) (3) (4) (8) Bitriseでfastlane spaceauthを突破する
最後にBitriseからfastlane spaceauthを実行し、dSYMファイルダウンロード・Firebaseへのアップロードを行います。まず、下記のようなSecretを用意します。
ワークフローはこのようなイメージです。
事前にリポジトリのFastfileに下記のようなlaneを追加します。update_session laneは基本的には岸川さんの記事から拝借したものをほぼそのまま流用しています。GASのAPIを叩くところだけ変更しています。dsyms というレーンを追加し、App Store ConnectからdSYMが格納されたZIPファイルをダウンロードし、解凍しています。
Bitriseのワークフローに記述したScriptはこんな感じです。
事前設定をした後で先ほど作成したlaneを呼び出しているだけですね。せっかくBitriseを利用しているのでdSYMのアップロードは公式のStepを利用しました。
upload-symbolsスクリプトのパス、GoogleService-Info.plistのパス、dSYMファイルのリストを保管しているディレクトリのパスを指定します。実際に動作させてみたものが以下の動画です。
まとめ
こちらの内容は岸川さんを筆頭に先人の努力の上に成り立っているので感謝しかありません。iOSで利用可能なショートカットアプリを利用してSMSを受け取った後の処理を(ほぼ)自動化することができました。Runボタンをタップしないと動作しないのが玉に瑕ですが、個人開発ぐらいであれば利用可能かなと思いました。Runボタンをどうしても押したくないという方は、SMSを受け取ってZapierに流す箇所のより良い方法を模索すれば良さそうです。
P.S.
こちらの内容は元々Bitriseの方からイベント登壇の打診があり、そこでトライしてみたものを発表するつもりでした。しかし、登壇者が他に集まらなかったためイベント自体がキャンセルになったため記事にして公開することにしました。
#bitrise #2fa #fastlane #spaceauth #登壇 #iOS #firebase