[bazel]-如何緩存

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 '')

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容