追記
執筆当時はhttps://github.com/bitrise-steplib/steps-fastlane でfastlaneのstepが公開されていることが知りませんでした。
steps-fastlaneのversion2.7.0を使用していたのでそちらのコードをみればどのようにbitrise上で扱っているかがわかります。
Bitriseの2FA
BitriseではAppleIDに2FA(二段階認証)がかかっていたとしてもApp Store Connect 2FA solved on Bitriseのように設定をすることで、セッションが有効な30日間は2FAをスキップすることが可能です。
ただ以下のようなSandboxユーザーを扱うケースでハマりました。
ハマったこと
以下2つのアカウントがあるとします。
2FAの設定をしていないAppleID: apple_id_not_2fa@test.com
2FAの設定をしているAppleID: apple_id_2fa@test.com
Bitrise上で紐付いているアカウントはapple_id_2fa@test.comとします。
以下のような、2つのアカウントのSandboxユーザーを削除するfastlane actionを実行します。
# Fastfile
require 'spaceship'
lane :remove_sandbox_users do
_remove_sandbox_users(username: "apple_id_not_2fa@test.com", password: "password", sandbox_user: "sandbox_not_2fa@test.com")
_remove_sandbox_users(username: "apple_id_2fa@test.com", password: "password", sandbox_user: "sandbox_2fa@test.com")
end
private lane :_remove_sandbox_users do |options|
Spaceship::Tunes.login(options[:username], options[:password])
Spaceship::Tunes::SandboxTester.delete!([options[:sandbox_user]])
end
上記のremove_sandbox_usersをBitrise上で実行すると、sandbox_2fa@test.comは削除されますが、2FAを有効にしていないアカウント側の**sandbox_not_2fa@test.comは削除されません**。
原因
Bitrise上でapple_id_2fa@test.comを紐付けた際に、おそらくBitriseの内部でFASTLANE_SESSIONの設定とcookieが作成されています。
(ref: https://discuss.bitrise.io/t/two-factor-authentication-for-apple-id-itunes-connect-testflight-deploy/1180/25)
そのため2FAが設定されているapple_id_2fa@test.comのFASTLANE_SESSIONが使用されたため、常にapple_id_2fa@test.comのログイン状態になり、apple_id_not_2fa@test.com上に作成したSandboxユーザーは削除されません。
(FASTLANE_SESSIONが設定されている場合、https://github.com/fastlane/fastlane/blob/c821aa892157ad499b03dc7693877b978db9a64c/spaceship/lib/spaceship/client.rb#L431 で読み込まれます)
いくつか挙動に疑問を感じたため、以下のようなケースをローカルで実験しました。
実験
以下2つのファイルを利用して、Bitrise上ではなく、ローカル上で確認をしました。
またcookieは、~/.fastlane/spaceship/**/cookie のことを示しています。
# Fastfile
require 'spaceship'
lane: test_login do
Spaceship::Tunes.login("apple_id_2fa@test.com", "password")
end
# fastlane/.env
FASTLANE_SESSION="fastlane_session value of apple_id_2fa@test.com"
-
FASTLANE_SESSION="", cookieがない場合
2FA
-
FASTLANE_SESSION="", 有効なcookieが存在する場合
2FAスキップ
-
FASTLANE_SESSION="fastlane_session value of apple_id_2fa@test.com", cookieがない場合
2FAスキップ
1以外は、2FAをスキップしてログインが成功していることがわかります。
表にまとめると以下のようになります。
| ケース | 2FA Skip |
|---|---|
| FASTLANE_SESSION="", cookieがない場合 | ✗ |
| FASTLANE_SESSION=""=, 有効なcookieが存在する場合 | ◯ |
| FASTLANE_SESSION="fastlane_session value of apple_id_2fa@test.com", cookieがない場合 | ◯ |
改善案
今回のケースの改善案として、Bitriseの[Workflow]→[Env]に移動して、対象のworkflowのEnvironment Variablesに
ENV["FASTLANE_SESSION"] = ""
を設定します。
これにより、Bitrise上で2. FASTLANE_SESSION="", 有効なcookieが存在する場合と同じ状態になるため
apple_id_not_2fa@test.comの場合:
apple_id_not_2fa@test.comで通常ログイン
apple_id_2fa@test.comの場合:
apple_id_not_2fa@test.comでcookieを利用してログイン
どちらのアカウントも問題なくログインすることができ、Sandboxユーザーの作成・削除を行えます。
まとめ
複数のAppleID(2FAありなし)でSandboxユーザーを操作することはなかなかないと思いますが、もしこのようなことが起こった場合、FASTLANE_SESSIONとcookieを確認してみることをおすすめします。