三味猪屋

iOS持续集成之Jenkins

之前一篇关于iOS持续集成的文章iOS的自动化打包,文章主要介绍了iOS编译、签名的理论知识以及如何通过shell脚本调用第三方fastlane或者shell脚本调用Xcode提供的原生编译、签名命令进行打包、签名。
本篇介绍如果通过Jenkins构建打包任务、Jenkins远程登录以及Jenkins的Master/Slave架构。
1.1 Jenkins安装
Jenkins安装有几种方式:
a、通过pkg安装包安装
https://jenkins.io/content/thank-you-downloading-os-x-installer/#stable
b、直接下载Jenkins.jar
http://mirrors.jenkins-ci.org/war-stable/latest/jenkins.war
c、使用Homebrew安装
brew install jenkins
三种安装方式的优缺点:
a、通过pkg安装包安装:使用pkg安装虽然是一键,但是比较坑的是安装在Shared用户下,这样的话很多本机的配置如SSH key等会有一些权限问题,环境变量使用也不是很方便,一些配置需要在Shared用户上单独配置,好处是干净,但是Xcode已经是在当前用户下了,Shared用户的配置只能干净一部分吧,干脆点,安装在当前用户,不用 Shared用户了。这样很多配置是不用在Jenkins中配置的,如上方所详的SSH key,以及各种环境变量都是在当前用户下,配置好后在Jenkins中不需要再配置。
b、直接下载Jenkins.jar:直接运行 jar 是最简单的方式,不能再后台运行,总是开一个终端来运行 Jenkins 万一不小心关掉了就不好了,如果要后台运行,就需要重新开启。
c、使用Homebrew安装:使用Homebrew安装Jenkins只需要一条命令,并且不存在以上两种安装方式的缺点,不需要额外配置,开机自动启动Jenkins服务而不需要手动启动。
Homebrew安装Jenkins如下:
brew install jenkins

安装完成后可以使用 brew services 管理 Jenkins 启动
查看帮助说明

1.2 环境变量配置
终端输入以下命令,打开bash_profile文件
open ~/.bash_profile
主要配置各种环境变量
RVM环境变量:/usr/local/rvm/bin
ruby环境变量:/usr/local/rvm/rubies/ruby-2.3.0

注意
1、使用Jenkins调用pod命令报如下错误的解决办法就是在bash_profile中增加export LANG=en_US.UTF-8

2、$HOME目录下的配置文件里关于RVM的环境配置





1.3 Jenkins配置
启动Jenkins服务之后,在浏览器中输入
http://localhost:8080
使用Jenkins默认host和port


1.3.1 修改Jenkins的Host和Port
如果是通过brew install Jenkins方式安装的Jenkins时,修改Jenkins的host和port:
打开配置文件:/usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist,找到httpListenAddress和httpPort,即为要修改的host和port。
1.3.2 如何安装Jenkins默认没有的插件
需要去Jenkins plugins官网下载需要的Jenkins插件
官网:https://wiki.jenkins-ci.org/display/JENKINS/Plugins
例子:
例如需要安装Jenkins RVM插件
1、rvm插件地址:
https://wiki.jenkins-ci.org/display/JENKINS/RVM+Plugin
2、下载到本地后,会得到一个rvm.hpi的文件
3、插件管理-高级-上传插件-选取文件-上传



1.3.3 Jenkins运行脚本配置

1.4 Jenkins的Master/Slave架构
1.4.1 Jenkins的Master/Slave架构
Jenkins的Master/Slave架构可以有效解决分布式构建。Master提供web接口让用户来管理job和slave,job可以运行在master本机或者被分配到slave上运行。一个master可以关联多个slave用来为不同的job或相同的job的不同配置来服务。

众所周知,开发mac系统软件时,编译环境必须使用 Mac OS系统,为了解决Jenkins部署在非 Mac OS 系统中无法构建mac系统软件,故而引入Jenkins的Master/Slave分布式构建架构。
如何添加mac-slave结点:
https://wiki.jenkins-ci.org/display/JENKINS/Step+by+step+guide+to+set+up+master+and+slave+machines
1.4.2 添加/配置Slave结点

1.4.3 Slave启动
启动slave的四种方式:
https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds
对于Slave启动方式, 由于 Mac OS 系统默认支持SSH,所以使用SSH启动更加方便。
1.4.4 配置SSH
方式1: SSH login with Username&password
在”系统管理”-> “Manage Credentials” 里Add Credentials,并选”Username with pasword”
“Username”栏应填写Slave结点机器的开机账号,”Password”栏应填写Slave结点机器的开机密码。

方式2、SSH login without password
首先需要生产rsa密钥对,参照 http://www.linuxproblem.org/art_9.html 生成key。
生成key后,在”系统管理”-> “Manage Credentials” 里Add Credentials,并选”SSH Username with private key”

1.4.5 创建/配置Slave Job
配置Slave Job(如何创建Job在前文中已经说明)
勾选中”Restrict where this project can be run”
“Label Expression”应填写创建Slave结点时命名的标签(Tag)名称。

1.4.6 发布构建好的ipa
这个比较多方法,可以放到ftp,也可能放到NFS上,又或者特定的某台机器。我选择的是将通过SCP将构建的IPA拷贝到内部共享的一个服务器上。这也分几步:
a、从”系统管理” -> “管理插件” 安装SCP插件
b、在”系统管理” -> “系统设置”里的”SCP repository hosts”模块里配置SCP插件,新建一个SCP site “tmp”
c、配置ios对应Job,增加一个”构建后操作”,选择”Publish artifacts to SCP Repository”, 并设置SCP site为tmp,然后设置对应文件源及目的地,如Source为”ipa/*.ipa”, Destination为”iPhoneApp/“。
1.4.7 Slave Tips
使用fastlane的sigh在 mac Slave 结点机器上下载相关配置文件时,无法读取Slave机器Keychain中保存的密码。
错误如下:

解决方法:
需要通过命令解锁Slave结点机器的Keychain。
security unlock-keychain -p [password] $HOME/Library/Keychains/login.keychain
1.5 如果利用Jenkins搭建我们的持续集成框架
基于以上介绍,Jenkins环境已经搭建完成,如何使用Jenkins环境搭建我们自己的持续集成环境呢?
其实我们自己的持续集成环境很简单,只利用到了Jenkins执行Shell脚本的功能以及邮件通知的功能,再多一点点就是CVS和Git功能。当然Jenkins也可以使用Xcodebuild插件进行iOS程序的打包,但是对于我们产品的特殊性需求,还有就是我个人喜欢使用shell脚本语言编写自动化打包工具。

参考
https://imciel.com/2016/08/27/install-jenkins-tips/