当遇到一个大型的Android项目时,而电脑性能又无法支撑繁多的编译任务,开发者将会用大量的时间来等待编译,十分影响开发进度。特别是多人、多分支,多渠道开发时,将会是一个噩梦。我是亲身经历者,完全重编译一次我们的项目,大概需要20-30分钟,这还不算下载依赖的时间,我们的项目时多模块的架构,再加上Hilt依赖注入,编译十分耗时。
使用远程构建缓存这个方案是我突然一下子冒出的想法,虽然这个方案早已存在。于是我就去查阅了相关资料,远程构建缓存确实是可行的,于是我下定决心,准备在我们的项目上实现,这样可以节约很多时间。
确定实现方案
关于构建缓存,我们一直都在使用Gradle 提供的本地缓存方案,实现远程缓存,其实就是把build 生成的文件放到云端,可以个供所有开发者使用。
对于企业级项目,可以使用Develocity来实现,但是它是付费的,它不仅提供缓存共享,还可以加速CI/CD过程,提供构建性能监控和分析。Gradle 还是比较友好的,还提供了另外一种免费的方法,官方提供了一个免费、轻量级的缓存后端:Gradle Build Cache Node,使用Docker 容器可以开箱即用。我就是选择的这一种方案。
实现步骤
1、安装Docker和启动gradle/build-cache-node。
# 1. 在宿主机上创建数据持久化目录
mkdir -p /opt/build-cache-node
# 2. 赋予该目录适当的读写权限(防止容器内用户无权写入)
chmod 777 /opt/build-cache-node
# 3. 运行 Docker 容器
docker run --detach \
--name gradle-cache-node \
--restart unless-stopped \
--volume /opt/build-cache-node:/data \
--publish 5071:5071 \
gradle/build-cache-node:latest \
start
2、访问后台管理,设置缓存策略,添加用户和设置权限。注意,首次启动后台管理,登录时用户名和密码需要从服务的启动日志中去找。 3、在Android项目中settings.gradle 配置远程构建缓存的地址 注意:对于普通开发者,push = false,这里是避免都去上传缓存,造成缓存库污染,credentials 在后台管理平台可以进行设置的。
我们只在做CI/CD的机器上开启push
buildCache {
remote(HttpBuildCache) {
// 指向gradle build cache 服务远程构建缓存地址
url = 'http://<ip>:5071/cache/"
allowInsecureProtocol = true
push = true
credentials {
username = 'cache_user'
password = 'cache_password'
}
}
}
4、CI 自动构建项目,上传缓存。当然这一步,如果已经是实现了的,就直接可以忽略了。
我在实现这个远程构建缓存时,还是处于探索阶段,因此我是自己实现了一个简单的CI过程,使用的github提供的self-hosted ruuner,写了一个自动编译的脚本,利用github 的Action 定时执行。过程还是比较坎坷,由于对脚本的编写不熟悉,AI生成的又出现了很多错误,加之脚本的运行调试比较麻烦,还是花了很长时间去实现这个简易的CI。