[bazel]-如何缓存

Change log

目录

[bazel]-导读
[bazel]-概念和术语
[bazel]-bazel的使用
[bazel]-tulsi的使用
[bazel]-如何编译
[bazel]-缓存
[bazel]-影响缓存命中的因素
[bazel]-优化
项目地址

我只是个翻译工.官方文档:https://docs.bazel.build/versions/master/remote-caching.html

一.Remote Caching

开发人员和持续集成(CI)系统可以使用远程缓存来共享构建输出.

在一台机器上编译一次就会被缓存在远程服务器上.

然后另一个哥们就不需要重新编译了.直接使用服务器上的缓存.

构建速度将大大提高.开心.

二.Remote caching overview

Bazel将一次BUILD拆分为不连续的步骤.我们称每个步骤为action.

每个action都有输入名称 / 输出名称 / 命令行 / 环境变量.

每个action都被明确声明了必需的输入和预期的输出.

你可以为编译缓存构建一个远程服务器.

这些缓存由文件名列表和他们内容的hash值.

你可以重用其他用户的编译缓存.而不用自己重新编译.

如何使用remote caching:
1.设置缓存服务器
2.配置BUILD文件
3.使用bazel 0.10.0以后的版本

remote caching有两种缓存方式: (不是很懂.希望有大神给我讲解讲解)
1.以action为缓存单位
2.以输出文件的可寻址存储为单位.(CAS)

三.how a build uses remote caching

当你运行一个可以读/写远程服务器缓存的Bazel build.需要遵循下面几步:

1.Bazel创建了需要被构建的targets的图形.然后创建了所需要的action的列表.每个action都被声明了输入/输入文件名.

2.Bazel会检查在你机器上已经存在的缓存文件并且重用

3.Bazel会检查远程已经存在的缓存.如果找到了.就会取出缓存.

4.如果没找到缓存.Bazel会执行本地的action.并且创建输出文件.

5.新的输出文件将上传到服务器.

四.将一个服务器设置为缓存后端

你需要设置一个服务器作为缓存后端.HTTP/1.1 服务器可以将Bazel的数据视为不透明字节.因为很多现有服务器都可以作为缓存后端.Bazel的HTTP 缓存协议支持远程缓存.

如果你负责选择.配置.维护这个缓存服务器.那么你需要考虑以下几点:

  • 网速.比如.如果你的团队在同一个办公室.那么你可能会运行你自己的本地服务器.
  • 安全.远程服务器将保存你的二进制文件.所以需要保证安全.
  • 易于管理.例如.Google的云端存储就是一个完全托管的服务.

以下有几种可以用来作为缓存服务器的后端:

  • Nginx
  • Bazel远程服务器
  • Google云存储

Nginx

Nginx是一个开源服务器.因为他的WebDAV module.他可以作为Bazel的远程服务器.在Ubuntu上你可以安装nginx-extras这个包.在macOS上Nginx可以通过Homebrew来安装

$ brew tap denji/nginx
$ brew install nginx-full --with-webdav

以下是一个配置nginx的例子.注意你将需要改变/path/to/cache/dir为一个nginx有权限读写的路径.也许你还需要提高client_max_body_size的上限.如果你有很大的输出文件的话.服务器还需要其他一些配置.比如身份验证.

location /cache/ {
  # The path to the directory where nginx should store the cache contents.
  root /path/to/cache/dir;
  # Allow PUT
  dav_methods PUT;
  # Allow nginx to create the /ac and /cas subdirectories.
  create_full_put_path on;
  # The maximum size of a single file.
  client_max_body_size 1G;
  allow all;
}

Bazel远程服务器

Bazel远程服务器是一个开源的缓存服务器.他是实现性的.不受支持.

这些缓存将被存储在磁盘上.并且设置了存储上限.会自动清除无用的缓存.缓存可用作docker镜像.他的代码可以在GitHub上获取.

详细使用说明请看GitHub页面https://github.com/buchgr/bazel-remote/

Google云存储

使用Google云存储有两个要求.1.你需要有一个Google云账户.2.你需要打开广告权限.

想想这速度还是算了吧.

六.身份验证

从0.11.0版本开始.Bazel就添加对HTTP身份验证的支持.你可以通过URL将username和password传递给Bazel.语法为:https://username:password@hostname.com:port/path 请注意HTTP协议的身份验证是明文形式传输的.所以最好用HTTPS.

七.HTTP缓存协议

Bazel支持通过HTTP/1.1远程缓存.这个协议在概念上很简单:二进制数据(BLOB)通过PUT请求上传并通过GET请求下载.action的数据被存储在/ac/路径下.输出文件存储在/cas/路径下.

例如运行在http://localhost:8080/cache下的缓存服务器.Bazel请求下载哈希值为01ba4719...的缓存.将如下所示:

GET /cache/ac/01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b HTTP/1.1
Host: localhost:8080
Accept: */*
Connection: Keep-Alive

Bazel上传哈希值为15e2b0d3...的数据请求将如下所示:

PUT /cas/15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225 HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Length: 9
Connection: Keep-Alive
0x310x320x330x340x350x360x370x380x39

八.使用远程缓存运行Bazel

如果你想用远程缓存运行Bazel.那么你就需要配置身份验证.

你需要将身份验证信息添加进.bazelrc文件里.

1.将身份验证信息添加在你自己的机器上.

2.添加到项目的workspace里.分享给团队成员

3.添加到CI系统里

九.排除特定target使用远程缓存

只需要在不需要缓存的target的BUILD里添加tags = ["no-cache"]即可.如下:

java_library(
    name = "target",
    tags = ["no-cache"],
)

十.磁盘缓存

Bazel也可以使用本地磁盘作为远程缓存.这对于经常切换分支非常有用.由于Bazel不会自动对目录进行垃圾回收.所以你需要自动定期清理此目录.

启用磁盘缓存方式如下:

build --disk_cache=/path/to/build/cache