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
注意:
该路径中不能包含ASCII码表中的0-31, 127,':', or ‘\’。
否则会报错。如下:
ERROR: Skipping '—-disk_cache=/opt/iOS/loktar_cache': Bad target pattern '—-disk_cache=/opt/iOS/loktar_cache': package names may contain A-Z, a-z, 0-9, or any of ' !"#$%&'()*+,-./;<=>?[]^_`{|}~' (most 7-bit ascii characters except 0-31, 127, ':', or '')