如果等待来自 stdin 的用户交互,则提前退出命令

Exit command early if waiting for user interaction from stdin

目前我正在使用 fastlane 在本地 gitlab runner 上构建一个 iOS 应用程序。

这是我的问题所关注的脚本部分:

    - bundle exec fastlane cert -u ${ENTERPRISE_APPLE_ID}
    - bundle exec fastlane sigh -a ${PROVISIONING_PROFILE_IDENTIFIER} username:${ENTERPRISE_APPLE_ID}
    - bundle exec fastlane gym --clean --export_method enterprise --output_name "APP-${TAG}"

此站点上有很多与 fastlane 和身份验证相关的答案,例如 this but they mostly focus on App Store Connect, not enterprise accounts. Currently I am following the suggestions from the fastlane docs 关于在我的 ci 机器上存储会话。

问题是一个月后会话过期并且 fastlane 命令不断尝试通过两个因素进行身份验证,导致我在 24 小时内尝试太多次而被暂时锁定在我的帐户之外。请参阅下面的 CI 日志。

18:27:18]: Starting login with user 'my@apple.id'
Available session is not valid any more. Continuing with normal login.
Session loaded from environment variable is not valid. Continuing with normal login.
Two-factor Authentication (6 digits code) is enabled for account 'my@apple.id'
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 you received at +1 (•••) •••-••14:
Requesting session...
Error: Incorrect verification code
Please enter the 6 digit code you received at +1 (•••) •••-••14:
Requesting session...
Error: Incorrect verification code
Please enter the 6 digit code you received at +1 (•••) •••-••14:
Requesting session...

我的问题是:是否可以判断此命令是否需要用户输入,以便我可以退出命令然后手动刷新会话?

Fastlane 中的非交互模式

将环境变量 SPACESHIP_ONLY_ALLOW_INTERACTIVE_2FA 设置为 true,这将只允许在交互环境中进行 2FA 提示。此外,将 FASTLANE_IS_INTERACTIVE 设置为 false 以告知 fastlane 您无法与之交互。

variables:
  SPACESHIP_ONLY_ALLOW_INTERACTIVE_2FA: "true"
  FASTLANE_IS_INTERACTIVE: "false"

这些环境变量的组合应该会引发错误,而不是提示 2FA。

参见:

一般处理交互式提示

但要回答更笼统的问题:'can you exit a program if it is awaiting input'。

据我所知,您无法一般性地确定程序是否正在读取标准输入。但是,一种可能能够做到这一点的方法是查看命令的标准输出以获取输入提示的文本。在您的情况下,您可以查找文本 Please enter the 6 digit code 并在找到时退出。

因此 bash 脚本可能看起来像这样:

prompt="Please enter the 6 digit code"
program_that_might_prompt_for_input > output.txt 2>&1  &
command_pid=$!
sleep 5 # probably a more elegant way to do this
output="$(cat output.txt)"
if grep -q "$prompt" <<< "$output"; then
  echo '2FA prompt detected. bailing.' > /dev/stderr
  kill $command_pid  # if you need to
  exit 1
fi
wait # wait for command to finish
# rest of script