您能否在具有苹果 2 因素身份验证的 CI 环境中使用“expo build:ios”以及如何使用

kid*_*oca 6 docker expo google-cloud-build

有没有办法expo build:ios在 CI 环境中使用并通过 2 因素身份验证?

由于我的苹果开发人员帐户需要 2 因素身份验证,我在我们的 CI 环境中使用 expo 开始构建时遇到了麻烦。

expo build:ios命令是否应该仅在本地使用或没有 2 因素身份验证?

以交互模式在本地运行构建工作 - 仅在我第一次选择构建应用程序时才需要密码和 2 因素身份验证。对于连续构建,我只使用expo build:ios --release-channel test,仅此而已

我的 CI 环境是 google 的 Cloud Build - 它在一个 Docker 容器中运行,所以我不能去进行一次手动登录来让运行器保留一些会话信息,就像它发生在本地一样吗?


在阅读了 cli 使用信息后expo build:ios,您可以像EXPO_APPLE_PASSWORD我一样将帐户密码设置为 ENV 变量,尽管它应该可以在 CI 环境中使用

但后来我得到以下结果:

expo login --non-interactive -u XXX

Success. You are now logged in as XXX.
Run Code Online (Sandbox Code Playgroud)
expo build:ios --non-interactive --no-wait --release-channel test --apple-id XXXXX --team-id F7NE7X9ZFW
Run Code Online (Sandbox Code Playgroud)
- Making sure project is set up correctly...
[16:43:00] Checking if there is a build in progress...
[16:43:00] Trying to authenticate with Apple Developer Portal...
Two-factor Authentication (6 digits code) is enabled for account 'XXXXX'
More information about Two-factor Authentication: https://support.apple.com/en-us/HT204915
If you're running this in a non-interactive session (e.g. server or CI)
check out https://github.com/fastlane/fastlane/tree/master/spaceship#2-step-verification
...
Please enter the 6 digit code:
[16:43:02] Authentication with Apple Developer Portal failed!
[16:43:02] Reason: Unknown reason, raw: "The input stream is exhausted."
Run Code Online (Sandbox Code Playgroud)

所以我按照非交互式会话的链接:https : //github.com/fastlane/fastlane/tree/master/spaceship#2-step-verification

我看到我必须创建和使用FASTLANE_SESSION环境变量。但在那一点上,我不确定它是否会起作用,因为这似乎来自 expo 内部使用的一些工具。

我想我可以fastlane在本地安装并尝试使用命令生成这个变量fastlane spaceauth -u user@example.org。虽然我在世博会文档中没有找到任何关于此的信息

有关于expo build:ios用于构建独立应用程序的信息,它仅涵盖如何在本地构建它们https://docs.expo.io/versions/v36.0.0/distribution/building-standalone-apps/

他们有一个 CI 流程指南(“在你的 CI 上”)——但它正在使用turtle-cli,对于 iOS,它需要在 mac 环境中运行——它涵盖了如何在你自己的机器上构建自己而不是使用expo.io https://docs .expo.io/versions/v36.0.0/distribution/turtle-cli/


我尝试过的另一件事是运行:

expo build:ios \
  --team-id YOUR_TEAM_ID \
  --dist-p12-path /path/to/your/dist/cert.p12 \
  --provisioning-profile-path /path/to/your/provisioning/profile.mobileprovision
Run Code Online (Sandbox Code Playgroud)

随着EXPO_IOS_DIST_P12_PASSWORD一系列的环境变量但是它仍然需要Apple ID和密码的生成会失败


有没有一种方法可以共享或复制我的本地会话——expo 在我第一次运行时创建的会话,build:ios我通过身份验证并且不再提示我输入 CI 机器的密码?

kid*_*oca 1

这最终对我有用:

\n

我已经创建了另一个包标识符com.myawesome.stuff\n我还生成/创建了:

\n
    \n
  • 经销证书 P12 --dist-p12-path
  • \n
  • Push Key .p8 文件 ---push-id--push-p8-path
  • \n
  • 配置文件。---push-p8-path
  • \n
\n

然后在本地我运行了以下命令:

\n

交互登录

\n
expo login\n
Run Code Online (Sandbox Code Playgroud)\n

与苹果交互验证

\n
expo build:ios --clear-credentials --apple-id my@appleId.com --team-id=TheTeam --dist-p12-path=dist.p12 --provisioning-profile-path=profile.mobileprovision --push-p8-path=push.p8 --push-id=THEID --release-channel test\n
Run Code Online (Sandbox Code Playgroud)\n

公平地说,我已经在本地但在谷歌云控制台终端中运行了这些

\n

然后在 CI 环境中我们只需使用:

\n
expo login --non-interactive "--username=XXXX"\n
Run Code Online (Sandbox Code Playgroud)\n
expo build:ios --non-interactive --no-wait "--release-channel=$BRANCH_NAME"\n
Run Code Online (Sandbox Code Playgroud)\n

它可以工作并产生以下日志

\n
- Making sure project is set up correctly...\n[17:48:39] Checking if there is a build in progress...\n\n[17:48:40] Fetching available credentials\n[17:48:40] Unable to validate distribution certificate due to insufficient Apple Credentials\n[17:48:40] Unable to validate Push Keys due to insufficient Apple Credentials\n- Performing best effort validation of Provisioning Profile...\n\n[xmldom error]  element parse error: Error: invalid tagName: \n@#[line:99,col:125]\n[xmldom error]  element parse error: Error: invalid tagName: \n@#[line:114,col:75]\n[xmldom error]  element parse error: Error: invalid tagName: \n@#[line:143,col:84]\n\xe2\x9c\x94 Successfully performed best effort validation of Provisioning Profile.\n[17:48:40]\n[17:48:40] Project Credential Configuration:\n[17:48:40]   Experience: @XXXX/XXXX, bundle identifier: com.XXXXXXXX\n[17:48:40]     Provisioning profile is missing. It will be generated during the next build\n[17:48:40]     Apple Team ID: XXXXXXX,  Apple Team Name: ---------\n[17:48:40]\n[17:48:40]   Distribution Certificate - Certificate ID: -----\n[17:48:40]     Apple Team ID: XXXXXXX,  Apple Team Name: ---------\n[17:48:40]     used by\n      @XXXX/XXXX (com.XXXXXXX)\n[17:48:40]   Push Notifications Key - Key ID: XXXXXXXX\n[17:48:40]     Apple Team ID: XXXXXXX,  Apple Team Name: ---------\n[17:48:40]     used by\n      @XXXX/XXXX (com.XXXXXXX)\n[17:48:40] Unable to find an existing Expo CLI instance for this directory, starting a new one...\n[17:48:42] Starting Metro Bundler on port 19001.\n[17:48:46] Tunnel ready.\n[17:48:46] Publishing to channel \'test\'...\n[17:48:47] Building iOS bundle\n[17:50:13] Finished building JavaScript bundle in 60785ms.\n[17:50:13] Building Android bundle\n[17:51:04] Finished building JavaScript bundle in 51597ms.\n[17:51:04] Analyzing assets\n[17:51:06] Finished building JavaScript bundle in 1669ms.\n[17:51:08] Finished building JavaScript bundle in 1526ms.\n[17:51:08] Uploading assets\n[17:51:08] No assets changed, skipped.\n[17:51:08] Processing asset bundle patterns:\n[17:51:08] - /workspace/**/*\n[17:51:08] Uploading JavaScript bundles\n[17:51:12] Published\n[17:51:12] Your URL is\n\nhttps://exp.host/@XXXX/XXXX?release-channel=test\n\n[17:51:12] \xe2\x80\xba Closing Expo server\n[17:51:12] \xe2\x80\xba Stopping Metro bundler\n[17:51:13] Checking if this build already exists...\n\n[17:51:13] Build started, it may take a few minutes to complete.\n[17:51:13] You can check the queue length at https://expo.io/turtle-status\n\n[17:51:13] You can make this faster. \nGet priority builds at: https://expo.io/settings/billing\n\n[17:51:13] You can monitor the build at\n\n https://expo.io/dashboard/XXXX/builds/e5c32814-8613-4fef-889a-05ca982e952f\n\n[17:51:13] Alternatively, run `expo build:status` to monitor it from the command line.\n
Run Code Online (Sandbox Code Playgroud)\n

查看尽管在开始时出现了麻烦的警告,但构建仍然有效,并产生了.ipa我们已成功提交试飞的结果

\n
\n

[xmldom错误]元素解析错误:错误:无效的tagName:@#[行:99,列:125]

\n

[17:48:40] 缺少配置文件。它将在下次构建时生成

\n
\n
\n

我认为问题可能是我们正在使用的谷歌云构建机器是在美国位置设置的,但上次我expo build:ios在我的电脑上本地使用该命令时,我位于不同的区域。因此,只需运行expo build:ios -clear-credentials就足够了,您可以让 expo 创建和管理所有必需的证书。

\n

但我没有找到任何在CI(非交互式)环境中您应该expo build:ios在不提供 Apple ID 和凭据的情况下使用的信息

\n

  • 事实证明,“如果您在 expo 帐户上为应用程序配置了凭据,则无需在 CI 上向 Apple 进行身份验证”,因此我所要做的就是在本地计算机上完成构建一次,以便 expo 生成凭据我并将它们与我的 expo 帐户关联起来,在 CICD 上登录相同的 expo 帐户并运行“expo:build:ios”命令,不使用任何与凭证相关的参数,瞧! (3认同)