Android 工程的 Vagrant Gitlab Runner
Gitlab runner 是一个优秀的持续集成工具,通过 runner 我们可以执行自动化编译、静态代码检查、单元测试、UI 测试,发布等操作,是高效快速迭代开发的必要工具。 GitLab Runner 独立运行于 Gitlab 实例,可以非常容易的扩展和安装。
排队竞争
当团队内项目增多后,代码提交会变得频繁,单一的 runner 实例执行 CI 操作会出现占用时间较长,排队等待时间较长的问题。尤其对于 Android 工程,一个编译任务一般需要几分钟才能执行完毕,这时我们就需要对 runner 服务进行扩充,增加 runner 的数量。
为了最佳化实践,我们团队使用的是 GitLab Runner + Docker 的运行方式,runner 的每一个编译任务都在 docker 容器 (xdtianyu/openjdk8) 内运行,容器内集成了 Java/SDK/NDK 基础环境。这种方式在 Linux/MacOS 安装和执行非常简单方便,但是在 Windows 环境下却不那么容易,因为 Gitlab Runner 和 docker 在 Windows 系统上配置和运行都很困难,不能快速分发给不同的 Windows 主机执行。
而团队内几乎所有开发机还在使用 Windows 系统,所以要利用闲置计算资源扩充 runner 数量就需要一个独立于宿主机环境,能快速分发且操作简单的解决方案。
扩充方案
要独立宿主环境,虚拟机是必然选择;要跨平台快速分发虚拟机且操作简单,Vagrant 则是必然选择。具体方案概括为 Vagrant + VirtualBox 虚拟机 + Gitlab Runner + Docker
。
最终的代码请参考 xdtianyu/vagrant/gitlab-runner,克隆代码后,只需修改 .env
文件,添加 Gitlab 实例地址及 Runner Token, 执行 vagrant up --provision
命令后即可运行扩充 Runner 服务。
使用步骤
1. 系统安装 Vagrant 及 VirtualBox,如果是 Windows 系统,请升级 PowserShell 到 3.0 及以上版本。
2. 克隆代码,同时修改 .env
文件中的环境变量。
URL="YOUR_GITLAB_URL"
TOKEN="YOUR_TOKEN"
PROXY_HOST="YOUR_PROXY_HOST"
PROXY_PORT="YOUR_PROXY_PORT"
如果不需要适用代理,请将 PROXY_HOST
PROXY_PORT
设置为空。
3. 执行 vagrant
命令启动 runner 服务
vagrant up --provision
关闭虚拟机
可以使用如下命令关闭虚拟机
vagrant halt
您可以通过 vagrant up --provision
命令再次启动虚拟机。
注册
Runner 服务只会在第一次运行时注册,之后运行不会再重复注册。这个功能是通过 bootstrap.sh
中的如下代码实现的:
if [ ! -z "$(cat /etc/gitlab-runner/config.toml |grep url\ =\ \"$URL\")" ]; then
echo "Runner is already registered."
exit 0
fi
销毁
可以使用如下命令销毁虚拟机
vagrant destroy
之后需要在 GitLab 移除已经销毁的 runner 服务。
主机名
虚拟机的主机名会根据运行其的宿主机自动命名,这个功能是在 Vagrantfile
文件中的如下代码实现的:
config.vm.hostname = "#{`hostname`[0..-2]}-runner"
例如,如果你的电脑主机名为 Peter-Desktop
,那么虚拟机的主机名将会被设置为 Peter-Desktop-runner
。同时, Gitlab Runner 的名称也将被设置为虚拟机主机名,这样可以使同一个 Gitlab 服务中辨识不同 runner 服务变得容易。
下载速度慢
如果您访问 vagrant 托管的速度较慢,可以使用任意文件下载工具下载如下镜像文件到本地:
https://vagrantcloud.com/xdtianyu/boxes/gitlab-runner/versions/1.0.0/providers/virtualbox.box
然后通过如下命令添加虚拟机镜像到仓库:
vagrant box add xdtianyu/gitlab-runner gitlab-runner.box
您也可以将此 box 文件托管到内网服务器,然后修改 Vagrantfile
文件中的下列行:
# config.vm.box_url = ["https://YOUR_LAN_HOSTING/gitlab-runner.box"]
例如,您将此文件托管在 http://10.0.0.1:8080/gitlab-runner.box
,则修改配置为:
config.vm.box_url = ["http://10.0.0.1:8080/gitlab-runner.box"]
之后您可以将此仓库包含 .env
文件分发给同事,他们只需执行 vagrant up --provision
命令即可快速启动 runner 服务。
登录到虚拟机
通过如下命令登录到虚拟机:
vagrant ssh
默认的用户名及 root 密码都是 vagrant
,您无需密码即可通过 sudo
执行命令。
.gitlab-ci.yml 示例
请参考 xdtianyu/CallerInfo 仓库中的 .gitlab-ci.yml
文件。您也可以在此 runner 虚拟机中使用 ndk
编译、单元测试、UI 测试。