在Xcode Cloud上为React Native+Expo项目设置CI/CD
注:本文为AI生成,但由于可以解决问题,因此记录为备份
关于在本地使用React Native + Expo写的项目iOS端如何编译的可能有用的AI回答文件.
在 Xcode Cloud 上为 React Native + Expo 项目设置 CI/CD
将 React Native + Expo 项目集成到 Xcode Cloud 的持续集成与持续交付 (CI/CD) 流程中是完全可行的。其核心在于配置自定义构建脚本,以告知 Xcode Cloud 的构建环境如何处理 JavaScript 依赖(如 npm/yarn)和原生 iOS 依赖(CocoaPods)。
通过以下步骤,您可以实现从代码提交到 TestFlight 自动分发的完整自动化流程。
前提条件
在开始之前,请确保您已准备好以下各项:
- Apple Developer Program 成员资格:访问 Xcode Cloud 是付费开发者账户的权益。
- 项目源码托管:您的项目代码必须托管在 Xcode Cloud 支持的 Git 仓库服务上,如 GitHub, Bitbucket, 或 GitLab。
- Xcode:确保您的 Mac 上安装了最新版本的 Xcode。
- 原生 iOS 项目:Xcode Cloud 直接构建的是原生
.xcodeproj或.xcworkspace文件。因此,您需要将 Expo 项目“预构建”以生成ios目录。
核心理念:使用自定义脚本搭建桥梁
Xcode Cloud 的构建环境是为原生 Apple 开发而设计的,默认情况下,它并不知道如何处理 Node.js、npm/yarn 包或 CocoaPods。为了解决这个问题,我们需要创建一个自定义构建脚本。当 Xcode Cloud 克隆您的代码仓库后,它会自动执行这个脚本来安装所有必要的非原生依赖,为后续的原生 Xcode 构建做好准备。
分步指南
第 1 步:生成原生 iOS 项目
如果您的 Expo 项目仍处于“托管工作流”(Managed Workflow)下,即项目根目录中没有 ios 和 android 文件夹,您需要先生成原生项目文件。
在您的项目根目录下打开终端,运行以下命令:
1 | npx expo prebuild --platform ios |
此命令会根据您的 app.json / app.config.js 配置生成一个 ios 文件夹,其中包含了 Xcode 所需的 .xcworkspace 文件。
重要提示:运行 prebuild 是一项重大更改。请确保在执行前已提交所有代码,并建议在一个新的分支上进行此操作。命令执行后,将新生成的 ios 目录、以及对 .gitignore 等文件的修改一并提交到您的 Git 仓库。
第 2 步:创建自定义构建脚本
这是整个流程中最关键的一步。Xcode Cloud 会在特定时机自动查找并执行名为 ci_scripts 文件夹下的特定脚本。我们将使用 ci_post_clone.sh 脚本,它在 Xcode Cloud 克隆完您的仓库后立即执行。
创建目录:在您的项目根目录(与
.xcodeproj文件同级)下创建一个名为ci_scripts的文件夹。创建脚本文件:在
ci_scripts文件夹内,创建一个新文件,并将其命名为ci_post_clone.sh。编写脚本内容:将以下内容粘贴到
ci_post_clone.sh文件中。此脚本将安装 Homebrew(如果不存在)、Node.js、Yarn,并安装所有 JavaScript 和 CocoaPods 依赖。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 打印当前所在阶段
echo "🚀 Stage: Post-clone is running..."
# 设置 Homebrew 路径并安装(适用于 Apple Silicon 和 Intel Mac 的通用设置)
if [ -d "/opt/homebrew" ]; then
# Apple Silicon
export HOMEBREW_PREFIX="/opt/homebrew"
else
# Intel
export HOMEBREW_PREFIX="/usr/local"
fi
export PATH="$HOMEBREW_PREFIX/bin:$PATH"
# 安装 Node.js 和 Yarn
echo "🍺 Installing Node.js and Yarn via Homebrew..."
brew install node yarn
# 打印 Node 和 Yarn 版本以供调试
echo "Node version: $(node -v)"
echo "Yarn version: $(yarn -v)"
# 安装 JavaScript 依赖
# CI_PRIMARY_REPOSITORY_PATH 是 Xcode Cloud 指向项目根目录的环境变量
echo "📦 Installing JavaScript dependencies..."
cd $CI_PRIMARY_REPOSITORY_PATH
yarn install
# 安装 CocoaPods 依赖
echo "🍫 Installing CocoaPods dependencies..."
cd $CI_PRIMARY_REPOSITORY_PATH/ios
pod install
echo "✅ Stage: Post-clone finished successfully."授予执行权限:该脚本文件必须具有可执行权限。在终端中运行以下命令:
1
chmod +x ci_scripts/ci_post_clone.sh
提交脚本:将
ci_scripts文件夹及其中的ci_post_clone.sh文件提交到您的 Git 仓库。
第 3 步:在 Xcode Cloud 中配置工作流
现在,您的项目已经准备就绪。接下来是在 Xcode 中设置 Xcode Cloud。
打开项目:用 Xcode 打开您项目中的
ios/*.xcworkspace文件。打开 Xcode Cloud 标签:在 Xcode 的左侧导航栏中,选择“Report Navigator”(报告导航器,图标像一个对话气泡),然后选择顶部的 “Cloud” 标签。
开始配置:Xcode 可能会提示您“Set up Xcode Cloud”。点击并按照向导进行操作。
- 授权:授权 Xcode 访问您的 Git 仓库。
- 创建工作流 (Workflow):Xcode 会分析您的项目并建议一个默认工作流。
编辑工作流配置:
- 常规 (General):为您的工作流命名,并选择产品(您的 App)。
- 环境 (Environment):选择最新的稳定版 Xcode 和 macOS。可以根据需要设置环境变量。
- 开始条件 (Start Conditions):配置触发构建的条件。例如,您可以设置为当代码推送到
main或develop分支时自动开始构建。 - 操作 (Actions):
- Archive:这是核心操作。确保选择正确的平台(iOS)和 Scheme。Xcode Cloud 会自动发现并使用您的
ci_post_clone.sh脚本,无需在此处额外配置。
- Archive:这是核心操作。确保选择正确的平台(iOS)和 Scheme。Xcode Cloud 会自动发现并使用您的
- 部署后操作 (Post-Actions):
- TestFlight (Internal/External Testing):配置此项可实现构建成功后自动将 App 上传到 App Store Connect 并分发给内部或外部测试人员。
保存并开始第一次构建:保存您的工作流配置。您可以手动触发第一次构建,或通过向您配置的启动分支(如
main)推送一次提交来触发。
常见问题与最佳实践
- 构建缓慢:由于 Xcode Cloud 的构建环境是临时的,每次构建都需要重新通过 Homebrew 安装 Node.js 和其他依赖,这会比
eas build或本地构建慢。这是使用 Xcode Cloud 处理 React Native 项目的正常现象。 - 管理密钥/环境变量:如果您的项目需要 API 密钥或其他敏感信息,请不要硬编码在代码中。应在 Xcode Cloud 工作流配置的“Environment”部分,将它们添加为秘密 (Secret) 环境变量。选中 “Secret” 复选框可防止其值在构建日志中暴露。
- 调试构建失败:如果构建失败,请仔细查看 Xcode Cloud 提供的构建日志。日志会详细记录
ci_post_clone.sh脚本的每一步输出,通常可以从中找到错误原因,例如依赖安装失败或脚本语法错误。 - 选择 Xcode Cloud 还是 EAS Build?
- EAS Build:由 Expo 团队提供,是为 React Native 和 Expo 项目量身定制的 CI/CD 服务。它通常开箱即用,配置更简单,构建速度更快。
- Xcode Cloud:是苹果官方的 CI/CD 方案。如果您的团队已经深度集成在苹果生态中,或者您的项目除了 React Native App 外还包含其他原生目标(如 watchOS App、小组件等),或者公司政策要求使用第一方工具,那么 Xcode Cloud 是一个绝佳的选择。
通过以上配置,您的 React Native + Expo 项目就可以享受苹果原生 CI/CD 带来的便利,实现高效、可靠的自动化构建与分发。
