我正在使用 Fastlane 在本地构建一个 iOS 应用程序,没有任何问题。
我正在使用match一个单独的 repo,以跟踪证书和配置文件。
在本地它工作正常。
但是,在 Bitrise 上,我收到此错误:
[05:23:16]:安装了所有必需的密钥、证书和配置文件
[05:23:16]:将配置文件类型设置为“应用商店”
[05:23:16]: ---------------
[05:23:16]:---步骤:build_app---
[05:23:16]: ---------------
[05:23:16]: $ xcodebuild -list -workspace Myapp.xcworkspace -configuration 调试
[05:23:17]: $ xcodebuild -showBuildSettings -workspace Myapp.xcworkspace -scheme Myapp -configuration Debug
[05:23:20]:无法自动检测配置文件映射
[05:23:20]:从 Xcode 9 开始,您需要提供什么的显式映射
[05:23:20]:配置文件以用于您应用的每个目标
[05:23:20]:没有那个文件或目录@rb_sysopen - /Users/vagrant/git/Pods/Target Support Files/Pods-Myapp/Pods-Myapp.debug.xcconfig
[05:23:20]:检测到配置文件映射:{:"com.myapp.myapp"=>"match AppStore com.myapp.myapp"}
我尝试明确映射我的配置文件Fastfile:
[05:23:16]: All required keys, certificates and provisioning profiles are installed [05:23:16]: Setting Provisioning Profile type to 'app-store' [05:23:16]: ----------------------- [05:23:16]: --- Step: build_app --- [05:23:16]: …
目前我们的测试失败了,因为当授予位置权限时,我们永远不会进入下一个屏幕,因为位置更新永远不会发生。
这是因为使用 Fastlane 设置的新模拟器实例不会设置位置。app 目标方案指定了默认位置,UI 测试目标也是如此;两者都没有受到尊重。当从 Xcode 运行测试时,位置确实会得到尊重,而不是当模拟器从命令行激活时,因为模拟器应用程序从未真正打开过,只是存在,由终端拥有但不可见。测试套件上的位置也已设置。
当模拟器以不可见的方式运行时,如何在脚本中设置模拟器的位置?
我发现了这个:https : //github.com/lyft/set-simulator-location
它需要这个脚本:
# download set-simulator-location
brew install lyft/formulae/set-simulator-location
# run simulator
export IOS_SIMULATOR_UDID=`instruments -s devices | grep "iPhone 6 (10.3) \[" | awk -F '[ ]' '{print $4}' | awk -F '[\[]' '{print $2}' | sed 's/.$//'`
echo $IOS_SIMULATOR_UDID
open -a "simulator" --args -CurrentDeviceUDID $IOS_SIMULATOR_UDID
# wait simulator to start fully
sleep 15
# set location
set-simulator-location -q London
Run Code Online (Sandbox Code Playgroud)
但它看起来很笨重,需要硬编码特定的模拟器然后打开它,等待 15 秒,然后在上面设置位置。我觉得一定有更好的方法。
在办公室文档页面https://docs.fastlane.tools/actions/gym/中没有太多关于此的文档。
唯一提到编译标志的是:
xcargs:
在构建阶段将附加参数传递给 xcodebuild。请务必引用设置名称和值,例如 OTHER_LDFLAGS="-ObjC -lstdc++"
这是我们目前所拥有的:
gym(options.merge(:export_xcargs => "-allowProvisioningUpdates",
:export_method => "development"))
Run Code Online (Sandbox Code Playgroud)
我们现在想将此标志添加到我们的构建中:
-Xfrontend -warn-long-expression-type-checking=100
Run Code Online (Sandbox Code Playgroud)
我们不想像这样将它添加到 Xcode 项目文件中https://github.com/fastred/Optimizing-Swift-Build-Times因为我们只希望在使用 fastlane 的构建机器上进行此检查。
所以这就是我们尝试的:
gym(options.merge(:export_xcargs => "-allowProvisioningUpdates",
:export_method => "development",
:xcargs => "-Xfrontend -warn-long-expression-type-checking=100"))
Run Code Online (Sandbox Code Playgroud)
但它一直抱怨这个错误:
xcodebuild: error: invalid option '-Xfrontend'
Run Code Online (Sandbox Code Playgroud)
我们如何正确添加这个标志?
我尝试将 Jenkins 与 fastlane 结合使用。执行构建的mac是jenkins master的slave。master 安装在 windows 10 系统上。
当尝试使用 Jenkins 构建 iOS 构建并使用bundle installorbundle exec fastlane beta我总是得到错误:
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/dependency.rb:296:in `to_specs': 找不到 'bundler' (>= 0.a ) 共 253 个 gem(s) (Gem::LoadError)
Run Code Online (Sandbox Code Playgroud)from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/dependency.rb:307:in `to_spec' from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_gem.rb:47:in `gem' from /Users/MY_USER/.rvm/gems/ruby-2.5.0/bin/bundle:25:in `<main>' from /Users/MY_USER/.rvm/gems/ruby-2.5.0/bin/ruby_executable_hooks:24:in `eval' from /Users/MY_USER/.rvm/gems/ruby-2.5.0/bin/ruby_executable_hooks:24:in `<main>'
当我bundle install在 mac 本身的终端中执行命令时,该命令按预期工作。
我的 Jenkins 命令如下所示:
export PATH="/usr/local/bin:$PATH"
export PATH="$HOME/.fastlane/bin:$PATH"
export PATH="$HOME/.rvm/bin:$PATH"
export PATH="$HOME/.rvm/bin/rvm:$PATH"
export PATH="$HOME/.rvm/gems/ruby-2.5.0:$PATH"
export PATH="$HOME/.rvm/gems/ruby-2.5.0/bin:$PATH"
bundle install
bundle exec fastlane beta
Run Code Online (Sandbox Code Playgroud)
我还尝试了命令的完整路径:$HOME/.rvm/gems/ruby-2.5.0/bin/bundle install …
这是 fastlane 在控制台中打印的内容:
[10:25:55]:无法找到任何 .xccoverage 文件。 [10:25:55]:确保您已在方案设置中启用“收集代码覆盖率”设置。 [10:25:55]:或者,您可以提供 .xccoverage 文件的完整路径。
如何强制它提供.xccoverage文件的完整路径?
我知道这是一个已知问题,并且尝试了几次答案,但这次我发现我觉得很奇怪的情况。日志告诉可怕的错误 65以及errSecInternalComponent何时对第一个 Pod 进行代码签名。
bundle exec fastlane appstore,它失败security unlock-keychain在构建之前,我已将命令包含在 shell 脚本中。
捆绑更新 导出 FASTLANE_DISABLE_COLORS=1 出口APP_IDENTIFIER=com.example.MyApp security unlock-keychain -p topsecret ~/Library/Keychains/codesign.keychain && bundle exec fastlane appstore
我也尝试过其他巫术,比如用钥匙扣做其他魔法
当直接在 CI 服务器控制台(或通过远程桌面)上运行时,它可以完美运行,不会提示输入用户密码等。我想知道有什么区别?
Fastlane 版本是2.106.0(最新)。
执行 Embed Pods Frameworks 时,构建会像其他用户一样失败:
? 运行脚本'[CP] Embed Pods Frameworks' ** 存档失败 ** 以下构建命令失败: PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks /Users/ci/Library/Developer/Xcode/DerivedData/BackOffice-gprttmucbsbjiifnxdulcnwierfb/Build/Intermediates.noindex/ArchiveIntermediates/BackOffice_AppStore/IntermediateBuildFilesPath/BackOffice.build/Release. /Script-7E4F6707694226143D2E7E0B.sh (1 …
运行 fastlane scan 来运行一个非常简单的单元测试。当我在单元测试中强制出错时,它失败了。当我“强制通过”测试时,它成功了。所以整体的成功/失败是有效的。但是,它似乎将结果报告为在终端中以及当我将结果输出到 slack 时的测试次数为零。
Xcode 可以正常运行测试并正确报告结果。
fastfile 脚本如下:
run_tests(
workspace: "xxx.xcworkspace",
scheme: "UnitTests",
device: "iPhone 8",
clean: true,
slack_url: "xxx",
slack_channel: "#xxx-developers"
)
Run Code Online (Sandbox Code Playgroud)
现有解决方案
在问我的问题之前,我已经广泛搜索了 SO 和 Github。现有主题都没有为我们的设置提供任何可行的解决方案。
配置
我们在远程 macOS 机器上配置了 Jenkins + Fastlane。Fastlane 匹配应该通过 SSH 从专用存储库获取签名凭据(证书 + 配置文件)。
问题
SSH 连接失败(挂起)。詹金斯控制台输出:
INFO [2019-04-09 14:09:29.05]: Cloning remote git repo...
INFO [2019-04-09 14:09:29.05]: If cloning the repo takes too long, you can use the `clone_branch_directly` option in match.
INFO [2019-04-09 14:09:29.05]: [36m$ git clone ssh://git@xxx.xx.x.xxx:xxxx/cert/ios-certificates-profiles.git /var/folders/_redacted_[0m
INFO [2019-04-09 14:09:29.07]: ? [35mCloning into '/var/folders/_redacted_'...[0m
INFO [2019-04-09 14:09:29.19]: ? [35mThe authenticity of host '[xxx.xx.x.xxx:xxxx]:xxxx ([xxx.xx.x.xxx:xxxx]:xxxx)' can't be established.[0m
INFO [2019-04-09 14:09:29.19]: ? [35mRSA key fingerprint …Run Code Online (Sandbox Code Playgroud) 是否可以(如果可以,如何)将环境变量从运行 fastlane 的脚本传递到 Xcode 运行脚本阶段?
我的最终目标是在运行脚本阶段读取当前的 git 分支名称。我们的 CI 由 Team Foundation Server 运行,它执行git checkout显式提交,而不是分支,因此当前分支始终显示为HEAD.
TFS -> fastlane -> gym -> xcodebuild -> script that needs the branch
Run Code Online (Sandbox Code Playgroud)
可以仅通过 TFS 设置的环境变量获取触发构建的分支。我的计划是将该值归入 Xcode 脚本以完成我需要的操作。
如果我理解正确的话,我宁愿不使用它,因为它将所有环境变量传递给构建过程。
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
Run Code Online (Sandbox Code Playgroud) 我已经将我的 React Native 应用程序升级到 0.59,现在当我尝试使用 AppCenter 或 CLI 归档我的应用程序时,我有一个错误代码 65 没有任何解释问题的消息......
当我直接从 Xcode 构建时
Xcode 版本:10.2.1 反应本机:0.59
Strip /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/InstallationBuildProductsLocation/Applications/FrenchFounders.app/FrenchFounders
cd /Users/vsts/agent/2.153.2/work/1/s/ios
export PATH="/Applications/Xcode_10.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode_10.2.1.app/Contents/Developer/usr/bin:/Library/Frameworks/Mono.framework/Versions/4/bin:/Users/vsts/.nvm/versions/node/v8.16.0/bin:/usr/local/lib/ruby/gems/2.6.0/bin:/usr/local/opt/ruby/bin:/usr/local/opt/curl/bin:/usr/local/bin:/usr/local/sbin:/Users/vsts/bin:/Users/vsts/.yarn/bin:/usr/local/go/bin:/Users/vsts/Library/Android/sdk/tools:/Users/vsts/Library/Android/sdk/platform-tools:/Users/vsts/Library/Android/sdk/ndk-bundle:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/Users/vsts/.azcopy"
/Applications/Xcode_10.2.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/InstallationBuildProductsLocation/Applications/FrenchFounders.app/FrenchFounders
SetOwnerAndGroup vsts:staff /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/InstallationBuildProductsLocation/Applications/FrenchFounders.app
cd /Users/vsts/agent/2.153.2/work/1/s/ios
export PATH="/Applications/Xcode_10.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode_10.2.1.app/Contents/Developer/usr/bin:/Library/Frameworks/Mono.framework/Versions/4/bin:/Users/vsts/.nvm/versions/node/v8.16.0/bin:/usr/local/lib/ruby/gems/2.6.0/bin:/usr/local/opt/ruby/bin:/usr/local/opt/curl/bin:/usr/local/bin:/usr/local/sbin:/Users/vsts/bin:/Users/vsts/.yarn/bin:/usr/local/go/bin:/Users/vsts/Library/Android/sdk/tools:/Users/vsts/Library/Android/sdk/platform-tools:/Users/vsts/Library/Android/sdk/ndk-bundle:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/Users/vsts/.azcopy"
/usr/sbin/chown -RH vsts:staff /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/InstallationBuildProductsLocation/Applications/FrenchFounders.app
SetMode u+w,go-w,a+rX /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/InstallationBuildProductsLocation/Applications/FrenchFounders.app
cd /Users/vsts/agent/2.153.2/work/1/s/ios
export PATH="/Applications/Xcode_10.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode_10.2.1.app/Contents/Developer/usr/bin:/Library/Frameworks/Mono.framework/Versions/4/bin:/Users/vsts/.nvm/versions/node/v8.16.0/bin:/usr/local/lib/ruby/gems/2.6.0/bin:/usr/local/opt/ruby/bin:/usr/local/opt/curl/bin:/usr/local/bin:/usr/local/sbin:/Users/vsts/bin:/Users/vsts/.yarn/bin:/usr/local/go/bin:/Users/vsts/Library/Android/sdk/tools:/Users/vsts/Library/Android/sdk/platform-tools:/Users/vsts/Library/Android/sdk/ndk-bundle:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/Users/vsts/.azcopy"
/bin/chmod -RH u+w,go-w,a+rX /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/InstallationBuildProductsLocation/Applications/FrenchFounders.app
Validate /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/InstallationBuildProductsLocation/Applications/FrenchFounders.app
cd /Users/vsts/agent/2.153.2/work/1/s/ios
export PATH="/Applications/Xcode_10.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode_10.2.1.app/Contents/Developer/usr/bin:/Library/Frameworks/Mono.framework/Versions/4/bin:/Users/vsts/.nvm/versions/node/v8.16.0/bin:/usr/local/lib/ruby/gems/2.6.0/bin:/usr/local/opt/ruby/bin:/usr/local/opt/curl/bin:/usr/local/bin:/usr/local/sbin:/Users/vsts/bin:/Users/vsts/.yarn/bin:/usr/local/go/bin:/Users/vsts/Library/Android/sdk/tools:/Users/vsts/Library/Android/sdk/platform-tools:/Users/vsts/Library/Android/sdk/ndk-bundle:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/Users/vsts/.azcopy"
export PRODUCT_TYPE=com.apple.product-type.application
builtin-validationUtility /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/InstallationBuildProductsLocation/Applications/FrenchFounders.app
Touch /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/BuildProductsPath/Release-iphoneos/FrenchFounders.app.dSYM
cd /Users/vsts/agent/2.153.2/work/1/s/ios
export PATH="/Applications/Xcode_10.2.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode_10.2.1.app/Contents/Developer/usr/bin:/Library/Frameworks/Mono.framework/Versions/4/bin:/Users/vsts/.nvm/versions/node/v8.16.0/bin:/usr/local/lib/ruby/gems/2.6.0/bin:/usr/local/opt/ruby/bin:/usr/local/opt/curl/bin:/usr/local/bin:/usr/local/sbin:/Users/vsts/bin:/Users/vsts/.yarn/bin:/usr/local/go/bin:/Users/vsts/Library/Android/sdk/tools:/Users/vsts/Library/Android/sdk/platform-tools:/Users/vsts/Library/Android/sdk/ndk-bundle:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/Users/vsts/.azcopy"
/usr/bin/touch -c /Users/vsts/Library/Developer/Xcode/DerivedData/FrenchFounders-gecxqcdasodzgbfdfonlrrdxmrql/Build/Intermediates.noindex/ArchiveIntermediates/FrenchFounders/BuildProductsPath/Release-iphoneos/FrenchFounders.app.dSYM
** ARCHIVE FAILED **
##[error]Error: /usr/bin/xcodebuild failed with return code: 65
Run Code Online (Sandbox Code Playgroud)
这是我的 AppCenter 构建的完整日志: …
fastlane ×10
ios ×6
xcode ×6
git ×2
jenkins ×2
xcodebuild ×2
bitrise ×1
bundler ×1
circleci ×1
match ×1
react-native ×1
ruby ×1
ssh ×1
tfs ×1
unit-testing ×1