目标: 自己一直希望实现这样一个功能--->每天下午18:00 自动生成一个ipa文件给测试用。
快货运的打包历程
- 最初打包: 任务少,那时候只有一个的时候。我们就是直接拿一个手机过来,用xcode给测试机装APP,然后让他们直接用。 ----缺点: 每次bug验证完都要装一遍,太不爽。
- 一级打包:利用xcode 生成导出IPA 文件,将文件放入测试的共享机器里面,测试人员自己利用itools安装。----缺点:1、Xcode 打包需要archive 等待归档。2、然后选择证书。3、最终导出文件。4、然后手动复制IPA 到指定共享文件。 也会浪费开发很多重复的时间,相当不爽。
- 二级打包:一开始我们工程是单工程,当然利用xcodebuild 和 Xcoderun 脚本来进行工程打包。 只要制作一个youname. command 脚本,然后等工程整理好后,双击command文件,就可以躺在那里休息了。
- 三级打包: 由于后来使用cocospad 来进行管理工程后,之前的自动化打包方式不能用了。就一直没有时间去考虑怎么样去打包。 就是半手动方式去打: command +B 生成APP ,利用脚本将APP 生成ipa ,然后利用脚本将ipa copy 到测试共享文件夹下面。 (编译+双击执行command 脚本命令)
- 终极打包:脚本+定时器。 全自动化
这也是今天的主题:全自动化打包
我们的项目工程环境:利用cocoapods 进行项目管理。(cocoapods 应该算是iOS标准化的项目管理工具了吧)
步骤:
- 利用xcodebuild编写出可以生存ipa 文件的脚本。(磕磕碰碰写过好多版本)。
- mac上利用launchctl 来执行定时任务呢。(之前一直在考虑想用crontab 命令)。
接下来是写具体怎么实现的
1、编写脚本
新建一个脚本文件,比如:kingbo.sh(或者kingbo.command);(备注.command是双击可执行文件,.sh 是定时器可以执行脚本)
下面例子,我存放路径为:/Users/jinlb/Desktop/IPA/kuaihuoyunworkSpace/
目前我们的工程sh脚本内容如下:
#!/bin/sh
#我sh脚本文件放在 kuaihuoyunworkSpace 文件夹下面,因此利用cd命令 到改目录下。用来输出日志
cd ~/Desktop/IPA/kuaihuoyunworkSpace
LOG=`date +"%Y-%m-%d %H:%M:%S"`
LOGFILE=`date +"date-log-%Y%m%d.log"`
echo $LOG > $LOGFILE
# Script.sh
# kuaihuoyun
#
# Created by jinlb on 2016/12/9.
# Copyright © 2016年 banyanan. All rights reserved.
#下面2行是没有Cocopods的用法
#echo "=================clean================="
#xcodebuild -target "${APP_NAME}" -configuration 'Release' clean
#echo "+++++++++++++++++build+++++++++++++++++"
#xcodebuild -target "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'
# 证书
CODE_SIGN_DISTRIBUTION="iPhone Distribution: xxxxx"
# PROVISIONING_PROFILE
PROVISIONING_PROFILE="distribution_com.xxxx"
# SchemeName
APP_NAME="kuaihuoyun"
#我们项目工程的workspace 路径,
WorkSpace_PATH="/Users/jinlb/Desktop/WorkSpace201601/kuaihuoyunMain.xcworkspace"
#下面2行是集成有Cocopods的用法
echo "=================clean================="
xcodebuild -workspace "${WorkSpace_PATH}" -scheme "${APP_NAME}" -configuration 'Release' clean
echo "+++++++++++++++++build+++++++++++++++++"
xcodebuild -workspace "${WorkSpace_PATH}" -scheme "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" PROVISIONING_PROFILE="${PROVISIONING_PROFILE}" SYMROOT='$(PWD)'
echo "+++++++++++++++++生成IPA+++++++++++++++++"
APP_PATH="/Users/jinlb/Desktop/IPA/kuaihuoyunworkSpace/Release-iphoneos/${APP_NAME}.app"
echo ${APP_PATH}
xcrun -sdk iphoneos PackageApplication ${APP_PATH} -o "/Users/jinlb/Desktop/IPA/kuaihuoyunworkSpace/${APP_NAME}.ipa"
echo "+++++++++++++++++Copda+++++++++++++++++"
#echo "++++++++copy IPA to shareFile++++++++"
#sudo cp ${IPA_Path}/${IPA_Name} ${targetFilePath}
上面命令行很简单,每行都有注释,也很容易理解。 需要注意的是:要找到xcodebuild最终生成的app文件路径。(我这边执行后,会在在当前sh文件同级目录下生成Release-iphoneos 文件夹里面,因此我APP_PATH 是写死的指定目录)。
创建完成之后,需要修改下脚本权限: chmod 777 kingbo.sh 这样脚本才可以有权限执行。
2、launchctl 定时器使用
步骤如下
a、plist 文件创建
这里我的文件名取: com.kuaihuoyun.launchctl.plist
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StandardErrorPath</key>
<string>/Users/jinlb/Desktop/IPA/kuaihuoyunworkSpace/run-error.log</string> <!--kingbo.sh运行出错有,会将脚本输出日志输出到run-error.log中 -->
<key>StandardOutPath</key>
<string>/Users/jinlb/Desktop/IPA/kuaihuoyunworkSpace/run-out.log</string> <!--kingbo.sh脚本运行的成功后,日志会输入到我们指定的的run-out.log日志中 -->
<key>StartCalendarInterval</key>
<dict> <!--Hour 和 Minute 表示 每天18:00执行 -->
<key>Hour</key>
<string>18</string>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>ProgramArguments</key>
<array>
<string>/Users/jinlb/Desktop/IPA/kuaihuoyunworkSpace/kingbo.sh</string> <!--这里填写我上面kingbo.sh脚本全路径 -->
</array>
<key>Label</key>
<string>com.kuaihuoyun.launchctl.plist</string>
</dict>
</plist>
b、plist 文件存放路径
将com.kuaihuoyun.launchctl.plist文件放入:
~/Library/LaunchAgents //由用户自己定义的任务项
c、launchclt 命令
首先cd 到 ~/Library/LaunchAgents 文件夹下面(或者命令下文件填写全路径)
然后执行命令:
launchctl load (youfilename).plist //加载任务
launchctl unload (youfilename).plist //卸载任务
launchctl start (youfilename).plist //直接执行任务
launchctl stop (youfilename).plist //停止任务
launchctl list //显示任务列表 若要过滤可以执行如: launchctl list | grep com.kuaihuoyun.launchctl.plist
上面这些命令自己完全可以看懂