持续集成是敏捷开发中重要的一部分,为保证新功能的开发,又保证旧功能的维护,从一个冲刺到下个冲刺。持续集成工具是咱们保证开发和维护并行的护航者,如今流行的集成工具备不少,例如:html
1.Jenkinsjava
2.Buildbotgit
3.Travis CIshell
通过对比,Jenkins工具搭建相对简单(仅指安装),打包速度也比较快,获得不少朋友的青睐,因此本文是以描述Jenkins搭建环境为主旨。(踩了好多坑啊哈哈哈)xcode
在写本文以前,我以为有必要提一下Jenkins 对一个团队的好处。浏览器
最简单粗暴的好处就是下降 开发团队与测试团队的耦合,Jenkins也支持定时自动打包,上传等,省去了“修改配置项--编译---链接设备--运行打包--装ipa--而后交给等待的测试人员”这些简单繁琐的步骤。也避免测试人员测错包之类,把开发已经修改的bug打回来这种问题。服务器
注意:打包ipa包须要有xcode环境,因此要想在公司的服务器配置iOS打包环境,要求服务器必须是Mac OS系统,Linux和Windows只能靠边了。我是在一台Mac mini 下配的环境。oracle
步骤大体能够分为如下几步:app
1.搭建Java环境iphone
2.搭建Jenkins环境
3.配置证书和描述文件、钥匙串
4.配置项目
5.配置xcode 环境
浏览器打开 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择Mac OS 的安装包下载,JDK安装都很简单,安装过程这里就省略了。
浏览器打开 Jenkins官网 点击下载Jenkins,选择Mac OS安装包,我如今装的是2.46.1
接下来就是傻瓜式的下一步安装,这里就不一一贴图了。
安装完成后浏览器通常会自动打开 http://localhost:8080,若是不自动打开能够手动打开这个连接,而后会提下下列的错误信息
顾名思义,咱们要去log路径下取到password,输入才能进入Jenkins。右键 Finder->前往文件夹->输入/Users/Shared/Jenkins/Home 回车后应该看到下面
看到secrets文件是有个减号的,右键secrets->显示简介->共享与权限->将everyone权限改为 读与写。
双击点开secrets以后应该以下所示:
同理,由于咱们没有initialAdminPassword的读写权限是没法打开的,右键 initialAdminPassword->显示简介->everyone权限改为读与写
而后用文原本打开initialAdminPassword,把里面那串数字复制,把这串数字填到Jenkins启动的那个页面,若是你不当心关了上面那个页面,打开http://localhost:8080便可。
而后continue,这时会看到如下页面,选择红色框里的 Install suggested plugins(Jenkins建议安装的插件)
看到这个页面以后,等待Jenkins把插件下载完
这里建立下Admin User,把这些项都填完以后点击save and finish就OK了。注意要记得用户名和密码,之后你登陆要用到的,忘记密码就麻烦了。
到这步已经说明Jenkins环境已经搭建好了。点击start using jenkins
这时须要配置一下插件,系统管理->管理插件->可选插件
由于项目是配置svn为管理器的,git管理代码的能够参照其余同窗的教程自行配置。咱们先下载svn插件,在过滤输入框中输入svn,勾选 SVN Publisher plugin。点击直接安装。
同理,咱们要下载 xcode integration 和keychains and Provisioning Profiles Management 这两个插件。
把这两个搜索出来,勾选而后直接安装。而后等待完成
安装完成后咱们重启下jenkins,从新加载下插件。能够滑到最底下勾选重启,或者也能够在地址栏输入http://localhost:8080/restart
重启以后应该要输入用户名和密码,把刚刚注册的用户名密码输入进去。
还有一个重要的步骤,咱们先给Jenkins用户管理员的权限,避免后续的访问问题。
系统偏好设置->用户与群组->点开锁,而后在Jenkins用户下勾选“容许用户管理这台电脑”。
到这步最好给Jenkins用户设置一个密码,便于后期检查是否Jenkins配置错误或者是检查代码错误。
点击系统管理->keychain and provision Profiles Management
在这以前,我准备了开发证书.p12 + 描述文件,生产证书.p12 + 描述文件,分别用来上线打包和测试打包。这步并不须要咱们上传证书,而是上传须要描述的文件和login.keychain。login.keychain有坑!有坑!有坑!!!!! 以前我是把login.keychian 复制到桌面而后上传的,构建的时候老是报错keychian 权限问题。而后我是按照如下方式来作的。
在此以前先普及一下,jenkins实际上是本身开了一个用户,用于存储一些配置文件和信息等。咱们能够在finder里面找到Jenkins用户的文件夹,点击前往/Users/Shared/Jenkins
1.Finder->前往文件夹->/Users/“你的mac用户名”/library
2.找到keychains 这个文件夹,拷贝
3.用上面那种方法放到Jenkins->Library文件夹下
为了不描述文件也出现相似的找不到的错误,咱们也把描述文件拷贝到Jenkins用户->Library。
1.Finder->前往文件夹->/Users/“你的mac用户名”/library(或者还有一个方法,打开xcode->preferences->找到你帐号下的描述文件)
2.找到keychains 这个文件夹,拷贝"MobileDevice"整个文件夹
3.用上面那种方法放到Jenkins->Library文件夹下。
接下来就是上传keychain和描述文件了。
这里咱们选刚刚拷贝过去的Jenkins文件目录下的keychain和描述文件。点击选取文件->搜索login.keychain,这里要注意下是否为Jenkins目录下的keychain。
上传完以后打开钥匙串,找到我须要上传的两本证书的名字,由于我想上传一个开发证书和一个生产证书,因此上传两个。把这两个证书的名字复制下来
而后点击 Add Code Signing Identity,分别把这两个名字粘贴过去。完成了以后大概以下:
接下来就是描述文件了。这里要注意一点,在Provisioning Profiles填上/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles这个地址。而后按照上传keychain的步骤,把Jenkins用户目录下的描述文件上传上去就行啦
完了以后是这样的。
keychain配置好以后,接下来就是新建一个工程了。输入你的项目名称(项目名称会在Jenkins下生成一个文件夹)。构建一个自由风格的软件项目,点击ok
新建完以后点选丢弃旧的构建,配置一下保持构建的天数和最大个数
而后配置源码管理,这是Jenkins拉取代码的路径(尽可能精确到项目位置),若是Credentials没有,则点击右边的add,填上本身的svn帐号和密码。假如这栏没有报红,基本上地址什么的都是正确的了。
接下来配置构建环境,这里咱们勾选Keychains and Code Signing Identities,选择login.keychain,而后选择对应的证书名字。一样勾选Mobile Provisioning Profiles,选择对应的描述文件。
由于我项目用到cocoapods,因此要先在构建这里选执行脚本,在里面输入
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/你的项目名称
/usr/local/bin/pod update --verbose --no-repo-update
注意:没有#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8 /usr/local/bin/ 这几句可能会形成编译器读不懂pod语句。当你构建的时候提示pod语句出错,百分之九十都是这个错误。
接下来添加xcode构建工具
首先配置General,这里又有一个坑!!!!输出路径必须是workspace路径下的,而后会报权限不够等之类的问题
以后是Code signing & OS X keychain options
接下来是配置 Advanced Xcode build options。
tips:jenkins会在它的目录Home->workspace下建一个文件夹,这个文件夹名字就是你的项目名字(好比你的项目名字叫JenkinsProj,那么会存在Jenkins->Home->workspace->JenkinsProj这个文件夹)。${WORKSPACE}通常都会到Jenkins建立的文件夹下。
Build output diretory 仍是老实点写在workspace下比较好,由于Jenkins建立的目录我以为足够清晰了。以前我写在另外一个用户下就会报权限问题。
通常这样配置完就能够成功打包了,在整个配置过程当中,都不能粗枝大叶或者自觉得是的随意配置。可能文章还有写的不够的地方或者错误的地方,欢迎你们指正完善。也但愿你们把遇到的问题多多分享一下~
注意:升级 Xcode 9 以后,编译完成以后打包会一直报以下所示的错误:
error: exportArchive: "APPNAME.app" requires a provisioning profile with the Push Notifications feature.
Error Domain=IDEProvisioningErrorDomain Code=9 ""APPNAME.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="APPNAME.app" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
** EXPORT FAILED **
Failed to build /Users/Tolecen/.jenkins/workspace/APPNAME/build/APPNAME_release.ipa
Build step 'Xcode' marked build as failure
Finished: FAILURE
由于 Xcode 9 默认不容许访问钥匙串的内容,必需要设置 allowProvisioningUpdates 才会容许,可是因为 Xcode integration 插件封闭,并不能对其进行修改加上这个属性,因此决定使用 Shell 脚本代替插件。
将 Jenkins 项目里的 Xcode 构建步骤去掉,使用下面所示的命令:
xcodebuild -archivePath "/Users/USERNAME/.jenkins/workspace/APPNAME/build/Debug-iphoneos/APPNAME.xcarchive" -project APPNAME.xcodeproj -sdk iphoneos -scheme "SCHEMENAME" -configuration "Debug" archive
xcodebuild -exportArchive -archivePath "/Users/USERNAME/.jenkins/workspace/APPNAME/build/Debug-iphoneos/BasketballLeague.xcarchive" -exportPath "/Users/USERNAME/.jenkins/workspace/APPNAME/build/APPNAME_debug" -exportOptionsPlist '/Users/USERNAME/.jenkins/workspace/APPNAME/build/ExportOptions.plist' -allowProvisioningUpdates
若是是 workspace 的项目,那就将上面第一段的命令中 -project APPNAME.xcodeproj 修改成 -workspace APPNAME.xcworkspace 便可。
再着重说明一下 ExportOptions.plist,这个文件以下所示:
里面的有 Bundle Id, ProvisioningProfiles 和 teamID 的信息,对应填写上便可,若是不肯定,那就先用 Xcode 9 手动打包你的项目,而后导出,导出的文件夹里会有这个文件,直接复制到你持续集成须要的路径中便可。
相似下面的钥匙串错误,我给你们个tips:
一、钥匙串无非是两个地方设置和用到,分别为系统管理->Keychains and Provisioning Profiles Management 和 项目配置里面->构建环境下的Keychains and Code Signing Identities 这两个地方去找,看有没有不匹配的地方,或者按照上面说到的相应步骤从新来。
相似下面的错误,通常先要检查项目配置里面->构建->Execute shell 有没有写错。
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/你的项目文件
/usr/local/bin/pod update --verbose --no-repo-update
若是这样写还不行,mac注销当前用户,进入Jenkins用户,看是否安装了cocoapods,若是没有安装,须要安装一下,而且版本要与当前用户一致(Jenkins用户的密码能够在系统偏好设置->用户与群组设置。)
遇到Xcode终止打包这时进入Jenkins用户,在Jenkins下编译看有没有问题。若是有问题,这时候就要检查下你svn上的项目是否正确了。
打开Xcode->manageSchema,把share勾上