IOS使用Jenkins进行持续集成
本文主要讲述在开发过程中,提高工作效率而进行的IOS-Jenkins的持续集成。
背景
平时我们开发完成IOS项目,需要打包给测试人员进行测试。其中的过程需要重复进行:修改配置项--编译---连接设备--运行打包--debug进设备中--然后交给等待的测试人员。现有成熟的持续集成Jenkins解决方案,并且该方案也提供了Xcode插件的支持,可以讲上述过程封装成一键解决方案。
我实现的是jenkins执行IOS的job,build工程,签名打ipa包,上传到FTP服务器,放到tomcat下,提供http下载安装app。
过程
1.下载安装jenkins
官网地址:https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins#InstallingJenkins-Unix%2FLinuxInstallation
下载之后,是个war包(后台服务),是要求有jdk的。
然后直接点击jenkins.war即可运行,访问http://localhost:8080/即可
也可通过命令行运行 java -jar jenkins.war --httpPort=8888;http://localhost:8888/
也可以放到tomcat下面。
运行起来后,会在user下创建一个.jenkins目录。
2.增加Xcode插件
在jenkins的系统管理中,找到管理插件,可选插件的tab下搜索xcode,勾选安装,安装插件/升级处等待?jenkins升级到最新版本了,xcode插件更好安装(如果失败请下载最新的jenkjins,或者多尝试几次)。
这样重启jenkins的话,就会在job的构建中下拉选择处看到xcode的支持选项。
3.新建job
新建一个free的job.
4.源码管理
如果使用svn,选择subversion,直接指向地址即可;如果没有使用svn,选择none,则需要先运行下job,这样jenkins的工作目录就创建了一个结果failed的job,目录为.jenkins/jobs/你的job名字/。这时候,job下的目录还有builds,workspace等目录文件,我们需要的就是往workspace中放入我们的代码工程(这是官方的解决方案)。
目录结构见下图。
这样workspace中就有了代码。
5.构建xcode项目
在增加构建步骤下拉中选择xcode。
如上图,简单配置参数,执行项目的target,Configuration为Debug(看情况选择Release),下面还有个Pack application and build .ipa选项,这个我没选。
下面还有个Code signing和钥匙链的选项,可以不填,会自动找默认的(项目中配置的吧,可以在运行时的console中看到执行的日志,输出中会有每一步做什么了)。
在下面还有个xcode的高级参数配置,如图:
scheme配置,以及需要build运行的SDK,这里选择iphoneos(这是要准备在真机上运行),还有构建的输出目录。
在这里说下模拟器的事项,这里不能配置成iphonesimulator,是因为没用,模拟器不能运行起来的,首先苹果unix命令能够启动模拟器,但是没有提供api来命令行方式往模拟器中安装ipa程序并运行(xcodebuild命令没有这个支持),上网找了个解决方案,发现是很久之前的了,4年前的,有个github的提供的插件,但是这个插件工程需要依赖iPhoneSimulatorRemoteClient.framework这个库,而现在的mac都搜不到这个库,所以不能运行,so命令行方式启动模拟器,并安装运行ipa的方式不行了,只能真机方式来了。
运行job,此时应该能出现当前的目录文件,那个ipa还出不来呢。
现在到这,说明jenkins的这个IOS的job已经能够基本ok了。
6.接着我们来实现打包ipa文件
上面那个xcode配置 pack application and build ipa我没选,那个还没搞清楚,它的输出目录上下文变成jenkins了,而实际生成的ipa在xcode的安装目录的很隐蔽的目录,这个暂时没搞清呢。
而我是通过shell来做的,命令行方式。
选择增加构建步骤,点击shell的,然后出现个命令行的输入框,见图。
按照图上的命令,选择sdk 打包app 指定输出目录文件,这样就能在build完成后出现上上图目录结构中的ipa文件,这个就是我们需要的安装程序了,经过签名的能再真机安装的。具体指定增加签名和描述的命令请看xrun的命令说明。
ok,我们已经完成了一大步了。
7.现在我们再来设置上传ftp的功能
mac电脑本身支持ftp服务的,并且发现了一个修改系统的便捷软件,lion tweaks,
找到右侧的ftp,开启即可。
我们需要设置一下jenkins的系统配置--系统管理链接在根路径左侧,点开然后选择系统设置,下来找FTP的配置项,见图:
我设置的自己电脑,所以localhost了。设置ftp的根路径root repository path,填入本机的用户名密码。
如图设置自己job的ftp服务,
见图,设置需要上传的文件以及其相应的目录,现在ipa程序文件的上传,我们需要将build目录生成后的ipa文件上传到ftp服务器的一个目录,我们为了后续通过tomcat服务进行手机下载,所以上传到tomcat的目录下。
上传成功会在tomcat下有此目录结构,见图:
这样我们上传文件到ftp服务器的就实现了。
8.Tomcat服务
然后我们需要设置tomcat服务,以方便手机可通过网页下载并安装我们的应用。
下载tomcat,进入tomcat的bin目录,执行命令,
sh startup.sh
启动tomcat。
新建一个简单的web项目,这个请简单看下web自己实现,然后放到tomcat的webapps下面,修改tomcat的访问端口8088,与jenkins8080冲突,这样我们访问tomcat的时候,
就能访问到我们的项目,http://localhost:8088/hello_jenkins2/index.jsp。
9.下载支持文件
现在说明我们的jenkins的job的ftp其他文件上传是干嘛,ios_down.html是提供一个网页,可以点击一个链接从而下载安装程序到手机。而相对的那个hello_jenkins.plist文件则是支持ipa文件下载到手机的文件。
ios_down的链接协议指向这个plist,
<a href="itms-services://?action=download-manifest&url=http://192.168.200.124:8088/hello_jenkins2/publish/hello_jenkins.plist"><h2>Install</h2></a>
这个hello_jenkins.plist里面说明并指向ipa
内容如下
<?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://192.168.200.124:8088/hello_jenkins2/static/build/Debug-iphoneos/HelloJenkins.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.hai.HelloJenkins</string>
<key>bundle-version</key>
<string>1.0</string>
<key>kind</key>
<string>software</string>
<key>subtitle</key>
<string>HelloJenkins</string>
<key>title</key>
<string>HelloJenkins</string>
</dict>
</dict>
</array>
</dict>
</plist>
这样,浏览网页ios_down.html的时候,点击上面的install标签,则指向hello_jenkins.plist文件,并解析再定位到ipa文件,手机同时提示下载安装hello_jenkins了,下载安装即可。
10.完成
手机访问
http://192.168.200.124:8088/hello_jenkins2/publish/ios_down.html
我的已经安装到手机了,就不发图了。
11.最后注意一些问题
注意路径问题,如果job的ftp文件上传路径,html文件和plist文件的路径有一点不对,都会造成无法访问等下载不了问题。
还要注意安装程序的base sdk与真机的兼容性,否则安不上。
注意ftp的上传目录是基于我们系统设置的用户目录下的。
还有就是如果上传文件的目录没对上,jenkins是不报错的,而输出日志提示not found 文件,所以多看看job的日志。
还有就是有时候plist文件明明是对的但是就是显示无法访问,请试试copy一份别处的plist文件,在修改内容,我的曾经出现过,copy一份就好了。
ps:
网上这方面的不多,自己花时间研究了下,奉献给大家了,还有一些疑点没弄清,后续再补充了。