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

Posted

技术标签:

【中文标题】您能否在具有苹果 2 因素身份验证的 CI 环境中使用“expo build:ios”以及如何【英文标题】:Can you use "expo build:ios" on a CI environment with apple 2 factor authentication and how 【发布时间】:2020-06-19 08:04:19 【问题描述】:

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

由于我的 Apple 开发人员帐户需要 2 因素身份验证,我无法在 CI 环境中使用 expo 开始构建。

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

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

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


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

然后我得到以下结果:

expo login --non-interactive -u XXX

Success. You are now logged in as XXX.
expo build:ios --non-interactive --no-wait --release-channel test --apple-id XXXXX --team-id F7NE7X9ZFW
- 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."

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

我发现我必须创建和使用FASTLANE_SESSION 环境变量。 但那时我不确定它是否会起作用,因为这似乎来自世博会内部使用的一些工具。

我想我可以在本地安装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.iohttps://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

EXPO_IOS_DIST_P12_PASSWORD 设置为环境变量,但构建会失败,因为它仍然需要苹果 ID 和密码


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

【问题讨论】:

【参考方案1】:

这就是最终对我有用的方法:

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

分发证书P12--dist-p12-path 按键 .p8 文件 - --push-id--push-p8-path 供应配置文件。 - --push-p8-path

然后本地我已经运行了以下:

交互式登录

expo login

与苹果交互验证

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

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

然后在我们刚刚使用的CI环境上

expo login --non-interactive "--username=XXXX"
expo build:ios --non-interactive --no-wait "--release-channel=$BRANCH_NAME"

哪个有效并产生以下日志

- Making sure project is set up correctly...
[17:48:39] Checking if there is a build in progress...

[17:48:40] Fetching available credentials
[17:48:40] Unable to validate distribution certificate due to insufficient Apple Credentials
[17:48:40] Unable to validate Push Keys due to insufficient Apple Credentials
- Performing best effort validation of Provisioning Profile...

[xmldom error]  element parse error: Error: invalid tagName: 
@#[line:99,col:125]
[xmldom error]  element parse error: Error: invalid tagName: 
@#[line:114,col:75]
[xmldom error]  element parse error: Error: invalid tagName: 
@#[line:143,col:84]
✔ Successfully performed best effort validation of Provisioning Profile.
[17:48:40]
[17:48:40] Project Credential Configuration:
[17:48:40]   Experience: @XXXX/XXXX, bundle identifier: com.XXXXXXXX
[17:48:40]     Provisioning profile is missing. It will be generated during the next build
[17:48:40]     Apple Team ID: XXXXXXX,  Apple Team Name: ---------
[17:48:40]
[17:48:40]   Distribution Certificate - Certificate ID: -----
[17:48:40]     Apple Team ID: XXXXXXX,  Apple Team Name: ---------
[17:48:40]     used by
      @XXXX/XXXX (com.XXXXXXX)
[17:48:40]   Push Notifications Key - Key ID: XXXXXXXX
[17:48:40]     Apple Team ID: XXXXXXX,  Apple Team Name: ---------
[17:48:40]     used by
      @XXXX/XXXX (com.XXXXXXX)
[17:48:40] Unable to find an existing Expo CLI instance for this directory, starting a new one...
[17:48:42] Starting Metro Bundler on port 19001.
[17:48:46] Tunnel ready.
[17:48:46] Publishing to channel 'test'...
[17:48:47] Building iOS bundle
[17:50:13] Finished building javascript bundle in 60785ms.
[17:50:13] Building android bundle
[17:51:04] Finished building JavaScript bundle in 51597ms.
[17:51:04] Analyzing assets
[17:51:06] Finished building JavaScript bundle in 1669ms.
[17:51:08] Finished building JavaScript bundle in 1526ms.
[17:51:08] Uploading assets
[17:51:08] No assets changed, skipped.
[17:51:08] Processing asset bundle patterns:
[17:51:08] - /workspace/**/*
[17:51:08] Uploading JavaScript bundles
[17:51:12] Published
[17:51:12] Your URL is

https://exp.host/@XXXX/XXXX?release-channel=test

[17:51:12] › Closing Expo server
[17:51:12] › Stopping Metro bundler
[17:51:13] Checking if this build already exists...

[17:51:13] Build started, it may take a few minutes to complete.
[17:51:13] You can check the queue length at https://expo.io/turtle-status

[17:51:13] You can make this faster. ?
Get priority builds at: https://expo.io/settings/billing

[17:51:13] You can monitor the build at

 https://expo.io/dashboard/XXXX/builds/e5c32814-8613-4fef-889a-05ca982e952f

[17:51:13] Alternatively, run `expo build:status` to monitor it from the command line.

尽管在开始时出现了麻烦的警告,但构建工作并生成了一个.ipa,我们已成功提交给试飞

[xmldom error] 元素解析错误:Error: invalid tagName: @#[line:99,col:125]

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


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

但我在任何地方都没有找到任何信息表明您应该在 CI(非交互式)环境中使用 expo build:ios 而无需提供 Apple id 和凭据

【讨论】:

原来If you have credentials configured for your app on your expo account there is no need to authenticate with Apple on CI 所以我所要做的就是在我的本地计算机上完成构建一次,让 expo 为我生成凭据并将它们与我的 expo 帐户相关联,登录相同在 CICD 上的 expo 帐户并运行 expo:build:ios 命令,其中没有任何与凭据相关的参数,瞧!

以上是关于您能否在具有苹果 2 因素身份验证的 CI 环境中使用“expo build:ios”以及如何的主要内容,如果未能解决你的问题,请参考以下文章

在临时/生产环境中,双因素身份验证代码不匹配

Codeigniter 3.x 身份验证库?

使用 fastlane 的两因素身份验证

具有数据库授权的 Spring JAAS 身份验证

Postman授权设置

将远程提交推送到 github 并启用两因素身份验证