繁体   English   中英

Xcode 带有 CocoaPods shell 脚本的云项目在本地构建但在云上失败

[英]Xcode Cloud project with CocoaPods shell script builds locally but fails on cloud

我目前正在测试 Xcode Cloud 作为 Apple 私人测试版计划的成员,并在尝试在云上为我的项目存档/构建(任何操作)时遇到问题。

该项目是一个相当基本的 SwiftUI 应用程序,具有 CocoaPods 依赖项。 我按照Apple 描述的步骤将 CocoaPods 集成到我的项目中,只需将我的 Pods 目录提交到 GitHub。但是,我在云上遇到的每个尝试操作都会出现构建错误:

命令 PhaseScriptExecution 失败,退出代码非零

以下是 ASC 日志供参考:

Xcode 云错误日志

这很奇怪,因为同一个项目在我的本地机器上成功构建和归档。 我在工作流编辑器中使用了与本地版本 Xcode 相同的 macOS 和 Xcode 版本。

我该如何解决这个错误?

自定义 shell 脚本限制

长话短说

Apple 通过仅启用 shell 脚本作为ci_scripts文件夹中的ci_post_clone.shci_pre_xcodebuild.shci_post_xcodebuild.sh的一部分运行来锁定其托管基础设施的安全性。 您的 Pods 项目在此文件夹外有一个自定义脚本 shell,它不是由这些 CI 脚本之一触发的,因此没有运行权限。

此特定问题的解决方案是:

  1. (技术上)重构您的构建脚本阶段以将 shell 脚本文件内联到运行脚本中。
  2. (推荐,但并非总是可行)如果可用,请使用 CocoaPod 的 Swift Package 版本。
  3. (解决方法)将 CocoaPod 降级到没有外部 shell 脚本的版本。

参考

自定义您的高级 Xcode 云工作流

如果您的脚本似乎没有按预期运行,请仔细检查您是否已正确命名它并将其放在项目旁边的ci_scripts文件夹中。

...

最后,应该注意的是,在测试操作中,多个环境用于构建和运行测试。 默认情况下,只有用于构建测试的环境才会将源代码克隆到其中。 运行测试的环境不会将源代码克隆到其中 他们只会在其上使用 ci_scripts 文件夹。 因此,克隆后脚本不会在这些环境中运行,您的自定义脚本及其任何依赖项(例如其他 shell 脚本和小工具)必须完全包含在 ci_scripts 文件夹中。

构建脚本阶段允许在构建过程中运行用户定义的代码,但是,我们只能在此处运行内联自定义脚本。 如前所述,外部 shell 脚本具有受限权限。 移动到ci_scripts后运行外部 shell 脚本文件不起作用。 例如"${PODS_ROOT}/../ci_scripts/AppCenter-xcframeworks.sh"

尽管此处不相关,但请注意,测试项目的环境不会将源代码克隆到其中

对于引用自定义脚本文件的测试或其他环境,我们需要在ci_scripts文件夹中存储额外的脚本,以确保操作可以访问它。 Apple 只允许运行 3 个脚本,对应于构建的 3 个阶段:

  1. 将源代码克隆到构建环境后。
  2. 在运行xcodebuild之前。
  3. 运行xcodebuild后。

其他 shell 脚本只能在从ci_scripts文件夹中的相应ci_post_clone.shci_pre_xcodebuild.shci_post_xcodebuild.sh文件委托后在这里运行。

解决方案 1

我的问题是在构建过程中运行外部 shell 脚本。 Apple 确实允许在 Xcode 云工作流中运行脚本构建阶段,但它们必须内联。 因此,作为构建阶段的一部分,我必须执行 4 个步骤来运行自定义 Pod shell 脚本:

  1. 重构您的Build Phases -> Run Script Phase脚本以内联 shell 脚本文件。
  2. 清除DerivedData后在本地检查项目构建。
  3. 将您的代码提交给 GitHub / VCS。
  4. 触发工作流。

Xcode Pods Shell 脚本重构 1

解决方案 2(推荐,但并非总是可行)

按照Apple 的文档添加 Swift Package 版本的 CocoaPod 作为依赖项。

解决方案 3(解决方法)

将您的 CocoaPod 降级到没有外部 shell 脚本的版本。

笔记

从使用 Xcode Cloud 解决自定义 shell 脚本构建阶段所需的工作量可以看出,我建议在特定的 CocoaPod 存储库上提出问题以从自定义 shell 脚本文件迁移。 这些步骤让使用 Xcode Cloud 非常痛苦。

随着 Xcode 云采用率的增长,个人 CocoaPods 完全有可能不再引用自定义 shell 脚本文件。 我没有看到 Apple 开放他们的基础设施来启用任意 shell 脚本执行,因为这是一个安全风险,老实说,其他 CI 提供商也应该被阻止。

我还可以看到像这些包含遗留 CocoaPods 依赖项的麻烦如何加速更多项目迁移到 SPM。 SPM 已经很流行,而且随着 Apple 确保一流的集成,SPM 可能会变得更流行。

免责声明: Xcode Cloud 处于内测阶段,因此如果放宽 shell 脚本权限,此问题可能会在未来的版本中得到解决...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM