OC

iOS 自动打包

利用 jenkins+脚本 一键打包、上传

Posted by sunzhongliang on March 20, 2019

利用脚本+jenkins进行项目的编译打包,生成ipa包,并上传到fir

前言

现在网上的自动打包教程几乎都还是利用xcodebuild + xcrun的方式先生成.app包 再生成.ipa

今天我们来试下在jenkins中构建项目,并且自动上传fir等功能。
平常网上说的jenkins构建iOS项目都是依赖jenkins插件功能,并且需要一大堆证书配置;但由于后来iOS项目构建需要export plist导致构建失败,所以今天来借助shell脚本完成打包功能。

jenkins安装

jenkins 的安装,网上有很多教程,这里不做过多介绍。
强调一下,推荐使用brew方式安装jenkins,否则会出现各种各样的问题。

打包方式

打包方式最常见的分为Ad Hoc企业包TestFlight:

  • Ad Hoc 最大安装数量只有100,且苹果开发者账号需要添加要安装的设备id
  • 企业包 无数量限制(但苹果最近关闭了企业账号的申请权限,所以企业账号价值珍贵了)
  • TestFlight TestFlight分为内部测试外部测试
    内部测试:需要在开发者账号内,邀请其他Apple账号作为测试员,但也有数量限制
    外部测试:不需要邀请测试员,但打包完成后需要提交给苹果审核,通常需要大约1天左右的时间

打包脚本配置

IPABuildShell 这个脚本主要可以帮助我们
1.更改bundle id
2.设置分发渠道development、enterprise、app-store、ad-hoc
3.自动根据设置的bundle id匹配电脑证书配置以及provisionfile
4.更改项目的API环境地址,比如测试环境、预发布环境、生产环境
5….

使用方法:
1.将IPABuildShell脚本放在项目根目录,并配置user.xcconfig
2.更新电脑openssl,在更新完成后,如果是调用brew link openssl --force,当前电脑openssl版本还是旧的,需要设置sudo ln -s -f /usr/local/Cellar/openssl/1.0.2r⁩/bin/openssl /usr/bin/openssl(注意新版本openssl安装目录,通常是1.0.2r⁩变化);如果执行这个命令遇到权限问题(是由于Mac OS系统对文件目录的安全性要求更严格),可以重启电脑按cmd+r进入Recovery模式,之后选择实用工具 => 终端,在终端输入csrutil disable命令,解除文件系统的锁定,然后执行reboot重启电脑,在执行一遍新的sudo ln -s -f /usr/local/Cellar/openssl/1.0.2r⁩/bin/openssl /usr/bin/openssl
3.执行完这些命令后,那么就可以使用shell构建版本了

在jenkins中配置项目

1.新建item,选择Freestyle project 自由风格项目,输入任务名称
2.【源码】管理里面设置git项目路径或者是svn项目路径。由于拉取时需要授权,可以配置用户名密码访问,或者配置SSH访问的方式,我配置的是SSH访问可以脱离密码变更需要改jenkins的方式

3.在【构建】里增加构建步骤,选择Execute shell,输入以下代码

#!/bin/bash -l

cd JingPin

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

#因为是企业版打包,所以修改应用显示名,装入手机后通过名称可以直接区分App Store下载包
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName 这个是要修改的项目名" JingPin/SupportingFiles/Info.plist
#将Apple Pay等环境移除
/usr/libexec/PlistBuddy -c 'Delete :com.apple.developer.associated-domains' JingPin/SupportingFiles/JingPin.entitlements
/usr/libexec/PlistBuddy -c 'Delete :com.apple.developer.in-app-payments' JingPin/SupportingFiles/JingPin.entitlements
/usr/libexec/PlistBuddy -c 'Delete :com.apple.developer.pass-type-identifiers' JingPin/SupportingFiles/JingPin.entitlements
/usr/libexec/PlistBuddy -c 'Delete :aps-environment' JingPin/SupportingFiles/JingPin.entitlements
/usr/libexec/PlistBuddy -c 'Delete :keychain-access-groups' JingPin/SupportingFiles/JingPin.entitlements

#清空旧安装包
find ${WORKSPACE}/JingPin/IPABuild/ -name "*.ipa" -type f -print -exec rm -rf '{}'

#-b: 修改bundleID
#-c: 修改打包签名方式
sh IPABuild/IPABuildShell.sh -c enterprise -b com.xxx.YPLP.beta --env-filename YGConfigDefine.h --env-varname __kDebugSet --env-production 0 --auto-buildversion

#发布到fir
ipaPath=`find ${WORKSPACE}/JingPin/IPABuild/Package -name "*.ipa"`
if [[ ! -f "$ipaPath" ]]; then
echo "ipa安装包:\"$ipaPath\" 不存在"
	exit 1
fi
echo "找到打包后的ipa文件:$ipaPath"
echo "开始执行发布fir命令......"
fir publish $ipaPath -T xxxxxxxxxxxxxxxxxx -c "QA环境" -s "jingpin"

echo "开始执行发布SVN命令......"
appVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" JingPin/SupportingFiles/Info.plist`
svnPath="http://xxxxx:18080/svn/IT/xxxxx/开发文档/安装包/iOS/$appVersion/QA环境"
svn delete $svnPath --username=xxxx --password=xxxxx -m "清空旧文件"
svn import $ipaPath "$svnPath/${ipaPath##*/}" --username=xxxxx --password=xxxxx -m "jenkins自动打包提交svn发布"

一个脚本搞定所有功能!能用代码实现的决不手动实现!

jenkins 还可以设置定时打包,以及当有代码推送的时候打包等等很多实用功能。在日常开发中对开发人员具有很大的帮助。

后记

在安装jenkins配置项目的时候,也是遇到了n多问题,足足解决了差不多一天的时间,主要碰到了以下问题
1.在jenkins中执行shell脚本打包的时候,遇到openssl command not found,但我在电脑终端里面调用openssl version明明可以查到是最新版本,但jenkins始终无法找到命令,后来网上搜了以下资料觉得可能是找openssl环境变量时没有在bash里面找到,可能是某个路径错误。于是在jenkins Configure System里面添加全局变量PATH 值是在电脑终端里面执行echo $PATH打印的值,于是问题解决
2.在jenkins获取$HOME时,始终打印的是/Users/Shared/Jenkins,导致找不到MobileDevice证书配置,在jenkins Configure System再新增变量HOME 值为终端输入echo $HOME 打印的变量值
3.一开始打包正常,后来输出Command PhaseScriptExecution failed with a nonzero exit code 这个错误,手动构建一下,构建过程当中会要求输入电脑密码以访问证书,输入完成后点击始终允许即可解决。

本文首次发布于 孙忠良 Blog, 作者 [@sunzhongliang] , 转载请保留原文链接.