Daily Build
Daily Build 是一件非常有意义的事情,也是敏捷开发中关于 “持续集成” 的一个实践。Daily Build 对于开发来说有如下好处:
- 保证了每次 check in 的代码可用,不会造成整个工程编译失败。
- 进度跟进。产品经理可以每天看到最新的开发进度,并且试用产品,调整一些细节。很多时候,一个新功能,你真正用了一下才能有体会好或不好,所以 daily build 也给产品经理更多时间来调理他的设计。
- 需求确认。产品经理可以确认开发的功能细节是他的预期。因为我们的开发比较紧凑,所以都没有传统的需求说明文档,所以 daily build 也给产品经理用于尽早确认开发的功能细节是他的预期,我就遇到一次产品经理发现开发出的一个功能细节和他的预期不一致,但是因为有 daily build,使得我可以尽早做修改,把修改的代价减小了。
- 测试跟进。如果功能点是独立的话,测试同事完全可以根据 daily build 来进行一些早期的测试。越早的 Bug 反馈可以使得修改 bug 所需的时间越短。
步骤
xcodebuild 命令
如何做 daily build 呢?其实 Xcode 就提供了命令行 build 的命令,这个命令是 xcodebuild,用 xcodebuild -usage
可以查看到所有的可用参数,如下所示:
[tangqiao ~]$xcodebuild -usage |
一般情况下的命令使用如下:
xcodebuild -configuration Release -target "YourProduct" |
但在 daily build 中,用 Release 用为 configuration 其实不是特别好。因为 Release 的证书可能会被经常修改。我们可以基于 Release 的 Configuation,建一个专门用于 daily build 的 configuration。方法是:在工程详细页面中,选择 Info 一栏,在 Configurations 一栏的下方点击 “+” 号,然后选择 “Duplicate Release Configuration”, 新建名为 “DailyBuild” 的 Configuration, 如下图所示:
之后就可以用如下命令来做 daily build 了
xcodebuild -configuration DailyBuild -target "YourProduct" |
执行完命令后,会在当前工程下的 build/DailyBuild-iphoneos/ 目录下生成一个名为: YourProduct.app 的文件。这个就是我们 Build 成功之后的程序文件。
生成 ipa 文件
接下来我们需要生成 ipa 文件,在生成 ipa 文件这件事情上,xcode 似乎没有提供什么工具,不过这个没什么影响,因为 ipa 文件实际上就是一个 zip 文件,我们使用系统的 zip 命令来生成 ipa 文件即可。需要注意的是,ipa 文件并不是简单地将编辑好的 app 文件打成 zip 文件,它需要将 app 文件放在一个名为 Payload 的文件夹下,然后将整个 Payload 目录打包成为 .ipa 文件,命令如下:
cd $BUILD_PATH |
生成安装文件
苹果允许用 itms-services 协议来直接在 iphone/ipad 上安装应用程序,我们可以直接生成该协议需要的相关文件,这样产品经理和测试同学都可以直接在设备上安装新版的应用了。相关的参考资料可以见:这里 和 这里
具体来说,就是需要生成一个带 itms-services 协议的链接的 html 文件,以及一个 plist 文件。
生成 html 的示例代码如下:
cat << EOF > install.html |
生成 plist 文件的代码如下,注意,需要将下面的涉及 www.yourdomain.com 的地方换成你线上服务器的地址,将 ProductName 换成你的 app 安装后的名字。
cat << EOF > ynote.plist |
定时运行
这一点非常简单,使用 crontab -e 命令即可。大家可以随意 google 一下 crontab 命令,可以找到很多相关文档。假如我们要每周 1-5 的早上 9 点钟执行 daily build,则 crontab 的配置如下:
0 9 * * * 1-5 /Users/tangqiao/dailybuild.sh >> /Users/tangqiao/dailybuild.log 2>&1 |
失败报警
在 daily build 脚本运行失败时,最好能发报警邮件或者短信,以便能够尽早发现。发邮件可以用 python 的 smtplib 来写,示例如下:
import smtplib sender = 'sender@devtang.com' |
上传
daily build 编译出来如果需要单独上传到另外一台 web 机器上,可以用 ftp 或者 scp 协议。如果 web 机器悲剧的是 windows 机器的话,可以在 windows 机器上开一个共享,然后用 mount -t smbfs 来将这个共享 mount 到本地,相关的示例代码如下:
mkdir upload |
遇到的问题
本来我写的自动化脚本在 Mac OS X 10.6 下运行得很好。但是升级到 lion 后,脚本在手动执行时很正常,但是在用 crontab 启动时就会出现找不到开发者证书的错误。在网上搜了很久也没有找到解决办法。最后我试了一下在 “钥匙串访问” 中把开发者证书从 “登录” 那栏拖动到 “系统” 那栏,居然就解决了,如下图所示:
另外我搜到 2 个类似的问题的解决方案,虽然对我这个没起作用,也一并放在这儿,或许对遇到类似问题的人有帮助:
- http://stackoverflow.com/questions/7635143/cannot-build-xcode-project-from-command-line-but-can-from-xcode
- http://shappy1978.iteye.com/blog/765842
总结
将以上各点结合起来,就可以用 bash 写出一个 daily build 脚本了。每天这一切都会自动完成,心情相当好。
Daily Build的更多相关文章
- 在.NET 环境中实现每日构建(Daily Build)--ccnet,MSBuild篇(转载)
每日构建,对我们团队来说一个全新的概念.随着项目开发的进展,在开发过 程需要及时反馈一些BUG和功能要求的处理情况.而在这种情况下每天或隔一段时间Build一个版本,工作量还是比较大的,所以就特别有必 ...
- 给iOS工程增加Daily Build
给iOS工程增加Daily Build 前言 Daily Build 是一件非常有意义的事情,也是敏捷开发中关于 "持续集成" 的一个实践.Daily Build 对于开发来说有 ...
- 为iOS项目添加Daily Build
很多人在说到Daily Build的时候总是喜欢背书.背书就背书吧,总比混迹软件行业连书都没看过的强.很久以前遇到一个奇葩.每次到代码提交测的通知就着急忙慌的催促组员赶紧干活,开始严重加班,晚饭都不吃 ...
- 使用MSBuild实现完整daily build流程
一.MSBuild 在微软软件开发中,每日构建是最重要的过程之一,被称为微软产品开发的“心跳”.简单来看,每天构建系统将整个产品解决方案完整构建一遍,生成的目标文件和安装文件被放置在一个共享位置.接着 ...
- Daily Build[called heart beat]
###Daily Build->Object File&Binary File->Deploymened on release server->BVT Automation. ...
- 每日构建【Daily Build Using CruiseControl.NET and MSBuild】(转载)
在上一篇项目 管理实践教程二.源代码控制[Source Control Using VisualSVN Server and TortoiseSVN]中 我们已经讲解了如何使用TortoiseSVN和 ...
- 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
在上一篇项目管理实践教程二.源代码控制[Source Control Using VisualSVN Server and TortoiseSVN]中我们已经讲解了如何使用TortoiseSVN和Vi ...
- Asp.net Daily Build by MsBuild
:: 目录结构:: +GW.Point.BLL --dir dll:: +GW.Point.IBLL --dir dll:: +GW.Point.DAL --dir dll:: +GW.Point.I ...
- TFS Build Definition
1. TFS Build 简介 在团队项目开发中,编译常常是一个很困难的事情! 可能你会反问编译有什么难的?不就是右键,然后点击 Build/Rebuild, 或者直接按 F5 么?这都不会,真不知 ...
随机推荐
- Window下python2.7+Apache+mod_wsgi+Django服务器配置
前言:试着使用python搭建一个网页,分别在windows下和linux下,本篇文章主要讲解Window下python+Apache+mod_wsgi+Django服务器配置过程中遇见的问题和解决方 ...
- J2EE基础之Servlet
J2EE基础之Servlet 1. 什么是Servlet? Servlet即Java服务小程序,是使用应用程序设计接口以及相关类和方法的Java程序.它可以作为一种插件,像Applet程序一样嵌入到 ...
- Sql server2012 常见异常处理
网络相关 无法通过IP(127.0.0.1 或者其他本机)连接 确保TCP/IP功能开启 打开1433端口 权限相关 代理的权限,通过更改有最高权限的用户,或者给该用户指定的权限 给域用户开通SQLS ...
- Redis学习总结
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,其实当前最热门的NoSQL数据库之一,NoSQL还包括了Mem ...
- Java迷宫游戏
缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...
- Java设计模式之单例
一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ...
- Spring多种注入方式及注解实现DI
一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...
- winform修改、打开窗体、构造函数传值
制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...
- Eclipse使用svn文章列表
http://www.cnblogs.com/duanxz/p/3334660.html http://www.cnblogs.com/duanxz/p/3334660.html http://130 ...
- c语言函数
听着函数这两个字多多少少都会觉得有点复杂吧.因为一想到函数大多数人都会想到f(x),但其实c语言里面的函数不是那样的,老师教了一个很好的理解方法函数就是个机器人,而这个机器人是你自己做出来的.所有不用 ...