iOS自动打包

为什么要自动

iOS开发,有两个感觉比较耗时,其一是证书,对于第一次接触的人来说,需要时间去熟悉,其二便是项目打包,导出上传测试。对于比较大的项目,打包的时间会比较长,在测试阶段,测试MM会要求你不断打包,更新,测试,一直循环,做为一个程序猿,能偷懒就偷懒,能用一行命令解决的东西,绝不用多一行,所以,我们需要自动打包,帮我们完成 ‘打包->上传->发邮件通知MM’

准备

  • 安装 xcode
  • 安装 python
  • 安装 fir
    通过 gem install fir-cli安装fir 如果你没有ruby环境,自行搜索

脚步

脚步来自iOS本地打包,做了修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# -*- coding: utf-8 -*-
import os
import sys
import time
import hashlib
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
# 是否使用了coocaPods
hasPods = True
# 项目名称
project_name = "AutoLayout"
# 项目根目录
project_path = "/Users/xxx/Desktop/" + project_name
# 编译成功后.app所在目录 pods打包后目录
app_path_pods = "/Users/xxx/Desktop/" + project_name + "/build/Build/Products/Release-iphoneos/" + project_name + ".app"
# 非pods打包后目录
app_path = "/Users/xxx/Desktop/" + project_name + "/build/Release-iphoneos/" + project_name + ".app"
# 指定项目下编译目录
build_path = "build"
# 打包后ipa存储目录
targerIPA_parth = "/Users/xxx/Desktop"
# firm的api token
fir_api_token = "xxxxxxx"
from_addr = "xxx@sina.com"
password = "xxxx"
smtp_server = "smtp.sina.com"
to_addr = 'xxx@qq.com'
# 清理项目 创建build目录
def clean_project_mkdir_build():
os.system('cd %s;xcodebuild clean' % project_path) # clean 项目
os.system('cd %s;mkdir build' % project_path)
def build_project():
print("build release start")
if hasPods:#区分是否使用pods,两者编译命令不同
print('isPods...')
os.system ('xcodebuild -list')
os.system ('cd %s;xcodebuild -workspace %s.xcworkspace -scheme %s -configuration release -derivedDataPath %s ONLY_ACTIVE_ARCH=NO || exit' % (project_name,project_name,project_path,build_path))
# CONFIGURATION_BUILD_DIR=./build/Release-iphoneos
else:
os.system('xcodebuild -configuration debug build')
#build/Release-iphoneos/xx.app
# 打包ipa 并且保存在桌面
def build_ipa():
global ipa_filename
ipa_filename = time.strftime(project_name + '_%Y-%m-%d-%H-%M-%S.ipa',time.localtime(time.time()))
if hasPods:
os.system ('xcrun -sdk iphoneos PackageApplication -v %s -o %s/%s'%(app_path_pods,targerIPA_parth,ipa_filename))
else:
os.system ('xcrun -sdk iphoneos PackageApplication -v %s -o %s/%s'%(app_path,targerIPA_parth,ipa_filename))
#上传
def upload_fir():
if os.path.exists("%s/%s" % (targerIPA_parth,ipa_filename)):
print('watting...')
# 直接使用fir 有问题 这里使用了绝对地址 在终端通过 which fir 获得
ret = os.system("/usr/bin/fir p '%s/%s' -T '%s'" % (targerIPA_parth,ipa_filename,fir_api_token))
else:
print("没有找到ipa文件")
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
# 发邮件
def send_mail():
print("开始发送")
msg = MIMEText('xx iOS测试项目已经打包完毕,请前往 http://fir.im/xxxxx 下载测试!', 'plain', 'utf-8')
msg['From'] = _format_addr('自动打包系统 <%s>' % from_addr)
msg['To'] = _format_addr('xx测试人员 <%s>' % to_addr)
msg['Subject'] = Header('xx iOS客户端打包程序', 'utf-8').encode()
server = smtplib.SMTP(smtp_server,25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
print("发送完毕~!")
def main():
# 清理并创建build目录
clean_project_mkdir_build()
# 编译coocaPods项目文件并 执行编译目录
build_project()
# 打包ipa 并制定到桌面
build_ipa()
# 上传fir
upload_fir()
# 发邮件
send_mail()
# 执行
main()

###fir token获取





xcode配置好证书



开始打包

xcode配置好证书之后,将脚步拷贝到项目的根目录(为了每个项目打包方便,放桌面也可以),终端cd到该位置,执行python xxx.py脚步,即可一行代码完成 打包->上传->发邮件

iOS的自动打包就此结束,后面会继续将android的打包也自动化

参考文章:
iOS 本地打包工具