很多人在说到Daily Build的时候总是喜欢背书。背书就背书吧,总比混迹软件行业连书都没看过的强。很久以前遇到一个奇葩。每次到代码提交测的通知就着急忙慌的催促组员赶紧干活,开始严重加班,晚饭都不吃。。。偶尔还需要开通宵。但是即使如此,最后也不会得到什么好的反馈。那个team就是这样循环往复的做着项目,直到永恒。如果项目的相关人员能背背敏捷什么的开发书籍,想必情况总能有所改善。

相信以上情况各位多少都遇到过,那么Daily Build为什么会对这样的情况有所改善呢?

  1. 快速定位错误。那天的Daily Build出问题了就是那天继承到系统中得代码出的问题。有check in到SVN的代码必须是可以编译的这样的约定也无济于事,一个疏忽就扒瞎。Daily Build才是对代码可运行的最好保证。
  2. 给客户想要的软件。及早的把可运行的代码给客户看。用户可以及时看到可用的功能,可以及早的提出开发和需求理解不一致的内容。这个客户不一定是特质甲方。也可以理解为给开发部门提出需求的产品等其他部门。一般来说,如果最后给“客户”一个“出乎意料”的软件,这有可能不是客户想要的。
  3. 开发进度约%60。软件开发这个东西就是不能像盖楼一样看到明显的结果。%60是个多少?Daily Build可以让需要了解进度的人非常清楚的了解开发的进度。
  4. Daily Build对软件的质量也有很大的帮助。每天一个可运行的版本出来,测试就可以开始测了。尽早的测出bug来,尽早的修改。这些都会在不大量增加工作量的前提下保证代码质量。比在最后的最后通宵熬夜效果好到不知道多少。

XCODEBUILD

下面Daily Build iOS项目。Xcode有一个command tool的工具xcodebuild。用这个工具可以用来使用命令行编译Xcode项目。

然后先看看这个xcodebuild都能做些什么。输入man xcodebuild命令:

功能很强大!不过我们目前要用到的还只是其中的一小部分。一点点的看。

切换到你项目所在的目录

cd /Users/username/Desktop/MyiOSApp/

试试这句

xcodebuild -configuration Distribution clean build

最后看到这句** BUILD SUCCEEDED **就算是命令执行成功了。你可以在你的目录下发现一个新建的文件夹build,在这个文件夹里就可以找到编译并且打包好的你的app:YourProjectName.app。没错这个打好得包是app格式的。我们要得时ipa的包,肿么办呢。往下看。

xcodebuild -scheme MyiOSApp archive -archivePath /Users/username/Desktop/MyiOSApp.xcarchive

xcodebuild命令,这里使用-scheme来打包成xcarchive。然后。

xcodebuild -exportArchive -exportFormat ipa -archivePath
"/Users/username/Desktop/MyiOSApp.xcarchive" -exportPath
"/Users/username/Desktop/MyiOSApp.ipa"

这个命令执行完成之后,你就会在刚刚生成的build文件夹里找到你的app的ipa包了。

自动化起来

用shell把xcodebuild命令串起来?No,用Python。使用Python可以做shell能做的,还可以做shell不能的。而且python简单易学,谁拿过来都可以分分钟学会。最关键的一点,很多的linux系统都已经预装了python。mac也不例外。现在mac默认安装的时Python2.7的环境。所以,下面的代码都是基于Python2.7的。

上面讲了“大象装冰箱”的三步走。一一的用Python代码实现出来。

准备工作

下面用接收命令行的方式传入三步走中需要指定的内容。Python在执行的时候是这样的:

python yourFileName.py command line

我们要传入的参数包括scheme的名称,项目所在的目录等。还有别的,目前所用到的主要是这两个。例如:

python yourFileName.py --scheme=[your scheme name] -x [project path] [out put path.format]

有了命令了,就应该解析了:

opts, args = getopt.getopt(sys.argv[:], "x", ["scheme="])

参数从第二个开始算sys.argv[1:],因为第一个是yourFileName.py。getopt方法会把长参数名都拿出来给opts数组。opts数组中得每一个元素都是一个tuple的结构,第一个元素是长参数的名称,第二个元素是长参数对应的值。-x后面的参数都放在args数组中。args的每一个元素都是一个字符串,相当于"[project path] [out put path.format]"字符串按照空格split成的字符串数组。

走三步,1.cd。。。

跳转到项目所在的目录。参考这么一句import os os.system("ls")可以执行ls命令。但是,这个却不能执行“cd”命令。因为那个不能修改python主进程的工作目录。用这个:

import os
directory = "your ios project path"
os.chdir(directory)

2. archive

import subprocess
archiveCmd = "xcodebuild -scheme " + targetName + " archive -archivePath " + directory + targetName + ".xcarchive"
subprocess.Popen(archiveCmd, shell=True)

第一句就是拼一个字符串。一个xcodebuild的命令字符串,然后放到subprocess中执行。

3. 打包成ipa

ipaCmd = "xcodebuild -exportArchive -exportFormat ipa" + " -archivePath " + directory + "/" + targetName + ".xcarchive" + " -exportPath " + directory + "/" + targetName + ".ipa"
subprocess.Popen(ipaCmd, shell=True)

和第二部一样,拼一个字符串把上一步中打好包的xcarchive重新打包成ipa并输出。

so far so good?

这几条命令分开执行,确实都不会有任何的问题。会在项目的目录下生成一个build的目录,在里面可以找到我们在前面两部的命令中得到的xcarchive文件和最后输出的ipa文件。很好,都放在python的文件中按照我们预定的方式执行一次。python yourFileName.py -scheme yourSchemeName -x youriOSPeojectPath。执行之后会输出满屏幕的xcodebuild的输出内容。但是看看项目文件夹下,没有ipa文件!

原来,subprocess执行命令的时候,xcodebuild命令没有执行完成就已经返回了。也就是ipa打包的命令执行的时候上一步的命令还没有执行完,xcarchive还没有生成。这一点很好解决,python给subprocess提供了一个wait方法。等命令全部执行完了再执行下一步。

process = subprocess.Popen(archiveCmd, shell=True)
process.wait()

so far so good!

这个时候就算是全部的问题都解决了。代码在这里。Python语言本身非常的灵活。在这一代码上可以很容易扩展出其他的功能。比如定时执行,编译或者打包不成功发送通知邮件等。

为iOS项目添加Daily Build的更多相关文章

  1. 给iOS工程增加Daily Build

    给iOS工程增加Daily Build  前言 Daily Build 是一件非常有意义的事情,也是敏捷开发中关于 "持续集成" 的一个实践.Daily Build 对于开发来说有 ...

  2. Xamarin SQLite教程Xamarin.iOS项目添加引用

    Xamarin SQLite教程Xamarin.iOS项目添加引用 使用直接方式访问SQLite数据库,需要将System.Data和Mono.Data.SQlite库导入到创建的项目中.下面将分别讲 ...

  3. Ios项目添加Pods

    一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...

  4. iOS项目添加PCH文件

    1.单击Info.plist右键单击->New File->Other->PCH File创建PCH文件 文件名设置成:项目名-Prefix  ->点击Create,创建成功. ...

  5. 阿里云移动推送 ios项目添加SDK步骤

    添加阿里云Pods仓库和各产品SDK Pod依赖,配置步骤如下: 1. CocoaPods集成添加阿里云Pods仓库,Podfile添加: source 'https://github.com/ali ...

  6. ios项目开发汇总

    UI界面 iOS和Android 界面设计尺寸规范  http://www.alibuybuy.com/posts/85486.html iPhone app界面设计尺寸规范  http://www. ...

  7. iOS项目开发优秀文章汇总

    UI界面 iOS和Android 界面设计尺寸规范  http://www.alibuybuy.com/posts/85486.html iPhone app界面设计尺寸规范  http://www. ...

  8. 在iOS开发中,给项目添加新的.framework

    首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我 ...

  9. iOS 在已有项目添加CoreData

    本文转载至 http://cnbin.github.io/blog/2016/03/11/ios-zai-yi-you-xiang-mu-tian-jia-coredata/ 如果是新项目很好说,新建 ...

随机推荐

  1. nginx 自签名证书 配置 https

    最近在研究nginx,整好遇到一个需求就是希望服务器与客户端之间传输内容是加密的,防止中间监听泄露信息,但是去证书服务商那边申请证书又不合算,因为访问服务器的都是内部人士,所以自己给自己颁发证书,忽略 ...

  2. popup控件代码示例

    1.jsp页面input框中的代码 <td class="value"> <input name="demos[0].id" type=&qu ...

  3. 黄聪:mysql搬家,直接复制data文件夹(*.MYD,*.MYI,innodb)出错,无法正常显示

    解决办法: 1.复制旧mysql的data文件夹中的数据库到新mysql的data文件夹内. 2.删掉旧的“ib_logfile*”等日志文件,重启MySQL后会自动生成新的日志文件的. 3.复制旧的 ...

  4. hadoop-2.7.1:Error: Cannot find configuration directory: /etc/hadoop

    本文转载自:http://blog.csdn.net/huangshanchun/article/details/49533433 安装hadoop参考:http://blog.csdn.net/hi ...

  5. Java 简单UDP通信

    Java手册 java.net Class DatagramSocket java.lang.Object java.net.DatagramSocket All Implemented Interf ...

  6. Float IP设置

    浮动IP: 在做双机的时候,设定的一个IP,通过访问这个IP,具体到后台哪台机器,由系统指定. 浮动IP是随资源一起走的. 就是由软件根据具体情况把该IP设置在某一台机器上,对外提供服务 为了避免因为 ...

  7. HTML5按比例缩略图片并上传的实例

    <!DOCTYPE HTML PUBLIC> <html> <head> <meta charset="utf-8"> <sc ...

  8. Java遍历一个目录下的所有文件

    Java遍历一个目录下的所有文件   Java工具中为我们提供了一个用于管理文件系统的类,这个类就是File类,File类与其他流类不同的是,流类关心的是文件的内容,而File类关心的是磁盘上文件的存 ...

  9. leetcode9

    public class Solution { public bool IsPalindrome(int x) { ) { return false; } var str = x.ToString() ...

  10. fastjson数据格式转换 SerializerFeature属性详解

    SerializerFeature属性 名称 含义 备注 QuoteFieldNames 输出key时是否使用双引号,默认为true   UseSingleQuotes 使用单引号而不是双引号,默认为 ...