前言
持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。而持续集成可以保证在任何时间、任何地点生成可部署的软件。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。同时减少风险与重复性的过程、增强项目的可见性。
一、持续集成工具Jenkins
Jenkins是一个基于Java环境开发的持续集成工具。它的开源性使它具备大量的插件,极大的扩展了其功能,可以构建多种平台的软件。除此之外,由于社区活跃、用户界面相对友好、安装和配置都易于上手等特点,Jenkins一直深受大家喜爱。
1.Jenkins安装
首先,由于Jenkins是基于Java环境的,所以要先确保机器上安装java环境。
确保以上条件后,进入Jenkins官网进行下载安装(建议用war包安装,这样不会建立新的用户,不涉及权限问题)
2.Jenkins初始化
安装完成后 Jenkins用户/Home/secrets下复制initialAdminPassword内密码,浏览器进入Jenkins管理界面(默认为:localhost:8080)将复制的密码填入,进行初始化配置。(如使用war包安装,此处可在terminal内看到提示,有明文的初始化密码以及初始化密码存放的路径)插件的选择安装完成后可以在插件管理中配置,所以一开始选择插件时无论是建议配置或自定义配置都无关紧要。只要记得最后一步配置的管理员信息就可以了。
3.Jenkins插件安装
配置完成后登录Jenkins管理页面,进入右侧系统管理——插件管理,选择可用插件选项卡进行选择或搜索,一次添加插件(某些插件可能要求科学上网)在本例中,添加以下插件:
- git plugin (集成Git)
- github plugin (集成Github)
- PostBuildScript Plugin(可在构建完成后执行脚本)
- Xcode integration(构建Xcode项目,包括agvtool和导出.ipa)
4.Jenkins添加授权
在系统管理——Credentials中添加新的你所需的授权,例如远程仓库的账号密码或ssh私钥信息等。
上传完成后,Jenkins会为每一个授权富裕一个加密并提供对应此授权的ID,之后需要用到的地方,选择或填写对应的ID即可。
5.Jenkins环境变量配置
在利用pipeline、fastlane构建版本时,需要获取相应的信息、如证书信息等。这是需要在jenkins环境变量中配置对应的变量。(变量也可在pipeline指定的jenkins运行脚本中进行配置)。进入系统管理——系统设置中,勾选环境变量进行添加,此例中添加以下环境变量:
- PATH = 系统的path绝对路径
- MATCH_PASSWORD = 生成match文件时设置的解密私钥(设置时请牢记)
- LC_ALL、LANG = fastlane要求使用的字符集(en_US.UTF-8)
- FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD = APPID特殊密码(用于发布testfight或iTunes connect时两步验证)
- FASTLANE_SESSION = appid的session(用于使用appid登陆web时的两步验证 这个session,可以用 fastlane spaceauth -u your@appid.com 来生成)
- FASTLANE_PASSWORD = appid的密码(用来获取证书时鉴权,更多两步验证fastlane官方推荐方法原理查询)
6.创建pipeline新工程
点击新建,选择pipeline模式,建立并配置项目
- General面中可自定义项目基本信息、构建版本保留等配置
- 触发器面板中可设置版本构建的条件,可选在其他项目构建后构建,或定时构建(此例中选择每日6点至22点期间,每3小时构建一次,定时构建格式可点击后方文档按钮进行查阅,更多构建方式查阅Jenkins文档)
- Pipeline面板中设置构建项目的脚本,此处可在面板中直接编写脚本,或者指定远程仓库中的文件来进行配置,此处若使用直接写脚本的方式,可利用Jenkins提供的Pipeline Syntax工具进行脚本命令的格式化工具
至此,一个pipeline的项目就配置完成了,但由于本例中结合了fastlane来进行构建,所以目前还需配置好fastlane才能进行构建
二、自动构建工具fastlane
fastlane是为你的iOS和Android应用程序自动测试部署和发布的最简单的方法。它处理所有繁琐的任务,比如生成屏幕截图、处理代码签名和发布应用程序。
1.安装fastlane
首先务必保证已安装最新版的Xcode命令行工具,然后使用Homebrew
brew cask install fastlane
或下载fastlane安装包进行安装。
2.集成fastlane到项目
在项目根目录下执行命令
fastlane init
生成 fastlane文件夹,下面会自动生成Appfile(用于配置项目信息)及Fastfile(fastlane执行脚本) ,打开文件进行配置 。
- app_identifier:应用的Bundle identifier
- apple_id:用于打包的Apple ID
before_all:在所有的lane运行前会执行一遍的行为,其中unlock_keychain方法为解锁钥匙串,如在从机(agent)上运行,需将对应的钥匙串导出到项目根目录下并配置此方法填入对应的名称和密码才能进行构建
各种lane:每条lane所需要执行的行为,其中match、gym等命令下面会说到。其中versioning及fir方法与参数请参考第三方插件文档versioning及fir
after_all:在所有的lane运行结束后会执行一遍的行为
error:当lane执行失败时执行此行为
3.集成match到项目
执行命令
match init
match development // 其他类型,可选类型有appstore, adhoc, development, enterprise
在生成Matchfile过程中会需要用户指定APPID、远程仓库地址、解密私钥(务必来及)等信息(证书信息务必放到私有仓库) 生成 Matchfile文件(用于配置appid信息)打开文件进行配置。
- app_identifier:应用的Bundle identifier(以逗号分隔)
- team_id:用于打包的Apple ID所属组别ID
- team_name:用于打包的Apple ID所属组别名称
- username:用于打包的Apple ID
- keychain_name:打包时要用到的证书存放的钥匙串名称
- keychain_password:打包时要用到的证书存放的钥匙串密码
4.集成gym到项目
执行命令
gym init
生成 Gymfile文件(用于配置项目打包信息)打开文件进行配置
- scheme:要打包项目的scheme
- export_method:打包导出方式
- configuration:打包类型
- output_directory:打包输出路径
- clean:打包前清理是否清理项目
5.加入第三方插件
选择需要的插件,用命令进行添加,生成Pluginfile文件
fastlane add_plugin XXX // 插件名
执行add_plugin命令同时时会在根目录下生成gemfile,也可在其中配置其他需要安装的工具,记得bundle install。
以上match、gym、等都可以直接写命令到Fastfile中,但分文件来写能保持代码整洁,所有配置也在fastlane脚本中重写覆盖。具体行为(Action)及参数参考 Fastlane官方文档。
三、总结
在配置的过程中也遇到了非常多的问题,在此记录一下
1.cocoapod第一次运行时会去下载库到本地时间较长,此时就只有默默地等待了。
2.两步验证问题及两步验证用于web的session生成后字符集的问题。已在文中提及了解决方式。
3.添加完插件后需要bundle install一下,此时务必科学上网。
4.使用自动化打包,需要打开对应要打包项目scheme的share选项。