iOS 本地打包工具 自动化

简介: 1、为什么要自动打包工具? 每修改一个问题,测试都让你打包一个上传fir , 你要clean -> 编译打包 -> 上传fir -> 通知测试。而且打包速度好慢,太浪费时间了。如果有一个工具能自动的帮你做完上面所有的事情,岂不是快哉? 2、网上有那么多自动打包工具,我直接下载就行了为啥还要学习? 没错网上有很多打包工具,包括github上




1、为什么要自动打包工具?

每修改一个问题,测试都让你打包一个上传fir , 你要clean -> 编译打包 -> 上传fir -> 通知测试。而且打包速度好慢,太浪费时间了。如果有一个工具能自动的帮你做完上面所有的事情,岂不是快哉?

2、网上有那么多自动打包工具,我直接下载就行了为啥还要学习?

没错网上有很多打包工具,包括github上也有一些直接从github下载并打包上传的,但是他们的不一定适合你,首先下载下来要配置各种参数,不会配,还有网上大多是针对普通项目,但是我们项目是cocoaPods管理的,编译的是 xxx.xcworkspace 不是 xxx.xcodeproj 。怎么办 , xxx.xcodeproj 自动编译后就在你项目目录下会有xxx.app 但是 xxx.xcworkspace 找不到怎么办?怎么指定目录 , 这些网上的库大都没有的。

3、需要哪些准备工作?

首先你得有装xcode , python3.5 (我装的版本,其他版本也行), 待打包的项目。安装相关软件,随便搜索下就可以了。

废话结束,开始正文。本文介绍的是自动clean本地项目,编译 打包 上传fir 邮件通知相关人员。不涉及从git上下载。原理就是利用python执行控制台命令。对
iOS项目进行打包

xcode控制台命令

xcode 控制台命令基本都是以 xcodebuild 开头的介绍几个简单的命令,大家可以在命令行试试。

  • xcodebuild -version 查看xcode的版本号和build的版本号
  • xcodebuild -showsdks 显示当前系统的SDK、及其版本
  • xcodebuild -list 先 cd 到工程目录下执行此命令 显示target Schemes 等

没有使用 cocoaPods 项目的编译

如果你的项目是普通的项目没有使用cocoaPods 那么 cd 到工程目录下直接执行 xcodebuild build ,就会自动编译了 参数都是默认 默认build release。
你也可以指定 xcodebuild -configuration debug build build的时候会在你工程目录下生成一个build文件夹,build/Release-iphoneos/xx.app
就是一会打包成ipa需要的文件。 第一次build速度会比较慢,要把编译环境拉下来,不要删除build文件夹,以后build 速度就会变快。

使用了 cocoaPods 项目的编译

如果不幸你也和我一样使用了cocoaPods , 其实也没啥不幸的 ,只是编译的时候就比较麻烦了 ,首先还是 cd 到项目目录 。但是你要指定编译文件和 scheme
而且还要指定build后build文件夹的位置,如果位置找不到,后面怎么自动打包ipa?。

我这里的命令大概是这样的:
xcodebuild -workspace xxx.xcworkspace -scheme 你的scheme -configuration debug -derivedDataPath 指定路径 ONLY_ACTIVE_ARCH=NO
这样就能正常编译并把build指定到我们想要去的目录

打包ipa

打包ipa只要上面路径对了,打包指定从.app 文件的路径 , 打包到你指定地方就行了。
命令:
xcrun -sdk iphoneos PackageApplication -v 这里填.app的路径 -o 指定存放ipa路径/文件名.ipa

python实现篇

上面只是说了下编译的原理,下面看下怎么通过python自动处理这些任务 。

clean、编译、打包

首先创建一个xxx.py文件,需要你懂点python 语法,不懂就直接copy代码。不要改tab 。python的语法是严格按照tab区分的。后面我会放上我的代码,你们改改
变量就可以使用。

首先你需要引入一些外部依赖。设置编码为utf-8

 
    
1
2
3
4
5
6
7
8
9
10
 
    
# -*- 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

第一步 , 声明一些变量

 
    
1
2
3
4
5
6
7
8
 
    
# 项目根目录
project_path = "/Users/xx/project"
# 编译成功后.app所在目录
app_path = "/Users/xx/project/build/Build/Products/Release-iphoneos/xxx.app"
# 指定项目下编译目录
build_path = "build"
# 打包后ipa存储目录
targerIPA_parth = "/Users/xx/Desktop"

第二步,clean,和创建一个文件夹,这里的示例是针对有使用cocoaPods的项目 , 如果没有使用 不用创建文件夹 ,命令自行简化

 
    
1
2
3
4
 
    
# 清理项目 创建build目录
def clean_project_mkdir_build():
os.system( 'cd %s;xcodebuild clean' % project_path) # clean 项目
os.system( 'cd %s;mkdir build' % project_path) # 创建目录

%s 是py的占位符,字符串类型。后面是真正的填充。

第三步编译项目

 
    
1
2
3
4
 
    
def build_project():
print( "build release start")
os.system ( 'cd %s;xcodebuild -list')
os.system ( 'cd %s;xcodebuild -workspace xxx.xcworkspace -scheme xxx -configuration release -derivedDataPath %s ONLY_ACTIVE_ARCH=NO || exit' % (project_path,build_path))

不知道scheme是啥的xcodebuild -list 自己查

第四步 打包

 
    
1
2
3
4
5
 
    
# 打包ipa 并且保存在桌面
def build_ipa():
global ipa_filename
ipa_filename = time.strftime( 'yourproject_%Y-%m-%d-%H-%M-%S.ipa',time.localtime(time.time()))
os.system ( 'xcrun -sdk iphoneos PackageApplication -v %s -o %s/%s' % (app_path,targerIPA_parth,ipa_filename))

