追記
執筆当時は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を確認してみることをおすすめします。