上一节我们已经搭建好了本地的Gitlab的代码托管平台。在创建好将要开发的项目后,我们选择是否配置项目CI(Continuous integration 持续集成)。
首先,持续集成并不是为了敏捷开发而发明的,或者说本意并不是如此。早在敏捷开发形成思路之前,持续开发就被作为最佳实践(best practice)而运用到对产品质量的监控中了。项目中一般都需要定期的对产品质量进行监控,常用的控制方法一般分为两种:
相对于阶段集成来说,敏捷开发的形式更适合持续集成,因为这能更快捷的在开发过程中发现问题,而不是等到阶段交付的时候来个大爆炸。因此,推进敏捷时Martin被所倡导并由此风靡起来。就持续集成本身而言,并不被什么开发模型所限制,在任何一种开发模型中都可以采用,也可以运行得非常理想。
在《Code Complete》里提到了,对于持续集成(在书中,Steve McConnell使用Incremental Integration的术语)有以下几点好处:
易于定位错误: 也就是当你的持续集成失败了,说明你新加的代码或者修改的代码引起了错误,这样你很容易的就可以知道到底是谁犯了错误,可以找谁来讨论。
及早在项目里取得系统级的成果:因为代码已经被集成起来了,所以即使整个系统还不是那么可用,但至少你和你的团队都已经可以看到它已经在那了。
改善对进度的控制:这点非常明显,如果每天都在集成,当然每天都可以看到哪些功能可以使用,哪些功能还没有实现。如果你是程序员,你不用在汇报任务的时候说我完成了多少百分比而烦恼,而如果你是项目经理的话,那么你也不再烦恼程序员说完成了编码的50%到底是个什么概念。
改善客户关系:理由同上。
更加充分地测试系统中的各个单元:这也是我们常讲的Daily Build与Smoke Test相结合带来的绝大好处。
能在更短的时间里建造整个系统:这点恐怕要你实施以后才能得出结论。就我们而言,持续集成并没有为每个项目都缩短时间,但却比没有实施时,项目更加可控,也更加有保证。
随着时间的推移,持续集成带来的更多好处,也逐渐被认识到了,比如说:
有助于项目的开发数据的收集:比如说,项目代码量的变化,经常出错的Tests,经常出错的source code,等等。
与其它工具结合的持续代码质量改进:如与CheckStyle, PMD, FindBugs, Fxcop等等等等的结合。
与测试工具或者框架结合的持续测试:如与xUnit,SilkTest, LoadRunner等等的结合。
便于Code Review:在每个build里,我们都可以知道与前一个build之间有什么改动,然后针对这些改动,我们就可以实施Code Review了。
便于开发流程的管理:比如说,要把一个开发的build提交给测试组作测试,测完满意了,再提交到发布组去发布。
可以看出,持续集成能够更好地辅助项目开发、错误检测和产品沟通。它所带来的优点,弥补了敏捷开发过程中,产品快速迭代导致的各种问题,如:代码过度冗余、项目框架不稳定等。
现在,我们来看一下如何在Gitlab上搭建CI。
Gitlab CI 是Gitlab为我们提供的一款持续集成程序,在Gitlab安装时默认安装并默认启动。
# 选择一个目录中保存sdk, 如果没有则创建该目录
mkdir /nsr/server/android-sdk
# 在该目录下载最新的sdk
wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
# 解压sdk
tar xfv android*.tgz
# 解压完毕后, 切换到`tools`目录下, 以便使用android命令
cd /android-sdk-linux/tools/
# 查看当前远程库中有哪些版本的sdk和工具
./android list sdk
# 根据需要安装指定版本的sdk, 这里安装API 18及以上. 多个安装项目可带有项目编号, 用逗号分隔, 例如下面n1,n2,n3. 注意输入的是序号, 而不是API版本号
./android update sdk -u -a -t n1,n2,n3
# 之后弹出是否接受许可, 输入y后开始下载安装. 这里我用的腾讯云服务器, 结果坑的是下载瞬间完成, 后来发现并没有下载下来, 无奈自己从电脑用FileZilla传到服务器上的.
当然,你也可以通过安装Android Studio的方式,通过AS直接安装好开发环境。这个应该是最简单的方式,毕竟你要开发的话,工具肯定都得装了。
我们可以直接在脚本中编写Gradle命令,如果没有Gradle, 将会开始下载Gradle和其他依赖包
# 编辑系统全局配置文件
nano /etc/profile
# 在最末尾加入环境变量, 注意变量名必须用ANDROID_HOME, 这是Gradle脚本默认识别的
export ANDROID_HOME=/usr/server/android-sdk/android-sdk-linux/
export PATH=$ANDROID_HOME:$PATH
# 保存退出后, 使用以下命令使环境变量生效
source /etc/profile
# 验证环境变量中是否有android sdk path
echo $PATH
该步骤用于告诉Gitlab本项目需要使用CI功能, 并执行.gitlab-ci.yml脚本。
在项目根目录创建一个.gitlab-ci.yml文件. 在其中编写自动构建所需要执行的操作.
脚本的编写格式如下:
# 预执行脚本, 在所有任务执行前所进行的初始化命令
before_script:
- cmd1
- cmd2
# 构建任务, 在before_script后执行, 多个构建任务会分别执行.
# 这是任务A, 任务名可以任意
job_a:
script:
- cmda1
- cmda2
# 这是任务B
job_b:
script:
- cmdb1
- cmdb2
例如:
# 自动编译一个debug apk
job_build_debug_apk:
script:
- ./gradlew assembleDebug
artifacts:
paths:
- app/build/outputs/apk/*.apk
# 这里面:
# job_build_debug_apk 为构建任务名
# artifacts 表示build后需要上传的文件
# path 用于指定上传文件的路径,这里我们将编译生成的apk上传
脚本编写完后, 可以使用Build
中右上角的CI Lint
功能检查语法.
语法没有问题则可以push到项目中, 此时查看项目的Build
中就会有你所编写的任务. 不过他们目前是pending状态, 因为我们还没有安装runner来运行.
该步骤用于安装runner来执行.gitlab-ci.yml脚本。
参考官方文档
# For Debian/Ubuntu
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
# For RHEL/CentOS
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
# For Debian/Ubuntu
sudo apt-get install gitlab-ci-multi-runner
# For RHEL/CentOS
sudo yum install gitlab-ci-multi-runner
sudo gitlab-ci-multi-runner register
注册时会要求你按步骤输入一些信息,用于将runner与对应的Gitlab关联起来。信息可以在点击Runner
后看到。 按照提示输入相关信息,注册内容关键是url地址和token。 注意executor
如果你不确定选哪种就选择shell
即可。
sudo gitlab-ci-multi-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com
Please enter the gitlab-ci token for this runner
xxx
Please enter the gitlab-ci description for this runner
my-runner
INFO[0034] fcf5c619 Registering runner... succeeded
Please enter the executor: shell, docker, docker-ssh, ssh?
docker
Please enter the Docker image (eg. ruby:2.1):
ruby:2.1
INFO[0037] Runner registered successfully. Feel free to start it, but if it's
running already the config should be automatically reloaded!
至此Runner安装成功并且已经开始运行。我们再看项目中的Build
可以看到任务已经执行完毕,并给出了过程和结果。
直接执行下面这段代码即可
# For Debian/Ubuntu
sudo apt-get update
sudo apt-get install gitlab-ci-multi-runner
# For RHEL/CentOS
sudo yum update
sudo yum install gitlab-ci-multi-runner
可以通过以下地址引用最新的Build结果, 一般我们会放在README中.
其中example.gitlab.com需要改为自己的Gitlab域名, namespace需要改为你的用户名, project需要改为项目名称, branch需要改为分支名称.
http://example.gitlab.com/namespace/project/badges/branch/build.svg