前言
本案例主要目的是实现iOS的打包发布并邮件通知功能,采用Jenkins+Git+Xcode+CocoaPods
,当然了还有一些不可或缺的插件; 部署的系统一般用macOS,各平台编译工具使然,毕竟若要多平台构建方便的话, Windows整个黑苹果不太合理.
环境搭建
(一) JDK安装相关
确保系统有安装JDK. 没有的话,那就只能去Oracle官网上去下了, 不过目前好像要注册账号了, 有点麻烦的样子.
此处就以以下版本为例
注意,JDK安装后,必须$ vim ~/.bash_profile
把jdk路径配置一下,然后$ source ~/.bash_profile
生效; 这样就不会再重启后导致jdk指令无效了,关于bash_profile不清楚可以参考profile、bash_profile、bashrc文件的作用与区别.
配置示例:
1 | # Setting PATH for JDK |
额外补充:
1.在终端输入 $ /usr/libexec/java_home
可以得到JAVA_HOME
的路径; 无效时,可试着先执行下$ source ~/.bash_profile
2.检查环境. 输入 echo $JAVA_HOME
得到配置的路径,说明配置完毕.无效时,可试着先执行下$ source ~/.bash_profile
3.注意是 $ java -version
而不是 $ java --version
(二) Jenkins安装相关
安装的方式有多种, 比如
1.可以在 Jenkins 的官网 下载最新的 war 包。下载完成后,打开终端,进入到 war 包所在目录,执行以下命令:
$ java -jar jenkins.war --httpPort=8080
2.可以终端直接执行
$ brew install jenkins
3.还有其他的,如在Docker中下载并运行Jenkins,等等
待Jenkins启动后,在浏览器页面输入以下地址: http://localhost:8080
,
这样就打开Jenkins管理页面了.
此处不管以何种方式安装jenkins, 安装完成后打开地址都会遇到一个问题, 如何进入操作主页面呢? 如http://localhost:8080
显示的重设初始密码的界面, 这个时候其实只要根据页面提示的路径拿到密码重设即可.
(三) 构建配置相关
步骤细节点可能会有多处, 可以参考下面的参考文章. 此处就不再敖述, 只记录一些容易入坑点.
1.关于插件问题
这个还是根据需求下载会比较好点, iOS打包并不一定必须Xcode插件,可以用脚本代替. 拉取代码Git插件,钥匙串、证书管理插件Keychain and Provisioning Profiles Management
,邮箱通知Extended E-mail Notification
插件等.
2.钥匙串和证书管理插件配置补充
插件Keychain and Provisioning Profiles Management
下载后重启jenkins. 可以在管理Jenkins面板找到
配置钥匙串时注意, 先找到登录钥匙串的位置. 实际上此钥匙串关联着Xcode编译项目所用的AppleId账号及密码,亦是Team、证书、描述文件编译通过的保障. 细节可参考下面参考文章的链接. 但是钥匙串路径可能会有不同, 隐藏文件下的可以用"cmd+shift+."
去查看.
上传钥匙串,默认存在login.keychain
中,而macOS升级到10.12后会存在login.keychain-db
,
这个时候需要拷贝出来修改后缀再上传,否则无法识别.
另外补充一点,建议把钥匙串、证书、描述文件以及打包导出配置plist文件统一拷贝放到一个相对安全且又可以访问到的文件夹下
3.参考文章部分可能年代久远了, 随着Xcode版本更替,有的指令并不适用, 比如下面的打包导出指令
xcrun -sdk iphoneos PackageApplication "./Release-iphoneos/${APP_NAME}.app" -o ~/"${IPANAME}"
工具包中并无PackageApplication
文件了,有的人提供方案从旧版本Xcode拷贝一个这样的文件到新Xcode里面去. 这个就不推荐去试了,很麻烦. 所以一般而言最新的iOS打包都是采用打包导出配置plist文件
, 注意archivePath后跟的路径要与xcodebuild archive
生成包文件路径一致
1 | echo "+++++++++++++++++archive+++++++++++++++++" |
变量exportFileConfig_PATH存放的路径即为导出配置plist文件路径.
1 | echo "+++++++++++++++++export+++++++++++++++++" |
plist配置文件其实可以由已往的手动打包后的文件夹里面拿来修改. 其中export_method项,可以根据打包类型进行相应设置。可选的值有:app-store
、ad-hoc
、development
、enterprise
4.使用cocoapods管理的项目, clean、build前先$ pod install
一下还是有必要的, 注意前面的一些编码格式配置还是加一下, 防止编码问题
1 | !/bin/bash -l |
5.特殊注意事项
(1) 当前连接的WiFi必须能到达远程代码仓库,否则代码无法更新
(2) 因使用shell脚本打包, 取版本号做ipa存放路径名, 版本更新时需要修改info.plist文件,而不是直接修改general,否则版本号获取不到,可能会导致后续无法成功打包上传
(3) 根据Xcode项目配置的签名方式不同,shell脚本需要做相应的调整.导出plist文件也要变更. 这里给出一个手动签名和自动签名比较图
构建错误日志
错误一:
1 | 2020-10-07 15:41:25.199 xcodebuild[31298:244367] DTDeviceKit: deviceType from b84fe20c60c909c233795932857884d923e09df2 was NULL |
根据中间段错误提示分析可知, 既已指定自动签名了, 这里再次指定配手动有冲突?
大致意思就是说, Xcode项目配置为自动签名, 而Jenkins构建的shell里面指定了证书相当于手动签名配置. 就是下面shell中执行xcodebuild -workspace
部分的这句CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}"
了. 其实去掉这句就构建编译正常了, 否则就修改Xcode项目为手动签名,并提交推送到远端仓库. 另外相应的导出plist配置文件也要做调整 signingStyle: automatic / manual, 还有其他不一致的内容,可回顾前文的对照图.
错误二:
1 | ** ARCHIVE SUCCEEDED ** |
这就是为什么要修改了, 不修改因为签名方式不一致, 且部分参数都不一致的, 所以导出直接失败
6.构建shell (推荐使用automatic签名方式)
1 | !/bin/bash -l |
(四) 构建后配置相关
这里一般是邮件通知配置, 相应的可能有多种方案实现. 这里列出3种可行方式
(1) 使用上传后的蒲公英邮件下发通知, 蒲公英平台上配置即可.
(2) 直接使用Jenkins自带的邮件通知, 也会有构建后操作模块提供配置
(3) 使用邮箱插件Extended E-mail Notification
. 自定义更加方便
全局配置中,Jenkins Location ->Jenkins URL
可配置当前ip地址, Extended E-mail Notification
以及邮件通知
都得配置SMTP server
, 因为一个是系统提供的, 一个是插件提供的
此处注意, 暂用1.7.1版本, 若更新会没有Use SMTP Authentication
可选,构建报错"ERROR: Could not send email as a part of the post-build publishers."
参考文章
Jenkins + Gitlab + Docker + Spring Boot 实现自动部署
Xcode 9 distribution build fails because format of exportOptions.plist has changed in new release
遗留问题
1.fastlane的快速构建
2.应用在蒲公英发布后的回调信息截取然后写到邮件上去?
- 本文作者: 醉疏狂
- 本文链接: https://hubin97.github.io/2020/10/07/iOS自动化构建/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!