然后你现在再编写个方法,按顺序调用就可以编译打包了 ,执行完会看到桌面的ipa

 
    
1
2
3
4
5
6
7
 
    
def main():
# 清理并创建build目录
clean_project_mkdir_build()
# 编译coocaPods项目文件并 执行编译目录
build_project()
# 打包ipa 并制定到桌面
build_ipa()

执行就在最下面直接调用就行了 main()

上传fir

我们是把代码上传到fir测试的,如果你们用的蒲公英或者其他,请自行搜索。
通过 gem install fir-cli 如果你没有ruby环境,自行搜索

安装完成后,在命令行输入fir 回车 。会有fir的命令提示。我们上传fir需要fir的API_TOKEN , 去fir官网登录找好就能找到。
拿到那一串串字符,在变量区加上

 
    
1
2
 
    
# firm的api token
fir_api_token = "xxxxxxxxxxxxxxxxxxxxxxxxxx"

然后命令传入ipa目录和token就可以上传了

 
    
1
2
3
4
5
6
7
8
 
    
#上传
def upload_fir():
if os.path.exists( "%s/%s" % (targerIPA_parth,ipa_filename)):
print( 'watting...')
# 直接使用fir 有问题 这里使用了绝对地址 在终端通过 which fir 获得
ret = os.system( "/usr/local/bin/fir p '%s/%s' -T '%s'" % (targerIPA_parth,ipa_filename,fir_api_token))
else:
print( "没有找到ipa文件")

这里也有遇到一个=坑,就是在终端直接fir 带后面的就可以执行 ,但是在这里识别不了命令,必须制定全路径,怎么找命令的全路径呢?终端输入 which fir

发邮件

具体发邮件功能看代码,这里有几个变量。我使用的是新浪邮箱发的,smtp服务器 , 如果你是 pop3 请更换,还要在邮箱里开启相应的服务

 
    
1
2
3
4
 
    
from_addr = "xxxx@sina.com"
password = "*****"
smtp_server = "smtp.sina.com"
to_addr = 'aaa@qq.com,bbbb@qq.com'

然后发邮件的方法

我们的fir路径是固定的

 
    
1
2
3
4
5
6
7
8
9
10
11
 
    
# 发邮件
def send_mail():
msg = MIMEText( 'xxx iOS测试项目已经打包完毕,请前往 http://fir.im/xxxxx 下载测试!', 'plain', 'utf-8')
msg[ 'From'] = _format_addr( '自动打包系统 <%s>' % from_addr)
msg[ 'To'] = _format_addr( 'xxx测试人员 <%s>' % to_addr)
msg[ 'Subject'] = Header( 'xxx 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()

然后执行顺序是这样的

 
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
    
def main():
# 清理并创建build目录
clean_project_mkdir_build()
# 编译coocaPods项目文件并 执行编译目录
build_project()
# 打包ipa 并制定到桌面
build_ipa()
# 上传fir
upload_fir()
# 发邮件
send_mail()
# 执行
main()

本文重点在自动打包命令上,python代码感兴趣的可以去Python教程 学习。

本文代码已经托管在github上:https://github.com/smalldu/autoipa

原文 http://stonedu.site/2016/08/17/iOS-%E6%9C%AC%E5%9C%B0%E6%89%93%E5%8C%85%E5%B7%A5%E5%85%B7/


目录
相关文章
|
2月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
64 3
|
2月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
63 4
|
2月前
|
运维 Linux Apache
Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例
【10月更文挑战第8天】本文介绍了Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例。Puppet通过定义资源状态和关系,确保系统配置始终如一,支持高效管理基础设施。文章详细讲解了Puppet的安装步骤、配置方法及DSL语言示例,帮助读者快速掌握Puppet的使用技巧。
79 2
|
2月前
|
监控 虚拟化 云计算
从物理到云:使用自动化工具简化服务器迁移流程
【10月更文挑战第4天】随着云计算的快速发展,越来越多的企业选择将物理服务器迁移到云环境以提高效率和降低成本。本文详细介绍了使用自动化工具简化从物理到云的服务器迁移流程的技术实现细节,并提供了代码示例。
138 6
|
25天前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
26天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
51 4
|
28天前
|
运维 监控 数据安全/隐私保护
自动化运维工具的设计与实现
【10月更文挑战第34天】在现代IT基础设施管理中,自动化运维工具扮演着至关重要的角色。它们不仅提高了运维效率,还确保了服务的连续性和稳定性。本文将深入探讨如何设计并实现一个自动化运维工具,从需求分析到功能实现,再到最终的测试与部署。我们将通过一个简单的代码示例来展示如何自动执行常见的运维任务,如日志清理和性能监控。文章旨在为读者提供一套完整的方法论,以便他们能够构建自己的自动化运维解决方案。
|
2月前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。
|
2月前
|
人工智能 运维 监控
自动化运维:从脚本到工具的演变之路
【10月更文挑战第8天】在数字化时代的浪潮中,运维不再是简单的硬件维护,它已经演变成一场关于效率、稳定性和创新的技术革命。本文将带您领略自动化运维的魅力,从最初的脚本编写到现代复杂的自动化工具,我们将一探究竟,看看这些工具如何帮助运维人员简化日常任务,提升工作效率,并最终推动业务发展。
|
2月前
|
机器学习/深度学习 运维 监控
提升运维效率:自动化工具与实践的融合
【10月更文挑战第3天】 在当今信息技术迅猛发展的时代,运维作为保持系统稳定性和性能的关键角色变得越来越重要。本文将探讨如何通过结合自动化工具和最佳实践来优化运维流程,实现高效、可靠的运维管理。从基础监控到高级自动化,我们将一步步引导您了解如何搭建和维护一个高效的运维体系。
46 3