使用 CI 构建 React Native 项目

网上已经有很多教程了,我这边也整理一份我跑通的流程。

iOS 构建部分

首先参照 官方文档 调整代码

其中文档中需要在 Xcode 下构建的部分,使用命令行来操作就是:

xcodebuild archive -project ios/$PROJECT.xcodeproj
                   -scheme $PROJECT
                   -archivePath ios/build/$PROJECT.xcarchive
xcodebuild -exportArchive
           -archivePath ios/build/$PROJECT.xcarchive
           -exportPath ios/build/
           -exportOptionsPlist ios/ExportOptions.plist
           -allowProvisioningUpdates

要点:

  1. 绝大多数构建参数都可以用 Xcode 打开项目调整。
  2. ExportOptions.plist 在使用 Xcode 手动 Export 一次之后会自动生成。
  3. 在 archive 阶段时配置环境变量 RCT_NO_LAUNCH_PACKAGER=1 会跳过调用构建服务器的步骤。
  4. 因为 project.xcworkspace 目录是会被 React Native 脚手架 gitignore 的,所以网上很多基于 -workspace ios/$PROJECT.xcodeproj/project.xcworkspace 都是不能直接用 CI runner 跑的。使用 -project ios/$PROJECT.xcodeproj 可以解决。
  5. 注意不要丢失 ios/$PROJECT.xcodeproj/xcshareddata/xcschemes/$PROJECT.xcscheme 文件,该文件很容易在 Xcode 配置时丢失或转入被 gitignore 的 xcuserdata 目录。

Android 构建部分

Android 构建方面相对简单,参照 官方文档 签名即可

我不愿意在 CI 中改变当前目录,所以我的命令行是:

android/gradlew assembleRelease --project-dir android

要点:

  1. 手机跑不了未签名的 Release 包,而 Debug 包一定要连接构建服务器。
  2. GitLab Runner 在使用 shell 模式下不会加载我的 .zshrc/.zprofile,所以 ANDROID_HOME 这种环境变量请存在 ~/.profile 中。
  3. keystore 文件是会被 gitignore 的,存在仓库里也不安全,在部署 CI Runner 的时候记得把 keystore 文件拷过去。