上一篇:iOS打包自动化实践(三)
打包到分发全程自动化的闭环。
本篇文章介绍了iOS包自动化分发的实现。
效果
功能实现的效果如图
红框1:构建界面,包括选择remote,选择签名类型和填写分支名的功能。
红框2:构建历史,包括展示分发二维码和对应功能分支名的功能
扫描后页面如图,包括安装应用和安装证书两个功能。
知识扫盲
1、设备条件
由于此系统主要支持Debug签名,因此设备必须是设备id在developer.apple中注册过的测试机。如果是企业证书签名的话所有设备均可安装
2、分发条件
iOS的分发与安卓不同,安卓分发只需把包的下载链接在手机上打开即可,iOS包分发首先需要把包放在一个https服务器上,其次需要生成固定格式的plist文件(后文会讲),在plist文件中写入包的下载地址,并把plist文件放在一个https服务器上,在手机上打开该plist文件的下载地址,才可以触发下载安装。
实现
1、配置Mac环境
我们提到分发需要https服务器,正好我们可以通过打包的Mac自带的ApachCtrl将Mac直接配置成一台Https服务器,省的找运维了啊哈哈哈哈哈。
配置的主要原理是由于https建立链接需要SSL握手过程,SSL握手需要https证书,为了避免额外申请证书的费用和麻烦这里直接用openssl生成一张自签名的证书,自签名证书和权威机构颁发的证书主要区别是设备【手机】在与服务器通信之前需要下载并信任该自签名证书【原理同Charles抓https请求】,而权威机构颁发的证书不需要手动下载和信任。这就是为什么上文提到的扫描二维码之后除了安装应用之外还有安装证书的功能【证书只需要安装和信任一次即可】。
跟着 这篇教程 配置即可,主要是一些机械操作。
配置结束后站点目录即为/Library/WebServer/Documents,在该目录下的文件,在本地机器上拼接host【Mac的内网IP】可以访问,即表示配置成功。
例如:生成的证书放在路径:/Library/WebServer/Documents/server.crt,Mac的IP地址为192.168.1.25,则证书下载链接为:https://192.168.1.25/server.crt
2、基本流程
1、首先需要设计站点的文件目录。
红框1:https证书
红框2:项目文件夹
红款3:根据build号(Jenkins的任务build号,环境变量名BUILD_NUMBER)命名文件夹,内包含分发页(index.html),ipa包,plist配置文件和二维码(qrcode.png)。
2、自动化流程
1、Archive生成ipa包。
2、根据文件目录规则创建文件夹,并把ipa包放入指定目录【此时ipa的下载链接已确定。
3、根据ipa的下载链接生成plist文件,放入指定目录【plist文件下载链接确定】。
4、根据plist文件下载链接生成二维码,并放入指定目录。
5、Jenkins配置界面展示二维码。
3、脚本
1、根据下载链接生成plist文件。plist格式固定,仅有一个变量url。使用cat重定向将内容写入plist_path。create_plist.sh
2、根据plist下载链接生成html分发页。create_html.sh
3、根据plist下载链接生成png二维码。create_qrcode.swift)
4、完整脚本(仅供参考)。入口脚本test_package.sh,在Jenkins配置界面的【Execute shell】中的入口调用:
#!/bin/bash
project_path=`pwd`
script_path="$project_path/fastlane/scripts/TestPackage/test_package.sh"
chmod +x $script_path
#执行脚本
$script_path\
--projectPath $project_path\
--buildNumber $BUILD_NUMBER\
--buildCause $BUILD_CAUSE\
--signingType $signingType\
--remote $remote\
--branch $branch\
--nodeName $NODE_NAME\
4、Jenkins配置界面
1、要实现在构建历史界面插入二维码和分支名。先下载【Description setter】插件,然后在【配置-构建后的操作】中添加【Set build description】,并在【Description】中添加html代码。代码中有两个变量,BUILD_NUMBER和branch,分别对应Jenkins的build号和分支名。
<img src='http://192.168.1.24/Test_iOS_Package/${BUILD_NUMBER}/qrcode.png' /><br><br> <p><font color="blue">$branch</font></p>
FAQ
1、移动文件命令。
正常来讲/Library/WebServer/Documents路径需要root权限,因此需要使用sudo -S命令。
echo $root_password | sudo -S mv $new_dir_path ${server_dirpath}/${dir_name}