只开远端缓存时。kernel采用的bazel编译,遇到如下问题:
1、Action 详情二进制文件解析为文本文件时报错,无法进一步比较分析导致缓存不命中的原因。--- JDK版本的问题
2、远端缓存全部命中时间收益不明显 ---需分析是否为网络原因
3、$HOME/.bazelrc中指定分析日志保存文件用于分析。 但由于无法指定相对路径,同一工程中全部bazel分析结果都保存在kernel根路径下,造成覆盖。无法批量分析
4、提取kernel中的bazel命令,本地重复编译两次,第二次可以全部命中本地缓存,秒级构建。但清理本地缓存,只使用远端缓存,本地重复编译两次,第二次无法全部远端缓存。---分析构建的action日志文件, 没命中的基本含有inputs bazel-out/volatile-status.txt文件差异, 其内容是时间戳,但按bazel官方说明,该文件是易变文件,不影响的action的,说明见https://bazel.build/docs/user-manual?hl=zh-cn#workspace-status。经过改造bazel源码,固定volatile-status.txt中内容,再次测试验证发现volatile-status.txt不变后,全部命中,说明volatile-status.txt影响远端缓存,具体正式方案如何优化或规避此种情况,待定。
volatile-status.txt和stable-status.txt是bazel自动生成的,在bazel-out目录下
其次,目前CI构建基本采用docker随机申请机器,stable-status.txt稳定文件包含运行 Bazel 的主机的名称等,这些也会变化,导致远端缓存不会全部命中
bazel源码安装教程:从源代码编译 Bazel
改造的文件在GitHub - bazelbuild/bazel: a fast, scalable, multi-language and extensible build systemsrc/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java,将其中stableMap和volatileMap 中需固定的值强制写为固定值即可。
如volatileMap.put(
BuildInfo.BUILD_TIMESTAMP, Long.toString(getCurrentTimeMillis(clientEnv) / 1000));
改为
volatileMap.put(BuildInfo.BUILD_TIMESTAMP, ''1111111111");
本文属于如下文章中的子章节