给iOS工程增加Daily Build

给iOS工程增加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 -usageUsage: xcodebuild [-project <projectname>] [[-target <targetname>]...|-alltargets] [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>]... [<buildaction>]...       xcodebuild [-project <projectname>] -scheme <schemeName> [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>]... [<buildaction>]...       xcodebuild -workspace <workspacename> -scheme <schemeName> [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>]... [<buildaction>]...       xcodebuild -version [-sdk [<sdkfullpath>|<sdkname>] [<infoitem>] ]       xcodebuild -list [[-project <projectname>]|[-workspace <workspacename>]]       xcodebuild -showsdks

一般情况下的命令使用如下:

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_PATHmkdir -p ipa/Payloadcp -r ./DailyBuild-iphoneos/$PRODUCT_NAME ./ipa/Payload/cd ipazip -r $FILE_NAME *

生成安装文件

苹果允许用 itms-services 协议来直接在 iphone/ipad 上安装应用程序,我们可以直接生成该协议需要的相关文件,这样产品经理和测试同学都可以直接在设备上安装新版的应用了。相关的参考资料可以见:这里 和 这里

具体来说,就是需要生成一个带 itms-services 协议的链接的 html 文件,以及一个 plist 文件。

生成 html 的示例代码如下:

cat << EOF > install.html<!DOCTYPE HTML><html>  <head>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    <title> 安装此软件 </title>  </head>  <body>    <ul>      <li> 安装此软件:<a href="itms-services://?action=download-manifest&url=http%3A%2F%2Fwww.yourdomain.com%2Fynote.plist">$FILE_NAME</a></li>    </ul>    </div>  </body></html>EOF

生成 plist 文件的代码如下,注意,需要将下面的涉及 www.yourdomain.com 的地方换成你线上服务器的地址,将 ProductName 换成你的 app 安装后的名字。

cat << EOF > ynote.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>items</key>   <array>       <dict>           <key>assets</key>           <array>               <dict>                   <key>kind</key>                   <string>software-package</string>                   <key>url</key>                   <string>http://www.yourdomain.com/$FILE_NAME</string>               </dict>               <dict>                   <key>kind</key>                   <string>display-image</string>                   <key>needs-shine</key>                   <true/>                   <key>url</key>                   <string>http://www.yourdomain.com/icon.png</string>               </dict>           <dict>                   <key>kind</key>                   <string>full-size-image</string>                   <key>needs-shine</key>                   <true/>                   <key>url</key>                   <string>http://www.yourdomain.com/icon.png</string>               </dict>           </array><key>metadata</key>           <dict>               <key>bundle-identifier</key>               <string>com.yourdomain.productname</string>               <key>bundle-version</key>               <string>1.0.0</string>               <key>kind</key>               <string>software</string>               <key>subtitle</key>               <string>ProductName</string>               <key>title</key>               <string>ProductName</string>           </dict>       </dict>   </array></dict></plist>

EOF

定时运行

这一点非常简单,使用 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 = ‘[email protected]‘receivers = [‘[email protected]‘]

message = """From: Alert <[email protected]>To: Some one <[email protected]>Subject: SMTP email sample

Hope you can get it."""

try:    obj = smtplib.SMTP(‘server.mail.devtang.com‘)    obj.sendmail(sender, receivers, message)    print ‘OK: send mail succeed‘except Exception:    print ‘Error: unable to send mail‘

上传

daily build 编译出来如果需要单独上传到另外一台 web 机器上,可以用 ftp 或者 scp 协议。如果 web 机器悲剧的是 windows 机器的话,可以在 windows 机器上开一个共享,然后用 mount -t smbfs 来将这个共享 mount 到本地,相关的示例代码如下:

mkdir uploadmount -t smbfs //$SMB_USERNAME:[email protected]$SMB_TARGET ./uploadif [ "$?" -ne 0 ]; then    echo "Failed to mount smb directory"    exit 1fimkdir ./upload/$FOLDERcp $FILE_NAME ./upload/$FOLDER/if [ "$?" -eq 0 ]; then    echo "[OK] $FILE_NAME is uploaded to $SMB_TARGET" else    echo "[ERROR] $FILE_NAME is FAILED to  uploaded to $SMB_TARGET" fiumount ./upload

遇到的问题

本来我写的自动化脚本在 Mac OS X 10.6 下运行得很好。但是升级到 lion 后,脚本在手动执行时很正常,但是在用 crontab 启动时就会出现找不到开发者证书的错误。在网上搜了很久也没有找到解决办法。最后我试了一下在 “钥匙串访问” 中把开发者证书从 “登录” 那栏拖动到 “系统” 那栏,居然就解决了,如下图所示:

