前言
在进行今天内容讲解前,首先我们来介绍下持续集成相关的概念。这样会让我们对软件开发有一个整体的认识。
持续集成
概念
持续集成(Continuous Integration,简称CI)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
价值
减少风险:一天中进行多次的集成,并做了相应的测试,这样有利于检查缺陷,了解软件的健康状况,减少假定。
减少重复过程:减少重复的过程可以节省时间、费用和工作量。例如:代码编译、数据库集成、测试、审查、部署及反馈。通过自动化的持续集成可以将这些重复的动作都变成自动化的,无需太多人工干预,让人们的时间更多的投入到动脑筋的、更高价值的事情上。
任何时间、任何地点生成可部署的软件:利用持续集成,您可以经常对源代码进行一些小改动,并将这些改动和其他的代码进行集成。如果出现问题,项目成员马上就会被通知到,问题会第一时间被修复。
目的
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
相关概念
与 持续集成 相关的,还有两个概念,分别是 持续交付 和 持续部署 。
持续交付
持续交付(Continuous Delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。
持续部署
持续部署(Continuous Deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
流程
根据 持续集成 的设计,代码从提交到生产,整个过程有以下几步。
提交
流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。
测试(第一轮)
代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
测试有好几种。
- 单元测试:针对函数或模块的测试
- 集成测试:针对整体产品的某个功能的测试,又称功能测试
- 端对端测试:从用户界面直达数据库的全链路测试
第一轮至少要跑单元测试。
构建
通过第一轮测试,代码就可以合并进主干,就算可以交付了。
交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。
常用的构建工具如下。
- Jenkins
- Travis
- Codeship
- Strider
Jenkins 和 Strider 是开源软件,Travis 和 Codeship 对于开源项目可以免费使用。它们都会将构建和测试,在一次运行中执行完成。
测试(第二轮)
构建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时构建步骤也要移到第一轮测试前面。
第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。
需要强调的是,新版本的每一个更新点都必须测试到。如果测试的覆盖率不高,进入后面的部署阶段后,很可能会出现严重的问题。
部署
通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包( tar filename.tar * )存档,发到生产服务器。
生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号链接(symlink)指向这个目录,然后重新启动应用。这方面的部署工具有 Ansible,Chef,Puppet 等。
回滚
一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。
下面部分就是今天要讲的内容,前面花那么大的篇幅主要是想让大家对软件开发有个整体的认识。测试驱动和持续集成被称为敏捷编程的两大基石,也是现阶段互联网软件开发的趋势。
Fastlane 安装
Fastlane 是一个快速将 iOS 项目打包成 ipa 文件的工具。要安装 fastlane,请参考 iOS 持续集成:Fastlane + 蒲公英自动打包发布,这里我们不再赘述。
Jenkins 安装和使用
安装 Jenkins
方法一:直接下载安装包安装,下载地址: http://jenkins-ci.org
方法二:命令行安装
// 安装 jenkins
brew install jenkins
// 启动 jenkins
jenkins
// 卸载 jenkins
brew uninstall jenkins
// brew 无效,需要先安装 Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
访问 Jenkins
打开浏览器访问 Jenkins 默认地址 http://localhost:8080/ ,能够正常打开说明安装成功。
使用 Jenkins
自动化构建设置
在 Jenkins 中,所有的任务都是以 “item” 为单位的。接下来我们就新建一个 iOS 的项目来开始自动化构建。点击“新建”,输入 item 的名称,选择 “构建一个自由风格的软件项目”,然后点击 “OK”。
然后按下图设置构建信息:
源码管理
这里主要是设置源码的仓库,以便让 Jenkins 知道我们的 iOS 项目的代码在哪里。因为我的代码放在自己搭建的 GitLab 仓库中(如果你用 Github 等其他仓库也是类似),所以要先告诉 Jenkins 如何获取代码。首先,我们需要配置 SSH,我们可以在 Jenkins 的证书管理中添加 SSH。在 Jenkins 管理页面,选择 “Credentials”,然后选择 “Global credentials (unrestricted)”,点击 “Add Credentials”,如下图所示,我们填写自己的 SSH 信息,然后点击 “Save”,这样就把 SSH 添加到 Jenkins 的全局域中去了。
接下来,我们再回到刚刚新建的任务中,在源码管理中,选择 Git,按下图填好相关信息。注意:Branch Specifier (blank for 'any') 选择需要打包的分支。
构建触发器设置
因为此教程不涉及自动测试这块的流程,所以不需要设置触发器。
构建环境设置
这里我们是直接用 fastlane 这个工具,所以这里不需要特别设置。fastlane 会自动读取本地 iOS 项目中设置的签名等信息,所以需要保证本地 iOS 工程已经设置好了正确的签名信息和 Provisioning Profiles 等文件,并在 keychain 中已经加入了正确的证书。否则后续的操作中可能会出现错误。如果这里没有设置好,请用 Xcode 打包工程进行相关设置即可。
脚本设置
这一步主要用来打包 ipa 并上传到蒲公英。我们点击“增加构建步骤”,选择 "Execute Shell"。输入下列脚本:
IPANAME=“TestGitProject”
fastlane gym --export_method ad-hoc --output_name ${IPANAME}
curl -F "file=@${IPANAME}.ipa" -F "uKey=4477d913a078c11df32be931523619dc" -F "_api_key=d066f633dc2d970eb230dba7823ff022" https://qiniu-storage.pgyer.com/apiv1/app/upload
注意:其中,USER_KEY 和 API_KEY 可以在蒲公英的「账户设置」中找到,之后进行相应替换。
export_method 可以根据打包类型进行相应设置。可选的值有:app-store、ad-hoc、development、enterprise。对于 Xcode 8.3 以下的版本,则不需要设置 export_method。
设置好之后,类似界面如下所示:
最后点击最下面的 Save 按钮来保存所有设置。这样我们就简单的实现了自动打包,并上传到蒲公英的所有配置了。
接下来,我们可以测试一下。点击项目页面左侧的 Build Now,我们可以看到项目已经开始构建。在 Console Output 中,我们可以看到项目已经成功构建,并自动上传到了蒲公英。
最后看到 Finished: SUCCESS 说明打包上传蒲公英成功。可以根据日志中应用下载链接去下载测试应用。
常见问题
出现 fastlane: command not found 怎么办?
解决方法一:这个情况一般是由于 jenkins 没有设置正确的 $PATH 环境变量导致的。正确设置的方法为:
在命令行下执行 echo $PATH,记录下输出的结果
在 jenkins 中系统管理-系统设置中,找到 环境变量(Environment variables)
在 key 中填写 PATH,在 value 中填写第一步中输出的结果
保存即可。
解决方法二:请确认您安装 Jenkins 的方式和我们在本文里推荐的方式一致。使用其他方式安装的 Jenkins 也经常会出现此问题。
原文链接:http://sessionch.com/fastlane/fastlane-jenkins-gitlab-pgy.html