iOS自动打包脚本

前言

在客户端开发中,最频繁耗时的操作应该就是打包了 , 在打包的时候 , 开发工具不能进行其他操作 , 并且打包完了之后还需要导出iPa包 , 上传到Fir上截图下载二维码提供给测试同学使用 , 如果频繁需要打包就会十分浪费时间 , 因此便有了自动化打包的脚本~

[本文前面部分为脚本流程、工具及命令说明 , 使用方法在最后三部分]


需要的工具

必须的工具

  1. Xcode(编译 、打包需要使用Xcode自带的命令行工具)
  2. 下载Fir命令行工具并安装 (这里也可以用Fir的api接口 , 但命令行毕竟方便点~)
  3. Fir账号的Token

其他可选的工具

  1. Bugly 的APPID、AppKey(用来上传符号表到bugly上 , 方便查线上问题) 以及符号表提取上传脚本(下载自动配置符号表工具包)
  2. 企业微信机器人webHook地址(用来打包并上传完成后发送消息到对应的企业微信群通知测试产品同学)
  3. myqr 命令行工具,用来生成炫彩二维码图片(因为测试同学觉得Fir自带的二维码太丑了)

了解需要使用的命令

  1. 首先了解最主要的几个Xcode build命令
  • 清理编译过程生成的文件(包括上次的) , -configuration选项直接用release就阔以

    xcodebuild clean -configuration <Debug|Release>

  • 编程工程指定Scheme , 并且导出生成.xcarchive文件 , archivePath可指定编译文件导出目录

    xcodebuild build -workspace <xxx.workspace> -scheme <schemeName> -configuration <Debug|Release> -archivePath <PathName>

  • 利用生成的.xcarchive导出iPa文件 , archivePath是.archive文件的全路径。 需要注意的是 , 这里需要配置文件路径(exportOptionsPlist) , 但是自己写比较懵逼 , 这里可以先利用XCode本身的打包功能 , 打个ad-hoc包之后在对应的目录下可以找到ExportOptions.plist文件 , 直接拿来使用就可以了
2. **Fir命令行的命令**
+ 使用token登录Fir
> ````fir login -T ${FIR_TOKEN} ````
+ 上传指定目录ipa到fir上 , changeLog 为更新文案
> ````fir publish -Q --changelog=$changeLog $exportIpaPath/$scheme_name.ipa````

3. **Bugly符号表上传命令** , BUNDLE_IDENTIFIER 是包名 , DWARF_DSYM_FOLDER_PATH 是.xcarchive文件全路径 , SYMBOL_OUTPUT_PATH是提取后DSYM文件的存放路径 , UPLOAD_DSYM_ONLY直接传1表示上传 , run是bugly脚本自己定义的方法 , 内部也调用了其他的方法, 需要从它的脚本里面copy过来
> ```` run ${BUGLY_APP_ID} ${BUGLY_APP_KEY} ${BUNDLE_IDENTIFIER} ${DWARF_DSYM_FOLDER_PATH} ${SYMBOL_OUTPUT_PATH} ${UPLOAD_DSYM_ONLY}````

4. ***myqr生成二维码命令** , 生成指定字符串的二维码 , -p合并图片  , -c彩色图片 ,  -n 控制文件名 , -d 控制位置 
```` myqr ${qrString} -p bg.jpg -c -n {name}.png -d ${exportIpaPath}````

### 打包流程
1. 用xcodebuild clean清理旧文件
2. 编辑工程导出.xcarchive文件
3. 打包.xcarchive导出ipad文件
4. 登录fir , 填写更新内容并上传ipa包
5. 上传符号标到Bugly
6. myqr生成fir下载地址的二维码图片
7. 使用企业微信机器人发文本消息及图片消息到群聊
8. 调起浏览器打开下载页面

### 开始编写脚本
1. 在脚本的最前面把一些常量定义一下 , 方便修改和查找

企业微信机器人地址

robotUrl='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ea9c0393-bec9-4c6a-805b-422304b3cf4e'

fir下载地址

fir_path=https://fir.im/f1zn

FIR token

FIR_TOKEN="b9abbaf4036afef59d7dde9"

FIR app id 暂时没用(可以用来调api获取app信息)

FIR_APP_ID="5b68285d9249e72edb"

bugly app id

BUGLY_APP_ID="7d28a254"

bugly app key

BUGLY_APP_KEY="6e2c3b45-0858-4294-8293-88bc734ca"

bundle id

BUNDLE_IDENTIFIER="com.meishakeji.xxx"

Bugly服务域名

BUGLY_DSYM_UPLOAD_DOMAIN="api.bugly.qq.com"

名称 用来发消息到群聊的时候用

APP_name="VSChool教师端"

路径名称 在桌面新建的文件夹名称

PATH_name=TEACHER

打包模式 Debug/Release 直接用release就可以

development_mode=Release

工程名 后面编译要用 看项目里面的设置

project_name=VSchool

scheme名 后面编译要用 看项目里面的设置

scheme_name=VSchool

build文件夹路径

build_path=~/Desktop/${PATH_name}/build

导出.ipa文件所在路径 这里直接就丢桌面了

exportIpaPath=~/Desktop/{PATH_name}/IPAFIR/{development_mode}

工程绝对路径 也是脚本应该放的位置 , 不过也可以放其他地方 , 这里为了方便定死了

project_path=(cd `dirname0`; pwd)

plist文件所在路径

exportOptionsPlistPath=${project_path}/ExportOptions.plist

注意jar工具的路径跟dSYMUpload.sh脚本路径一致, 请务必保证jar路径的正确性 这一部分根据bugly文档来

BUGLY_SYMBOL_JAR_PATH="dsymtool/buglySymboliOS.jar"

查找添加到系统目录的jar工具

if [ ! -f "${BUGLY_SYMBOL_JAR_PATH}" ]; then
BUGLY_SYMBOL_JAR_PATH="~/bin/buglySymboliOS.jar"
fi

2. 中间有一些需要填写和选择的操作(比如填更新内容), 统一放在最前面 , 避免多次打扰
3. 清理工程 , 并且打印一些操作说明

echo '///-----------'
echo '/// 正在清理工程'
echo '///-----------'
xcodebuild clean -configuration ${development_mode} -quiet || exit
echo '///--------'
echo '/// 清理完成'
echo '///--------'

4. 编译工程 , 注意这里的workspace路径以及archivePath导出路径拼好 , allowProvisioningUpdates是Xcode9的一个报错*requires a provisioning profile with the Push Notifications feature*需要的参数

echo '///-----------'
echo '/// 正在编译工程:'{development_mode} echo '///-----------' xcodebuild archive -workspace{project_path}/{project_name}.xcworkspace -scheme{scheme_name} -configuration {development_mode} -archivePath{build_path}/${project_name}.xcarchive -quiet -allowProvisioningUpdates || exit
echo '///--------'
echo '/// 编译完成'
echo '///--------'

5. 打包导出ipa文件 , 导出路径就跟build目录一样就好了 , 主要是exportOptionsPlistPath要正确不然会打包失败

echo '///----------'
echo '/// 开始ipa打包'
echo '///----------'
xcodebuild -exportArchive -archivePath {build_path}/{project_name}.xcarchive -configuration {development_mode} -exportPath{exportIpaPath} -exportOptionsPlist ${exportOptionsPlistPath} -allowProvisioningUpdates -quiet || exit

6. 检查打包情况

if [ -e exportIpaPath/scheme_name.ipa ];
then
open $exportIpaPath #把目录打开下

7. 登录fir 和上传ipa包 , changeLog是前面填写的更新内容

fir login -T {FIR_TOKEN} fir publish -Q --changelog=changeLog exportIpaPath/scheme_name.ipa

8. 把bugly上传脚本中几个方法的copy过来 , 注意看一下Bugly原本脚本的注释说明 , 解析需要Java环境以及要依赖于buglySymboliOS.jar
    + 打印错误信息的**exitWithMessage**方法
    + 上传dsym的**dSYMUpload**方法
    + 解析dsym的**dSYMParse**方法
    + 执行逻辑的**run**方法
9. 上传dsym文件到Bugly上

ipa所在的目录

SYMBOL_OUTPUT_PATH=${exportIpaPath}

.xcarchive所在的目录

DWARF_DSYM_FOLDER_PATH={build_path}/{project_name}.xcarchive

需要上传

UPLOAD_DSYM_ONLY=1
run {BUGLY_APP_ID}{BUGLY_APP_KEY} {BUNDLE_IDENTIFIER}{DWARF_DSYM_FOLDER_PATH} {SYMBOL_OUTPUT_PATH}{UPLOAD_DSYM_ONLY}

10. 生成二维码 , 自定义一下图片名 , 并且使用彩色合并模式

myqr {fir_path} -p bg.jpg -c -n{PATH_name}.png -d ${exportIpaPath}

11. 企业微信机器人发送文字到群聊 

发文字

curl {robotUrl} \ -H 'Content-Type: application/json' \ -d "{\"msgtype\": \"text\",\"text\": {\"content\": \"打包仔已经把{APP_name}打包好啦\n这次的更新内容是:changeLog\nfir地址是:{fir_path}"}}"

12. 企业微信机器人发送二维码图片到群聊 , 这一步需要获取图片的base64 以及 md5 做校验才能发送

图片的base64

imageBase64=(base64 -iexportQrcodeImgPath)

图片的md5 , 这里需要做一下截取 , 把没用的截掉

imageMd5String=(md5exportQrcodeImgPath)
imageMd5=${imageMd5String##* }

13. 发送图片到群聊

发图片

curl {robotUrl} \ -H 'Content-Type: application/json' \ -d "{\"msgtype\": \"image\",\"image\": {\"base64\":\"{imageBase64}" , "md5": "${imageMd5}"}}"

14. 打开浏览器 打开二维码地址
````#打开下载网址
open -a "/Applications/Google Chrome.app" ${fir_path}````

---

---


# 如何使用

### 使用前准备
> 如果只需要打包 , 做好以下的几个准备 使用附件中的**simpleShell.sh**脚本就可以简单的打包并上传Fir了

1. [安装Fir命令行工具](https://github.com/FIRHQ/fir-cli/blob/master/README.md)
2. 通过XCode获取ExportOptions文件, 也可以下载附件自己修改teamID字段为开发账号的teamID;
3. 拿到Fir的token , 个人或者公司的都可以
4. 拿到APP对应的Fir短链接地址(fir会给每个APP分配一个固定短链接)
---
> 如果想使用所有功能的话 就需要以下的准备 , 根据自己需求可以删掉某些部分(修改附件的**fullShell.sh**)
1. 首先在需要发消息的企业微信群建一个机器人拿到webhook地址
2. 下载并根据Bugyly上传脚本说明安装java环境 , 添加jar包到指定目录
3. 获取Bugly的AppID、AppKey
4. [安装myqr的命令行工具](https://github.com/sylnsfar/qrcode/blob/master/README-cn.md)

### 配置相关参数和常量(需配置一次 , 脚本把参数和变量定义都放在了第一部分)
1. 将robotUrl 变量改为自己创建的webHook地址
2. fir_path 修改为APP对应的fir短链接
3. FIR_TOKEN 修改为fir的token
4. BUGLY_APP_ID、BUGLY_APP_KEY  分别是Bugly的AppId和AppKey
5. BUNDLE_IDENTIFIER 修改为项目包名
6. APP_name 这个是用来发消息到群里用的 , 提醒打的是什么APP的包
7. PATH_name 这个是用来区分不同项目打包路径的,随意起个名字
8. project_name , scheme_name 根据项目里面的设置修改
9. 准备一张用来合成二维码的背景图片 , 名称改为bg.jpg(可以改 , 把脚本里面的bgImageName改掉就好了 , 注意企业微信只支持发送jpg、png类型)

### 使用步骤
1. 将ExportOptions、脚本文件以及bg.jpg 放到项目根目录下(一般就是.xcodeproj文件所在目录)
2. 打开命令行 , cd 到根目录 , 执行脚本命令 , 根据提示输入更新内容
3. 脚本会自动完成打包流程 , 用机器人发送文本和图片消息到群聊 , 并且会用Chrome打开下载链接
4. Enjoy the time ! ~
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容