为什么非要用Mac服务器?
很多团队最初可能和我一样,试图在Linux 服务器上实现iOS打包,但最终会发现这条路走不通。根本原因在于:iOS打包依赖Xcode及其相关工具链(如xcodebuild),而这些工具只能在macOS系统上运行。网上大部分关于Jenkins + iOS的教程,也都是基于Mac服务器环境的。因此,如果你还在Linux上折腾iOS打包,建议尽快转向Mac环境。
环境与前提
服务器:macOS
项目依赖:CocoaPods
目标:通过Jenkins实现iOS项目自动拉取代码、更新依赖、编译并生成ipa包
一、Jenkins安装(macOS)
在Mac上安装Jenkins非常简便,推荐使用Homebrew:
brew install jenkins
安装完成后,根据提示启动即可。例如临时测试可运行:
jenkins
启动后访问 http://localhost:8080 即可进行初始化配置。由于安装不是本文重点,具体步骤可参考其他通用教程。
二、Jenkins任务配置(以"Shanlincaifu"项目为例)
- 创建自由风格项目
任务名称:例如"Shanlincaifu"
勾选 "丢弃旧的构建",设置保留策略(例如:保持构建天数3天,最大保留个数30)
- 源码管理
选择 Subversion(SVN),填写项目仓库地址。如果Jenkins未授权,会在错误提示处提供填写凭证(用户名/密码)的入口。
- 添加Shell脚本(用于CocoaPods依赖更新)
由于项目使用CocoaPods,需在编译前更新Pod依赖。
添加构建步骤 → Execute Shell
在命令框中输入(请根据实际路径修改):
#!/bin/bash
cd /Users/xieqiang/.jenkins/jobs/Shanlincaifu/workspace
pod update --verbose --no-repo-update
注意:该步骤必须放在"源码拉取"之后,"Xcode编译"之前。可通过拖拽调整顺序。
- 添加Xcode构建步骤
添加构建步骤 → Xcode
(1)General build settings
Target:可不填(尤其适用于多Target项目)
Clean before build?:Yes
勾选 Pack application and build .ipa?
.ipa filename pattern:自定义输出名称,如 Shanlincaifu-${BUILD_NUMBER}
Output directory:设置ipa输出目录,如 /Users/xieqiang/build_output/
(2)Code signing & OS X keychain options
Code Signing Identity:填写对应的签名标识,可在Xcode项目的 Build Settings → Code Signing → Code Signing Identity 中查看。若未配置,需提前申请证书与描述文件。
Embedded Profile:填写描述文件路径,如 /Users/xieqiang/shanlincaifu/cer/Shanlincaifu_Development.mobileprovision
(3)Advanced Xcode build options
Xcode Schema File:对于CocoaPods工程,需指定主项目的Schema。可通过以下命令查看:
xcodebuild -list -workspace ShanLinCaiFu.xcworkspace
本例填写:ShanLinCaiFu
如果是非CocoaPods项目,可使用:
xcodebuild -list -project ShanLinCaiFu.xcodeproj
SYMROOT:设置编译输出目录,如 /Users/xieqiang/.jenkins/jobs/Shanlincaifu/workspace/build
Custom xcodebuild arguments:添加参数
CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist
这是为了解决Xcode打包时签名失败的一个常见问题(据称为xcodebuild的bug),也可在Xcode项目文件中设置。
Xcode Workspace File:填写Workspace名称(如 ShanLinCaiFu)。若为普通项目,则在 Xcode Project File 中填写 .xcodeproj 名称。
三、开始构建
完成上述配置后,即可执行构建。Jenkins的构建日志非常详细,若遇到问题,可优先查看日志输出,定位错误环节。
总结:
- 环境选择:iOS打包必须在macOS上进行,勿在Linux上浪费时间。
- 依赖处理:使用CocoaPods的项目,需在Xcode编译前通过Shell脚本执行 pod update。
- 签名配置:确保证书与描述文件已正确配置,并在Jenkins中填写对应路径。
- Schema指定:多Target或CocoaPods工程需明确指定主Schema。
- 签名Bug处理:通过 CODE_SIGN_RESOURCE_RULES_PATH 参数避免签名失败。