iOS 中使用Jenkins进行持续集成

http://www.cocoachina.com/ios/20170607/19464.html


从长远来看,重复单一易出错的操作将慢慢被机器所取代,具体到软件开发中就是,每次打包送测等操作是可以交给机器去自动执行的。以前打包给测试的流程是,测试拿了好几个手机过来,开发一一安装,然后送给测试慢慢测试。使用了持续集成之后将变成,开发本地提交代码,Jenkins等持续集成工具监测到代码变化,自动编译打包,生成开发包,测试直接拿着开发包安装测试即可。

Jenkins做的操作其实很简单,它只是将我们平时做的每一步重复的操作自动化了而已。因此,iOS中Jenkins要做的分为以下几步:
1.拉取远端代码
2.由于某种条件触发后开始自动编译,打包
3.将生成的ipa文件上传到指定位置,供测试下载测试
这三步中,每一步Jenkins什么都没做,它只是调用了Mac中的一些工具,具体的说就是使用了命令行工具。有的做成了可视化的插件,有的还是要通过自己写命令来实现。典型的就是编译和打包的命令是调用xcodebuild命令。

登录Jenkins官网下载Jenkins,需要注意的是在下载的时候勾选Mac平台下的PKG包,毕竟这是专门为Mac平台设计的。如下图
QQ20170122-0.png
下载下来以后,双击即可安装。安装时第一步是输入密码:
1111111.png
我们打开terminal,执行cat命令即可(需要管理员权限)。
111.png
下面的操作就等它完成即可。
2222222.png
安装好后的页面大概是这样
00.png

我们选择【系统管理】----【系统设置】,看看里面的一些配置信息。这边不截图了,大概说一下原理。
Jenkins安装好后会自己新建一个jenkins 用户,估计是出于易于管理的考虑,但对我们的一些操作影响还是蛮大的。也就是说,我们在Jenkins做的任何操作都是基于jenkins这个用户的,“~”代表的也不是管理员用户,而是jenkins用户目录,更多的具体的配置我将在稍后的配置中加以说明。

接下来,我们就可以开始创建项目了,点击【新建】,输入项目名称,这里我输入我的GitHub里的一个项目AutoLoadImageView。然后选择【构建一个自由风格的软件项目】,其他我没有试过,如果有兴趣的话你可以尝试一下,点击保存后便进入到详细设置页面,暂时做如下的设置并【保存】即可
QQ20170122-1.png

QQ20170122-2.png

点击【立即构建】,然后切到命令行查看,可以发现代码已经拉取到本地了。
QQ20170122-3.png
以上操作其实已经证明跑通了Jenkins拉取代码到本地的操作。当然仅仅这样还不能帮我实现自动编译,打包甚至上传的操作,需要我们在配置中做更多的设置,最起码证书和profile文件还没有设置。
回到配置页面,点击【构建模块下的execute shell】
QQ20170122-4.png
我们在出现的shell输入框中输入两个命令,看看我们之前的是否正确:
whoami
pwd
然后保存,并点击【立即构建】
QQ20170122-5.png
可以看到,当前用户确实是jenkins用户,当前的目录就是本项目的目录。

接下来本文的重点来了,我们要做的是编译打包,并生成ipa文件。在打包之前,我们要了解一个命令
xcodebuild 这是apple提供给我们的编译打包命令,具体的参数大家点进去看就可以,我这边说一下最重要的几个参数,以下是我们公司打包的参数,我这边拷进来供大家参考,原谅我敏感信息打码处理
QQ20170122-6.png

可以看到,这里xcodebuild命令执行了两次,第一次是设置编译打包的参数,第二次是设置输出目录等。$project_name是笔者先前声明的项目名称变量,也就是说,如果你的项目名称是A,那么请在上面这段shell前加这么一句

# 工程名
project_name="A"

这样一来,下面shell脚本中所有出现的$project_name都会被替换成"A"(不包含引号)

