Continuous Integration(CI)持续集成的优点
- 简而言之,它能带来高效的开发流程,让开发人员从"集成"的人力成本中解放出来
Jenkins工具对于CI的意义
- 如果说CI是一种概念,那Jenkins就是实现这个概念的比较有力的工具
- 对于移动端开发而言,持续集成的最好实践就是自动化打包测试
- Jenkins在移动端CI上有着以下几点的优势
- Mac平台上搭建简易:iOS自动化打包需要Xcode命令行工具的支持,在Mac平台上搭建会方便许多,坑也会少很多
- 插件支持友好:对于iOS自动化打包,Jenkins提供足够多的插件支持
- 自带日志:Jenkins默认情况下集成日志,不需要手动生成
- 默认集成GIT:Jenkins集成的GIT模块可以方便地对GIT上的代码进行持续集成的工作
Jenkins部署
- 从官网jenkins.io/ 上下载最新的pkg安装包
- 安装完成后,打开浏览器,输入http://localhost:8080
- 如果无法打开,则说明Java环境有问题,重新安装最新的JDK即可
-
出现以下界面说明Jenkins已经被正确地启动服务
-
按照提示,在Finder中定位到文件夹,右键选择“显示简介”,设置权限
- 权限设置完毕后,进入文件夹打开initialAdminPassword就能找到密码,复制并填写到Jenkins服务的网页(http://localhost:8080)中并继续
- 初始化设置,按照默认的就好了,继续
- 创建用户,然后点击“保存并完成”
- 插件安装(系统管理->管理插件->可选插件)
- GitLab Plugin(可选,如果代码是部署到GitLab环境的话安装)
- Gitlab Hook Plugin(可选,如果代码是部署到GitLab环境的话安装)
-
Xcode integration(可选,如果不想写脚本执行打包的选择这个作为替代)注意:目前发现新版本的MAC系统(10.13)和Xcode9默认是不允许访问钥匙串的,所以建议都用脚本打包 - Keychains and Provisioning Profiles Management(如果使用脚本执行打包,则需要安装该插件来管理钥匙串和证书)
信息配置
- 钥匙串和证书
- 使用Jenkins部署自动化打包环境总的来说是比较友好而且快速的,如果说有坑,那最主要的坑来源就在证书和钥匙串准备这一环节
- Jenkins在Mac环境下是通过独立用户来做到文件系统层面上的相对独立,总所周知,打包iOS的iPA包是需要本机环境拥有签名数字证书(Certificate)和描述文件(Provisioning profile)的,由于环境的独立性,需要在Jenkins所在的环境内放置/安装这些内容
- 以下是在Jenkins配置签名数字证书(Certificate)和描述文件(Provisioning profile)的可能是最保险的实现方式
- 在Jenkins Dashborad(Jenkins首页)下,点击“系统管理”—>“系统设置”,滚动找到Xcode Builder这一个fragment
-
上图所示,Keychain path的默认值如图,可以指定一个路径(最好是Jenkins用户文件夹下的路径,以防访问权限问题),这里直接在该默认路径下使用Finder创建对应的文件夹,并把/Users/用户名/Library/Keychains/login.keychain复制进该文件夹,如果钥匙串文件有密码,记得填上
-
最重要的一步,双击复制之后的login.keychain,进入到“钥匙串访问”,看看里面的签名数字证书是否正确的(如果你主机的证书变动过,复制之后的login.keychain不一定是跟主机的login.keychain一样,所以要打开确认一下,原因是实际上证书的完整内容是保存login.keychain-db里面,login.keychain和login.keychain-db的信息不一定完全对等),如果不正确,就需要把缺失的证书补全,调整完之后可以在钥匙串访问中删除该登录钥匙串的引用
- 在Jenkins Dashborad(Jenkins首页)下,点击“系统管理”—>“系统设置”,滚动找到Xcode Builder这一个fragment
- 命令行打包配置:Keychains and Provisioning Profiles Management
- 如果使用命令行打包,则需要额外配置钥匙串和配置文件
-
设置位置:Jenkins Dashborad(Jenkins首页)-> 系统管理 -> Keychains and Provisioning Profiles Management
- 设置域名验证(以GitLab为例,GitHub也大同小异)
- Jenkins Dashborad(Jenkins首页)-> Credentials
- 这里可以选择两种添加方式:全局证书 & 域名证书
-
顾名思义:全局证书就是全局都能使用的证书,域名证书则是指定域名才能使用的证书
-
这里以域名证书为例,设置GitLab SSH(为什么不用HTTP,因为Jenkins的HTTP连接方式可能会无法连上,而且SSH可以绕过Nginx的文件上传大小限制,总之用SSH的坑会少一些)
- PS: 如果经过以上步骤仍然出现因为证书而无法打包成功的情况,可以把证书安装到“钥匙串访问”-“系统”里(原来一般都会把证书安装到“钥匙串访问”-“登录”里面)
构建项目
-
Jenkins Dashborad(Jenkins首页)点击“新建”
-
新建项目界面,按照提示填写并继续
-
配置项目(这里以执行脚本打包的方法为例)
-
编写执行的脚本
- 本人比较推荐使用脚本的方式进行打包,而不是使用Jenkins的Xcode integration,因为使用脚本比较灵活而且可复用
- 脚本核心逻辑:清理工程 -> 归档工程 -> 导出ipa -> 验证ipa -> 上传ipa
- 核心逻辑对应的脚本代码(以使用cocoapod的iOS项目为例):
- 重要参数解析:
CODE_SIGN_IDENTITY:签名证书的名字,格式--"iPhone Distribution: Shanghai ******* Co., Ltd.(*****)"
-
PROVISIONING_PROFILE:配置文件的UUID,获取方式--Jenkins Dashborad(Jenkins首页)-> 系统管理 -> Keychains and Provisioning Profiles Management
-exportOptionsPlist:这是导出选项的plist文件的路径,该plist文件的简单示例如下,具体解释可以在命令行中输入xcodebuild -help查看
<?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>method</key> <string>app-store</string> <key>teamID</key> <string>开发小组ID</string> </dict> </plist>
- altool路径:这其实就是ipa上传工具Application Loader的命令行工具,一般地址位于/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool
- 清理工程:xcodebuild -workspace <工作区间名字.xcworkspace> -scheme <scheme名字,一般为工程名字> -configuration <Release或者Debug> clean
- 归档工程:xcodebuild archive -workspace <工作区间名字.xcworkspace> -scheme <scheme名字,一般为工程名字> -archivePath <归档路径> -configuration <Release或者Debug> CODE_SIGN_IDENTITY=<签名证书的完整名字> PROVISIONING_PROFILE=<配置文件的UUID>
- 导出ipa:xcodebuild -exportArchive -archivePath <归档路径> -exportPath <导出ipa路径> -exportOptionsPlist <导出选项的plist文件>
- 验证ipa:<altool路径> --validate-app -f <验证ipa的完整路径> -u <appleID账号名> -p <appleID密码> -t <平台名,ios> --output-format <输出日志的格式normal或者xml>
- 上传ipa:<altool路径> --upload-app -f <验证ipa的完整路径> -u <appleID账号名> -p <appleID密码> -t <平台名,ios> --output-format <输出日志的格式normal或者xml>
- 重要参数解析: