Pra*_*tti 3 xcode ios xcode-cloud
我目前正在作为 Apple 私人测试版计划的成员测试 Xcode Cloud,并在尝试在云上为我的项目存档/构建(任何操作)时遇到问题。
该项目是一个相当基本的 SwiftUI 应用程序,具有 CocoaPods 依赖项。我已按照Apple 描述的步骤将 CocoaPods 集成到我的项目中,只需将我的 Pods 目录提交到 GitHub。但是,对于每次尝试的操作,我都会在云上收到构建错误:
命令 PhaseScriptExecution 失败,退出代码非零
这是ASC日志供参考:
这很奇怪,因为同一个项目在我的本地计算机上成功构建和存档。我在工作流程编辑器中使用了与本地 Xcode 版本相同的 macOS 和 Xcode 版本。
我该如何解决这个错误?
ci_post_clone.shApple 通过仅允许 shell 脚本作为或文件夹的一部分运行来锁定其托管基础设施的安全ci_pre_xcodebuild.sh性。您的 Pods 项目在此文件夹之外有一个自定义 shell 脚本,该脚本不是由这些 CI 脚本之一触发的,因此没有运行权限。ci_post_xcodebuild.shci_scripts
这个具体问题的解决方案是:
如果您的脚本似乎没有按您预期运行,请仔细检查您是否已正确命名它,并将其放置在
ci_scripts项目旁边的文件夹中。...
最后,应该注意的是,在测试操作中,会使用多个环境来构建和运行测试。默认情况下,只有用于构建测试的环境才会将源代码克隆到其中。运行测试的环境不会将源代码克隆到其中。他们只能使用 ci_scripts 文件夹。因此,克隆后脚本不会在这些环境中运行,并且您的自定义脚本及其任何依赖项(例如其他 shell 脚本和小工具)必须完全包含在 ci_scripts 文件夹中。
构建脚本阶段允许运行用户定义的代码作为构建过程的一部分,但是,我们只能在此处运行内联自定义脚本。正如所讨论的,外部 shell 脚本具有受限的权限。移动到后运行外部 shell 脚本文件ci_scripts不起作用。例如"${PODS_ROOT}/../ci_scripts/AppCenter-xcframeworks.sh"。
尽管与此处无关,但请注意,测试项目的环境不会将源代码克隆到其中。
对于引用自定义脚本文件的测试或其他环境,我们需要在ci_scripts文件夹内存储其他脚本以确保操作可以访问它。Apple 只允许运行 3 个脚本,对应于构建的 3 个阶段:
xcodebuild。xcodebuild。其他 shell 脚本只能在从文件夹中的相应ci_post_clone.sh,ci_pre_xcodebuild.sh或ci_post_xcodebuild.sh文件委派后在此处运行ci_scripts。
我的问题是在构建过程中运行外部 shell 脚本。Apple 确实允许在 Xcode Cloud 工作流程中运行脚本构建阶段,但它们必须内联。因此,作为构建阶段的一部分,我必须执行 4 个步骤来运行自定义 Pod shell 脚本:
DerivedData。按照Apple 文档添加 CocoaPod 的 Swift Package 版本作为依赖项。
将您的 CocoaPod 降级到没有外部 shell 脚本的版本。
从使用 Xcode Cloud 解决自定义 shell 脚本构建阶段所需的工作量可以看出,我建议在特定的 CocoaPod 存储库上提出问题,以迁移自定义 shell 脚本文件。这些步骤让使用 Xcode Cloud 变得非常痛苦。
随着 Xcode Cloud 采用率的增长,各个 CocoaPod 完全有可能不再引用自定义 shell 脚本文件。我不认为 Apple 会开放其基础设施来支持任意 shell 脚本执行,因为这是一个安全风险,而且说实话,其他 CI 提供商也应该避免这种情况。
我还可以看到像这些包含遗留 CocoaPods 依赖项的麻烦如何能够加速更多项目迁移到 SPM。SPM 已经很流行,而且随着 Apple 确保一流的集成,它可能会变得更加流行。
免责声明: Xcode Cloud 处于内测阶段,因此如果放宽 shell 脚本权限,这个问题可能会在未来版本中得到解决...