前言
第一次接触自动化构建,是以前在银行做供应商的时候,当时APP团队人员较多,频繁的打包测试,手动打包效率很低,银行的团队搭建了一个Jenkins自动化打包,当时觉得这工具真的很便捷,提交完代码,轻轻点一下构建,几分钟以后,新包就打好了,对于当初每天只做APP功能开发的我,感觉好高大上。
五月底换了新公司,进了新的项目组,团队负责两个系统APP的开发、运维,6个人研发团队,规模不大不小。开发阶段打包频率不高,一旦到了交付测试阶段,每天打包的频率很高。每个迭代周期测试时间5~7天,从手动打包的方式来看,两个APP、两个平台(iOS、Android),单个APP打包发布时间8min左右, 如果按平均每天各自打包5次来算(5次算是保守的),每天打包消耗的时间2h40min, 整个测试阶段打包最少也要消耗13h20min。可以看出消耗时间是也不少,如果这些时间可以省下来,小伙伴们完全可以做些其他有意义的事情。
我所在的中心,后台部署是在Jenkins进行的,然而APP自动打包发布是真空的,于是,我决定APP也要自动化构建。鉴于自己是做iOS开发的,就先从iOS自动化构建开始吧,安卓稍后再弄。以下是自动化构建的一些经历~
中心已经有了一台Jenkins服务器,就没必要再新搭一台了,但是iOS打包要基于Mac、Xcode,当然AppCode也可以,因平时用的少,此处不做介绍。Jenkins的服务器是Linux系统,Jenkins可以配置Slave(奴隶)服务器,实现分布式部署。于是决定在Jenkins的主节点下建一个从节点,用一台Mac来做Slave(奴隶)服务器,其实我更喜欢把这台Mac叫做节点机。
1、准备工作
1、配置MacOS slave,具体步骤如下:
1.1 、在偏好设置 ->共享 中开启 远程登录,参照下图:
image.png1.2、创建节点
Jenkins -> 系统管理 -> 节点管理 -> 新建节点,输入节点名称,并勾选 固定节点,点击OK。
image.png1.3、配置节点
image.png需要注意的是,这里的远程工作目录,权限为ssh链接的用户可读写。
1.4、添加Credentials
这里我选择是的SSH Username with private key。
image.png1.5、配置节点属性
image.png此处需要注意的是:PATH环境变量,需要在Mac 终端输入echo $PATH,然后将值copy过去
image.pngKeychains and Provisioning Profiles路径要填写正确。没有这个选项的安装Keychains and Provisioning Profiles Management插件。
1.6、保存
image.png以上即添加Mac Slave成功,且Mac Slave在线。若连不上,请反复确认远程工作目录的权限、以及网络。
节点启动失败后,确认权限、网络都正常,可以尝试重启节点代理。
image.png2、Jenkins系统配置
2.1、配置证书、描述文件
在 Jenkins > 系统管理 > Keychains and Provisioning Profiles Management,配置证书、描述文件。如下:
image.png注意:login.keychain 在目录/Users/xxx/Library/Keychains/login.keychain下,Password是自己Mac的登录密码
2.2、Jenkins > 系统管理 > 系统设置 中设置 Xcode和keychain
image.png注意:Keychain的路径:/Users/xxx/Library/Keychains/login.keychain,也可以这么写${HOME}/Library/Keychains/login.keychain,密码为Mac登录密码。
3、配置iOS项目
3.1、新建任务
image.png3.2、General
image.png注意:指定Mac Slave服务器来作为构建Xcode工程的Slave服务器,Xcode打包构建将在该节点上进行。
3.3、配置源码
此处配置代码从git上拉取
image.png注意:Credentials为git用户名、密码,点击添加,去新建一个。
image.png3.4、构建环境
image.png3.5、构建
打包并发布到蒲公英
image.png这里用到了fastlane来打包,fastlane是一套自动化打包的工具集,用 Ruby 写的,用于 iOS 和 Android 的自动化打包和发布等工作。gym是其中的打包命令。
fastlane 的官网看这里, fastlane 的 github 看这里
安装fastlane
使用Homebrew安装:
$ brew cask install fastlane
或者Rubygems安装:
$ sudo gem install fastlane -NV
或者
$ sudo gem install fastlane --verbose
具体构建脚本如下
#构建
#!/bin/bash -l
export LANG="en_US.UTF-8"
export LANGUAGE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
# cocoapods管理SDK必须加这一句,防止编译失败
pod install --verbose --no-repo-update
# 打包环境 (核心)
#config="Release"
config="Debug"
# 导出安装包方式
#export_method="app-store"
export_method="ad-hoc"
#export_method="development"
#export_method="enterprise"
# ipa 包名
ipa_name="youAppName"
#解锁keychain 密码为登录密码
#Linux服务器上的Jenkins调用Mac Slave时,是通过之前设置的SSH登录的方式,而Apple为了安全,在ssh登录时,是不允许读取Keychains(钥匙串)的,所以 security -v unlock-keychain -p "yourpassword"这行命令就很重要了。在构建打包前,先解锁Keychains。
security -v unlock-keychain -p "yourPassword"
#指定ipa输出地址
ipa_path="${WORKSPACE}/build/products"
fastlane gym --workspace Project.xcworkspace --scheme Project --clean --configuration ${config} --export_method ${export_method} --output_name ${ipa_name} --output_directory ${ipa_path}
echo "===上传至蒲公英平台==="
# 蒲公英userkey 蒲公英平台获取
pgyerUserKey="xxxxxxxxxxxxxxxxxxxxxx"
# 蒲公英apiKey 蒲公英平台获取
pgyerApiKey="xxxxxxxxxxxxxxxxxxxxxx"
# 更新版本 打包内容信息
updateDescription="测试版本"
packageTime="打包时间:【`date \"+%Y-%m-%d %H:%M:%S\"`】---"
echo $packageTime
if [ -e ${ipa_path}/${ipa_name}.ipa ]; then
RESULT=$(curl -F "uKey=${pgyerUserKey}" \
-F "_api_key=${pgyerApiKey}" \
-F "updateDescription=${updateDescription}" \
-F "file=@${ipa_path}/${ipa_name}.ipa" \
-F "buildUpdateDescription=${packageTime}${des}" \
https://www.pgyer.com/apiv1/app/upload)
echo ${RESULT}
if [ "${RESULT}" ]; then
echo "===完成蒲公英平台上传==="
else
echo "===上传蒲公英平台失败==="
fi
#open ${ipa_path}
else
echo "===上传蒲公英平台失败==="
fi
注意:上传蒲公英的API有两个,分别是API 1.0、API 2.0。此处选择用API 1.0上传。两种API的具体参数,请参考蒲公英官网:
API 1.0:https://www.pgyer.com/doc/api#paramInfo
API 2.0:https://www.pgyer.com/doc/view/api#paramInfo
IPA包上传蒲公英,此处采用的是脚本,也可以用Jenkins集成的蒲公英上传插件
image.png蒲公英上传的API,上面有描述,这里不再赘述。
构建成功效果图,如下:
image.png image.png问题记录:
报错:Unable to locate Xcode. Please make sure to have Xcode installed on your machine
解决方法:
在Xcode中没有设置“Command Line Tools”:打开Xcode偏好设置,选择"Location"选项卡,选择相应的“Command Line Tools”即可
报错:Alternatively you can provide the provisioning profile mapping manually
image.png解决方法:
先在xcode上archive一次包,把证书更新下来,就OK了。原因:通过xcode管理证书,并未把所有证书同步到本地,archive导出IPA的时候,会同步打包所需的证书到本地。
至此,iOS自动化构建结束。
总结
iOS自动化构建,更多在于对Slave(奴隶)服务器/从节点的理解,在从节点上建一个Jenkins工作目录,这个目录Jenkins必须要有读写的权限,之前在这里吃了亏,配了Linux服务器(主节点)Jenkins的工作目录,导致代码没拉到Mac上,没法构建。构建的时候一定要先解锁keychain,再构建。
下一篇:Android 自动化构建(Jenkins+Gradle+360加固)发布到蒲公英
网友评论