[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

注意:
该路径中不能包含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 '')

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342