我们有一个iOS自动构建系统,它随机地使某些项目的协同设置失败。
构建系统使用xcodebuild(后跟xcrun)来构建和打包应用程序。我们在多个应用中使用此流程。我们运行它的构建机器有多个分发签名证书,并运行Xcode 5.1.1(5B1008)和10.9.4。我们已经使用该系统大约两年了,并且构建工作正常。当它们不起作用时,通常会有一个明确的xcodebuild错误消息。但是现在我们正在xcodebuild上为我们的两个应用程序发出随机失败的codesign调用。
xcodebuild命令如下:
xcodebuild -verbose -project ./src_dir/TechApp.xcodeproj ONLY_ACTIVE_ARCH=NO ARCHS="armv7 armv7s arm64" -scheme ${SCHEME} QA PROVISIONING_PROFILE=${PROFILE} CODE_SIGN_IDENTITY=${IDENTITY} CONFIGURATION_BUILD_DIR=./bld_dir/builds/QA build
并且,经过大量的xcodebuild编译语句后,它失败并出现以下内容:
CodeSign /Users/bldUser/buildScripts/archive_dir/1404933111/bld/bld_dir/builds/QA/Tech\ App.app
cd /Users/bldUser/buildScripts/archive_dir/1404933111/bld/src_dir
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin"
Using code signing identity "iPhone Distribution: Build Certificate" and provisioning profile "BuildWildcard" (C137C14D-630F-4D67-BD2B-2FD4AB4F2BA4)
/usr/bin/codesign --force --sign 637514541007B62BCEA94ACC41A98A0E1391C3D4 --resource-rules=/Users/bldUser/buildScripts/archive_dir/1404933111/bld/bld_dir/builds/QA/Tech\ App.app/ResourceRules.plist --entitlements /Users/bldUser/buildScripts/archive_dir/1404933111/bld/build/TechApp.build/Debug-iphoneos/TechApp\ QA.build/Tech\ App.xcent /Users/bldUser/buildScripts/archive_dir/1404933111/bld/bld_dir/builds/QA/Tech\ App.app
** BUILD FAILED **
失败的项目是大型应用程序......并且它们附加了多个依赖项目(我认为可能是依赖项目导致了编码的随机失败,但我'我不确定。)
事情是,这个声明随机失败。如果我再次运行它,它将正常工作。所以这是随机性让我感到困惑。并且确实没有任何错误消息。它只是说“建立失败”。有些事情我试图让它起作用:
OTHER_CODE_SIGN_FLAGS=--verbose=4 --continue --deep
,以查看这些参数的任何组合是否“有用”。这是基于this link中描述的问题,因为它似乎与我们失败的特定项目的失败条件相匹配。这篇文章让我最感兴趣,因为看起来这个问题可能与OS +构建环境有关+这个项目失败的事实附加了很多子项目。鉴于它是随机的,我怀疑它是(1)存在一些未设置的代码签名值的情况,因此随机选择一个;或(2)xcode或最近才引入的操作系统的一些问题。
任何关于尝试什么的想法或想法都会非常感激。
一次更新: 这在通过Xcode运行时工作得很好。所以这是针对这些项目的xcodebuild特有的。通过Xcode编译时:它可以100%的时间工作。通过xcodebuild编译时:它的工作时间为25-50%。所以我真的希望xcodebuild命令中缺少一些东西,这不需要实际的项目更改(因为它直接通过Xcode编译时有效)。
更新trojanfoe的问题: 空间可能存在问题。这是其中一个项目的实际xcodebuild调用:
xcodebuild -verbose -project /Users/bldUser/buildScripts/archive_dir/1404904225/bld/src_dir/MyTechApp.xcodeproj ONLY_ACTIVE_ARCH="NO" ARCHS="armv7 armv7s arm64" -scheme "TechApp Dev" PROVISIONING_PROFILE="" CODE_SIGN_IDENTITY="iPhone Distribution: Build Certificate" CONFIGURATION_BUILD_DIR="/Users/bldUser/buildScripts/archive_dir/1404897462/bld/bld_dir/builds/Dev" build
运行上面的命令后,有(很多)构建命令(有很多很多警告,但没有错误)。它最终停在以下位置:
CodeSign /Users/bldUser/buildScripts/archive_dir/1404897462/bld/bld_dir/builds/Dev/Tech\ App.app
cd /Users/bldUser/buildScripts/archive_dir/1404904225/bld/src_dir
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin"
Using code signing identity "iPhone Distribution: Build Certificate" and provisioning profile "BuildWildcard" (C137C14D-630F-4D67-BD2B-2FD4AB4F2BA4)
/usr/bin/codesign --force --sign 637514541007B62BCEA94ACC41A98A0E1391C3D4 --resource-rules=/Users/bldUser/buildScripts/archive_dir/1404897462/bld/bld_dir/builds/Dev/Tech\ App.app/ResourceRules.plist --entitlements /Users/bldUser/buildScripts/archive_dir/1404904225/bld/build/MyTechApp.build/Debug-iphoneos/TechApp\ Dev.build/Tech\ App.xcent /Users/bldUser/buildScripts/archive_dir/1404897462/bld/bld_dir/builds/Dev/Tech\ App.app
** BUILD FAILED **
所有“cd”命令和“export”命令都作为codesign命令的一部分运行。就xcodebuild语句而言,我们将配置文件留空,以便它获取默认值 - 尽管即使我指定了特定的配置文件,它仍然会失败(并且从上面的代码符号开始,它正在拾取正确的配置文件)。以上还规定了该方案。这通常是从bash脚本运行的,它将遍历一系列方案,并通过xcodebuild为每个方案生成构建。正如您在上面所看到的,方案和项目以及产品名称中都有空格,所以如果这在某种程度上是一个问题我也不会感到惊讶。我不确定为什么它会工作一次而不是另一次,但我会尝试去除空格。 src_dir和funky archive_dir数字是由我们的构建系统创建的目录,因此这些文件都被检出到src_dir位置。