其中
1.-workspace 指明的是工作空间的名称,如果指明了这个参数,那就必须要指明-scheme参数
2.-sdk,ENABLE_BITCODE 不多说了,看参数名就知道了
3.CODE_SIGN_IDENTITY 这个比较重要,他指明的是证书标识符。这个是从钥匙串中拷过来的,有一点需要注意的是,我们需要将自己的开发证书先拷贝到系统证书中。这是因为钥匙串中的证书拥有者是管理者,不是jenkins用户,jenkins用户是没有权限操作证书的
QQ20170122-8.png
4.PROVISIONING_PROFILE_SPECIFIER看名字就知道是profile文件,同上,我们需要将管理员目录中的profile拷贝到jenkins的profile目录中,其中管理员profile目录在:
/Users/kyson/Library/MobileDevice/Provisioning Profiles/ (根据实际情况,将kyson改成你的用户目录)
jenkins的profile目录位于(如果没有相应目录则自己建):
/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles/(如果你没有访问Library目录的权限,记得使用chomod命令添加相应的权限)
1111111111.png
有读者问道不知道自己的证书对应的profile是哪个,因为Provisioning Profiles 目录下有好多的文件,这里笔者也没有什么特别好的方法,推荐的是,先删除掉本地的所有profile文件,然后自己到苹果官网下载对应的profile文件,安装以后,就可以在Provisioning Profiles目录下看到相应的文件名了。虽然有点笨,但很保险,有新的办法还请赐教,谢谢^_^。
5.archive -archivePath ./$project_name.xcarchive
根据需要指定打包路径,其中扩展名记得要是.xcarchive (其中$project_name是笔者在shell中声明的一个变量,比如,你的项目的名称是A,那么对应的打包文件就是A.xcarchive)
有读者写成了archive - ./$project_name.xcarchive 请注意,这是错误的。因为-archivePath是archive的子命令,archive命令用于告诉编译器,这里是要执行打包命令,后面的archivePath子命令指定打包路径
6.-configuration Release 这个不是必须的,因为默认打的就是Release包,倒是如果你想打Debug包可以单独设置
7.-destination generic/platform=iOS 也是指明打包的类型

接下来的就是指明打包的路径了
8.-exportArchive -archivePath ./$project_name.xcarchive 同上,不赘述了
9.-exportOptionsPlist archieveOpt.plist 这里的archieveOpt.plist,是我们要自己新建的plist文件,该文件是用于指明打包的类型和teamid
QQ20170122-9.png

        teamID    C9YH4WL4***    method    development

可以看到这个plist中有两个字段,一个是teamID,一个是method,teamID很好理解,就是打包使用的证书的teamID
QQ20170123-0.png
method对应的是打包类型,一般有development,distribution等选项可供选择

10.-exportPath ./ 指明ipa的输出目录就在当前目录,可以根据需要进行自行调整
保存以上编辑,点击【立即构建】不出意外的话就能编译打包成功了,可以看到在Jenkins的工作目录中多了两个文件:
QQ20170123-1.png
其实准确的说是两个包,其中.xcarchive 包中包含了dsym符号表文件和app文件,ipa是我们最终需要的打包文件。
至此,所有的流程已经圆满成功。


Jenkins打包真是个耐性子的活,跟技术关系不大,因此我还会再贴一些小细节,如果我能想起来的话~

在公司的真实开发过程中很少会将代码上传到Github的,一般来说是公司内部的Gitlab服务器,大概的流程是一样的,主要是ssh需要重新生成。原因也不言而喻了:以前的ssh针对的是管理员用户,现在如果jenkins用户想要push代码到远端,那肯定需要给jenkins用户添加ssh,方法也是很简单的
QQ20170123-2.png
首先要切到jenkns用户,然后进入到.ssh文件夹,最后调用ssh-keygen 命令(本人机子已经生成过了,因此有id_rsa和id_rsa.pub等文件)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值