持续集成?
持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
先看下我的需求
- 持续集成,
- 使用cocoapod管理第三方控件,
- 使用pgy分发,
- 同时管理三个版本(内测版,开发版,AppStore上线版),并且每个版本都要做到尽量高自动化的持续集成
再来看看思路
- 使用Jenkins进行持续集成
- 使用多Scheme管理多版本,并通过配置Jenkins编译不同的Scheme做到多版本自动化持续集成
- 当然持续集成的前提是单元测试尽量覆盖全面
有了思路就一步一步做吧。
1. 准备好xcode项目scheme配置,做到各个版本分离
- 添加两个scheme
我们在项目里需要有两个 Scheme. 这两个 Scheme 在 Debug 时候的行为是一样的, 但在 Archive 的时候, 一个用于 Staging 版本发布内部测试, 一个用于 App Store 发布.
Scheme 的设置入口在菜单上: “Product” -> “Scheme” -> “Manage Schemes”. - 添加新的编译配置 ForBeta
- 设置scheme对应的编译配置
对应 App Store 的 Scheme 设置里, Run 和 Test 的 Build Configuration 都使用 Debug, Profile 和 Archive 使用 Release.
对应 Staging (Beta) 的 Scheme 设置里, Run 和 Test 也用 Debug, Profile 和 Archive 使用 ForBeta.
- 不同的版本使用不同的icon
接着就是 Icon. 现在大家应该都用 Xcode 5 了吧! 既然用了, 那就多用用新功能, Icon 设置这块我使用了 Media Assets. 如果你的老项目还没有启用, 那就麻烦你在对应 Target 的 General 下启用一下.
在 Media Assets 中 (在项目中的默认名字应该是 Images.xcassets), 点击菜单 “Editor” -> “New App Icon”, 建立两个新的 App Icon, 分别对应 Debug 和 Staging 版本. 然后把之前准备好的图标分别拖进去. 如图:
设置好 Media Assets 后, 还要在对应 Target 的 Build Settings 里分别设置不同版本使用不同的 App Icon. 如图:
这样设置好, 不同版本的应用就拥有了各自不同的图标了. - Bundle ID
再下来就是按照我们前面定义的 Bundle ID 和各个版本的对应关系来进行设置了.
我们需要在 Build Settings 中定义一个变量. 入口在: “Editor” -> “Add Build Setting” -> “Add User-Defined Setting”.
然后在对应 Target 的 Info 里把 Bundle ID 设置为我们刚才定义的变量.
这样, 项目在使用不同的配置文件编译的时候就能分别利用不同的 Bundle ID 了. - appName
设置了图标, 如果觉得有必要把应用名称也顺便区分一下的话, 也是可以的.
我们需要在 Build Settings 中再定义一个变量. 比如我是这么定义的:
然后在应用名称的设置那里使用这个变量:
到此为止,我们就可以选择不同的scheme进行编译不同的版本了,下面做持续集成
2. 安装Jenkins
因为 Jenkins 的pkg安装包默认安装位置为shared文件夹,需要权限修改,pod install 无法执行sudo命令,所以放弃pkg安装。
安装之前由于运行Jenkins时会自动寻找home路径,提前设置好JENKINS_HOME
在/etc/profile
添加一行
export JENKINS_HOME="/Users/yourname/jenkins"
直接下载war包放到个人目录
/Users/yourname/jenkins
使用命名
java -jar jenkins.war --httpPort=8008 &
source /etc/profile
安装并运行打开localhost:8008 进入到jenkins->系统管理->管理插件安装两个插件 cocoapod 和 xcode,一个是用来管理依赖库的,一个是进行xcode编译选项设置的
这里有一个选项 xcode schemes file,你可以选择填写你在项目利配置好的xxxx-Beta
这样就可以打包不同版本的ipa了
.ipa filename pattern ipa文件名称,写到跟jenkins项目名一样,便于区分,而且下面python脚本也会用到定位该文件
target ->Configuration 这里可以根据配置写ForBeta ,Debug, Release添加构建步骤 Execute Shell 进行单元测试
先安装ocunit2junit插件,生成jenkins可见的测试报告,然后添加shell
if [-d "test-reports"]
then
rm -rf test-reports
fi
xcodebuild test -workspace yourProject.xcworkspace -scheme yourscheme -sdk iphonesimulator | ocunit2junit使用python脚本进行pgy上传和通知邮件发送
添加构建步骤 Excute Shell
python ${JENKINS_HOME}/workspace/pgyUpload/pgyDevUpload.py
脚本 中可以做如下修改,进行不同的版本分辨上传道不同的pgy上
if 'jenkins-MNCats-Dev' in jenkins_build_number:
uKey = '开发key'
_api_key = '开发api'
projectName = '与你在jenkins中写的项目名称相同,例:xxx-Dev'
print projectName
pass
if 'jenkins-MNCats-Alpha' in jenkins_build_number:
uKey = 'alphakey'
_api_key = 'alphaapi'
projectName = '与你在jenkins中写的项目名称相同,例:xxx-Alpha'
print projectName
pass
if 'jenkins-MNCats-AppStore' in jenkins_build_number:
uKey = 'AppStore版本pgy key'
_api_key = 'AppStore版本api key'
projectName = '与你在jenkins中写的项目名称相同,例:xxx-AppStore'
print projectName
passdef get_ipa_file_path():
ipa_file_workspace_path = '/Users/yourname/jenkins/workspace/'+projectName+'/build/'+projectName+'.ipa'
if os.path.exists(ipa_file_workspace_path):
return ipa_file_workspace_path
ok,到此位置我们基本达成了我们的目的,每天鼠标一点,就可以交版本下班了~
参考:
* http://www.jianshu.com/p/269d8d66472d
* http://nickcheng.com/post/unique-icons-for-your-app-in-different-state-in-xcode5-debug-release