Android 工程的 Vagrant Gitlab Runner

发布于:

编程

Gitlab runner 是一个优秀的持续集成工具,通过 runner 我们可以执行自动化编译、静态代码检查、单元测试、UI 测试,发布等操作,是高效快速迭代开发的必要工具。 GitLab Runner 独立运行于 Gitlab 实例,可以非常容易的扩展和安装。

vagrant runner

排队竞争

当团队内项目增多后,代码提交会变得频繁,单一的 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 测试。

项目地址

https://github.com/xdtianyu/vagrant