另外我搜到 2 个类似的问题的解决方案,虽然对我这个没起作用,也一并放在这儿,或许对遇到类似问题的人有帮助:

总结

将以上各点结合起来,就可以用 bash 写出一个 daily build 脚本了。每天这一切都会自动完成,心情相当好。

时间: 2024-12-25 19:16:49

给iOS工程增加Daily Build的相关文章

为iOS项目添加Daily Build

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

如何将 iOS 工程打包速度提升十倍以上

如何将 iOS 工程打包速度提升十倍以上 过慢的编译速度有非常明显的副作用.一方面,程序员在等待打包的过程中可能会分心,比如刷刷朋友圈,看条新闻等等.这种认知上下文的切换会带来很多隐形的时间浪费.另一方面,大部分 app 都有自己的持续集成工具,如果打包速度太慢, 会影响整个团队的开发进度. 因此,本文会分别讨论日常开发和持续集成这两种场景,分析打包速度慢的瓶颈所在,以及对应的解决方案.利用这些方案,笔者成功的把公司 app 的持续集成时间从 45 min 成功的减少到 9 min,效率提升高达

iOS工程 与 资源文件 和 Bundle

在简单的app中,可能只会用到工程,但是项目越大,越复杂,就会需要拆分项目,将各个功能拆散到各个工程中. 可以使用worksapce来管理工程集合. 但是资源文件却不好管理,因为xcode默认只能添加自己工程内,或者子工程的资源文件到target中. 如果是平级的工程,怎么添加呢?可以使用bundle bundle虽然是os x中的资源类型,但是是兼容iOS的 我们可以先创建一个os x的bundle,然后修改其编译类型为iOS的 调整base sdk即可 然后添加资源文件(png,xib,st

iOS工程中的info.plist文件的完整研究

原地址:http://blog.sina.com.cn/s/blog_947c4a9f0100zf41.html 们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除. 如果你在网上下载的工程中的这个文件名只是Info.plist,那么恭喜你,这个工程太老了,是用包含SDK2.0以前的Xcode生成的,不过没关系,不影响使用. 如果你使用文本编辑器打开这个文件,你会发现这是一个XM

使用脚本删除ios工程中未使用图片

最近在读唐巧大神的<iOS开发进阶>,学到了一个大招:使用脚本删除ios中未使用的图片(纸书上有点小问题,参考github上的issue:使用脚本删除ios中未使用图片). issue中得到的建议是:将代码保存在一个.sh文件中,在xcode里面执行shell脚本文件.看到这里,头瞬间大了,大学学的shell都还给linux老师了....还有xcode中怎么执行脚本啊??? google一下,找到mac下创建.sh文件的小白方法:教你在mac上面创建可执行脚本文件.当然还有XCode中执行脚本

GJM : Unity3D HIAR -【 快速入门 】 六、导出 iOS 工程

导出 iOS 工程 在开始之前,请务必先保存您的工程.由于 Unity 无法直接生成 ipa 文件,您需要先导出 iOS 工程文件,然后通过 Xcode 编译生成. Step 1. 选择平台 在 Unity 中,点击 File > Build Settings-,在弹出的 Build Settings 对话框中选择 iOS 平台,并点击 Switch Platform,点击 Add Current 将当前工程添加到 Scene In Build 窗口中(请确认已勾选). Step 2. iOS

用python编写ios工程自动编译、打包ipa等脚本

第一次使用python请先看:http://my.oschina.net/LangZiAiFer/blog/298763 代码管理我用的是Git: 工程clone如下: def gitClone(): os.system ('git clone https://[email protected]/xxx/goccia.git ~/desktop/20140804') return https://[email protected]/xxx/goccia.git是git服务器路径,不必care:~

编译依赖于React Native0.46.4的React Native IOS工程时,出现错误“fatal error: &#39;React/RCTEventEmitter.h&#39; file not found”

我的环境: WebStorm 2017.2Build #WS-172.3317.70, built on July 14, 2017 JRE: 1.8.0_152-release-915-b5 x86_64JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o Mac OS X 10.12.6 Xcode8.3.3(8E3004b) 网上搜索,可以解决我的问题的网址:https://stackoverflow.com/questions/41663002

IOS工程自动打包并发布脚本实现

http://blog.csdn.net/ccf0703/article/details/8588667 文章首发地址:http://webfrogs.me/2013/02/18/ios-automation/ 作者:webfrogs 转载请注明出处. 前言 IOS的开发过程中,当需要给测试人员发布测试包的时候,直接使用xcode来做的效率是非常低下的.尤其是当有一点小改动需要重新出包时,那简直是个折磨的人的工作.通过一番研究后,遂决定写一系列脚本,以代替人工完成打包和发布的过程. 目前脚本已经