Change log
目錄
[bazel]-導(dǎo)讀
[bazel]-概念和術(shù)語
[bazel]-bazel的使用
[bazel]-tulsi的使用
[bazel]-如何編譯
[bazel]-緩存
[bazel]-影響緩存命中的因素
[bazel]-優(yōu)化
項(xiàng)目地址
我只是個翻譯工.官方文檔:https://docs.bazel.build/versions/master/remote-caching.html
一.Remote Caching
開發(fā)人員和持續(xù)集成(CI)系統(tǒng)可以使用遠(yuǎn)程緩存來共享構(gòu)建輸出.
在一臺機(jī)器上編譯一次就會被緩存在遠(yuǎn)程服務(wù)器上.
然后另一個哥們就不需要重新編譯了.直接使用服務(wù)器上的緩存.
構(gòu)建速度將大大提高.開心.
二.Remote caching overview
Bazel將一次BUILD拆分為不連續(xù)的步驟.我們稱每個步驟為action.
每個action都有輸入名稱 / 輸出名稱 / 命令行 / 環(huán)境變量.
每個action都被明確聲明了必需的輸入和預(yù)期的輸出.
你可以為編譯緩存構(gòu)建一個遠(yuǎn)程服務(wù)器.
這些緩存由文件名列表和他們內(nèi)容的hash值.
你可以重用其他用戶的編譯緩存.而不用自己重新編譯.
如何使用remote caching:
1.設(shè)置緩存服務(wù)器
2.配置BUILD文件
3.使用bazel 0.10.0以后的版本
remote caching有兩種緩存方式: (不是很懂.希望有大神給我講解講解)
1.以action為緩存單位
2.以輸出文件的可尋址存儲為單位.(CAS)
三.how a build uses remote caching
當(dāng)你運(yùn)行一個可以讀/寫遠(yuǎn)程服務(wù)器緩存的Bazel build.需要遵循下面幾步:
1.Bazel創(chuàng)建了需要被構(gòu)建的targets的圖形.然后創(chuàng)建了所需要的action的列表.每個action都被聲明了輸入/輸入文件名.
2.Bazel會檢查在你機(jī)器上已經(jīng)存在的緩存文件并且重用
3.Bazel會檢查遠(yuǎn)程已經(jīng)存在的緩存.如果找到了.就會取出緩存.
4.如果沒找到緩存.Bazel會執(zhí)行本地的action.并且創(chuàng)建輸出文件.
5.新的輸出文件將上傳到服務(wù)器.
四.將一個服務(wù)器設(shè)置為緩存后端
你需要設(shè)置一個服務(wù)器作為緩存后端.HTTP/1.1 服務(wù)器可以將Bazel的數(shù)據(jù)視為不透明字節(jié).因?yàn)楹芏喱F(xiàn)有服務(wù)器都可以作為緩存后端.Bazel的HTTP 緩存協(xié)議支持遠(yuǎn)程緩存.
如果你負(fù)責(zé)選擇.配置.維護(hù)這個緩存服務(wù)器.那么你需要考慮以下幾點(diǎn):
- 網(wǎng)速.比如.如果你的團(tuán)隊(duì)在同一個辦公室.那么你可能會運(yùn)行你自己的本地服務(wù)器.
- 安全.遠(yuǎn)程服務(wù)器將保存你的二進(jìn)制文件.所以需要保證安全.
- 易于管理.例如.Google的云端存儲就是一個完全托管的服務(wù).
以下有幾種可以用來作為緩存服務(wù)器的后端:
- Nginx
- Bazel遠(yuǎn)程服務(wù)器
- Google云存儲
Nginx
Nginx是一個開源服務(wù)器.因?yàn)樗腤ebDAV module.他可以作為Bazel的遠(yuǎn)程服務(wù)器.在Ubuntu上你可以安裝nginx-extras這個包.在macOS上Nginx可以通過Homebrew來安裝
$ brew tap denji/nginx
$ brew install nginx-full --with-webdav
以下是一個配置nginx的例子.注意你將需要改變/path/to/cache/dir為一個nginx有權(quán)限讀寫的路徑.也許你還需要提高client_max_body_size的上限.如果你有很大的輸出文件的話.服務(wù)器還需要其他一些配置.比如身份驗(yàn)證.
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遠(yuǎn)程服務(wù)器
Bazel遠(yuǎn)程服務(wù)器是一個開源的緩存服務(wù)器.他是實(shí)現(xiàn)性的.不受支持.
這些緩存將被存儲在磁盤上.并且設(shè)置了存儲上限.會自動清除無用的緩存.緩存可用作docker鏡像.他的代碼可以在GitHub上獲取.
詳細(xì)使用說明請看GitHub頁面https://github.com/buchgr/bazel-remote/
Google云存儲
使用Google云存儲有兩個要求.1.你需要有一個Google云賬戶.2.你需要打開廣告權(quán)限.
想想這速度還是算了吧.
六.身份驗(yàn)證
從0.11.0版本開始.Bazel就添加對HTTP身份驗(yàn)證的支持.你可以通過URL將username和password傳遞給Bazel.語法為:https://username:password@hostname.com:port/path 請注意HTTP協(xié)議的身份驗(yàn)證是明文形式傳輸?shù)?所以最好用HTTPS.
七.HTTP緩存協(xié)議
Bazel支持通過HTTP/1.1遠(yuǎn)程緩存.這個協(xié)議在概念上很簡單:二進(jìn)制數(shù)據(jù)(BLOB)通過PUT請求上傳并通過GET請求下載.action的數(shù)據(jù)被存儲在/ac/路徑下.輸出文件存儲在/cas/路徑下.
例如運(yùn)行在http://localhost:8080/cache下的緩存服務(wù)器.Bazel請求下載哈希值為01ba4719...的緩存.將如下所示:
GET /cache/ac/01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b HTTP/1.1
Host: localhost:8080
Accept: */*
Connection: Keep-Alive
Bazel上傳哈希值為15e2b0d3...的數(shù)據(jù)請求將如下所示:
PUT /cas/15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225 HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Length: 9
Connection: Keep-Alive
0x310x320x330x340x350x360x370x380x39
八.使用遠(yuǎn)程緩存運(yùn)行Bazel
如果你想用遠(yuǎn)程緩存運(yùn)行Bazel.那么你就需要配置身份驗(yàn)證.
你需要將身份驗(yàn)證信息添加進(jìn).bazelrc文件里.
1.將身份驗(yàn)證信息添加在你自己的機(jī)器上.
2.添加到項(xiàng)目的workspace里.分享給團(tuán)隊(duì)成員
3.添加到CI系統(tǒng)里
九.排除特定target使用遠(yuǎn)程緩存
只需要在不需要緩存的target的BUILD里添加tags = ["no-cache"]即可.如下:
java_library(
name = "target",
tags = ["no-cache"],
)
十.磁盤緩存
Bazel也可以使用本地磁盤作為遠(yuǎn)程緩存.這對于經(jīng)常切換分支非常有用.由于Bazel不會自動對目錄進(jìn)行垃圾回收.所以你需要自動定期清理此目錄.
啟用磁盤緩存方式如下:
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 '')