Xcode 服务器:关键目标错误,预期上传,找到导出

Xcode Server: error for key destination, expected upload, found export

我正在使用 Xcode 11 和 Xcode 服务器来尝试构建我的应用并将其上传到 TestFlight。我试图使用自定义 ExportOptions.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>method</key>
    <string>app-store</string>
    <key>teamID</key>
    <string>YOUR_TEN_CHARACTER_TEAM_ID</string>
    <key>destination</key>
    <string>upload</string>
</dict>
</plist>

但随后我收到一条错误消息,指出 "Upload" 服务器不支持 Xcode。在线建议将其保留为 "Export" 并使用它在 post-集成脚本中上传:

altool --upload-app -f $XCS_PRODUCT -u <username> -p <app-specific password>

所以我这样做了,并且尝试将机器人设置为使用:

而不是自定义 plist。但是现在我的存档步骤在到达触发器之前失败并出现以下错误:

Build Service Error: exportArchive: exportOptionsPlist error for key 'destination': expected one of {upload}, but found export

我试过移除触发器以查看它是否导致了问题,但事实并非如此。现在我的机器人只是试图存档和导出项目,我收到关于目标应该上传的错误...这是不支持的。

存档应用程序并从 "Distribute app" 手动上传工作正常。

如有任何帮助,我们将不胜感激。我希望在不添加更多工具的情况下做到这一点,因为它本身应该是可能的。

如评论中所述,这可能是 Xcode 服务器中的错误。

由于 Xcode 项目已经创建了一个存档,一个可行的选择是禁用 bot 中的导出,并使用 Post-集成脚本触发器导出 ipa 文件。这可以上传到 App Store Connect。

脚本如下所示:

#!/bin/sh

/usr/bin/xcodebuild -exportArchive -archivePath ${XCS_ARCHIVE} -exportPath "${XCS_DERIVED_DATA_DIR}" -exportOptionsPlist ${XCS_SOURCE_DIR}/someconfdir/export.plist

/usr/bin/xcrun altool --upload-app --type ios --file "${XCS_DERIVED_DATA_DIR}/appname.ipa" --username "xxx@y.z" --password "xxx"

您需要一种方法让 Xcode 服务器可以访问 export.plist。一种选择是将其与源代码一起检入,因此上面的脚本使用 XCS_SOURCE_DIR 变量在某个配置文件夹中找到它。

它应该是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>teamID</key>
    <string>xxx</string>
    <key>method</key>
    <string>app-store</string>
    <key>uploadSymbols</key>
    <true/>
    <key>provisioningProfiles</key>
    <dict>
        <key>bundleid</key>
        <string>profilename</string>
    </dict>
</dict>
</plist>