Trang này trình bày về cơ chế lưu vào bộ nhớ đệm từ xa, thiết lập máy chủ để lưu trữ bộ nhớ đệm và chạy các bản dựng bằng bộ nhớ đệm từ xa.
Bộ nhớ đệm từ xa được một nhóm nhà phát triển và/hoặc hệ thống tích hợp liên tục (CI) sử dụng để chia sẻ đầu ra của bản dựng. Nếu bản dựng của bạn có thể tái tạo, thì bạn có thể sử dụng lại một cách an toàn kết quả đầu ra từ một máy trên một máy khác, nhờ đó có thể tạo bản dựng nhanh hơn đáng kể.
Tổng quan
Bazel chia một bản dựng thành các bước rời rạc, gọi là hành động. Mỗi thao tác có dữ liệu đầu vào, tên đầu ra, dòng lệnh và biến môi trường. Các dữ liệu đầu vào bắt buộc và đầu ra dự kiến được khai báo rõ ràng cho từng hành động.
Bạn có thể thiết lập một máy chủ làm bộ nhớ đệm từ xa cho các đầu ra của bản dựng, chính là những đầu ra của thao tác này. Các dữ liệu đầu ra này bao gồm một danh sách tên tệp đầu ra và hàm băm nội dung của các tệp đó. Với bộ nhớ đệm từ xa, bạn có thể sử dụng lại đầu ra của bản dựng từ bản dựng của người dùng khác thay vì tạo từng đầu ra mới cục bộ.
Cách sử dụng tính năng lưu vào bộ nhớ đệm từ xa:
- Thiết lập một máy chủ làm phần phụ trợ của bộ nhớ đệm
- Định cấu hình bản dựng Bazel để dùng bộ nhớ đệm từ xa
- Sử dụng Bazel phiên bản 0.10.0 trở lên
Bộ nhớ đệm từ xa lưu trữ hai loại dữ liệu:
- Bộ nhớ đệm cho thao tác – liên kết các hàm băm hành động với siêu dữ liệu của kết quả hành động.
- Kho lưu trữ nội dung có thể định địa chỉ (CAS) của các tệp đầu ra.
Xin lưu ý rằng bộ nhớ đệm từ xa cũng lưu trữ stdout và stderr cho mọi thao tác. Do đó, việc kiểm tra stdout/stderr của Bazel không phải là một tín hiệu tốt để ước tính lượt truy cập vào bộ nhớ đệm.
Cách bản dựng sử dụng tính năng lưu vào bộ nhớ đệm từ xa
Sau khi thiết lập một máy chủ làm bộ nhớ đệm từ xa, bạn sẽ sử dụng bộ nhớ đệm theo nhiều cách:
- Đọc và ghi vào bộ nhớ đệm từ xa
- Đọc và/hoặc ghi vào bộ nhớ đệm từ xa ngoại trừ các đích cụ thể
- Chỉ đọc từ bộ nhớ đệm từ xa
- Không sử dụng bộ nhớ đệm từ xa
Khi bạn chạy một bản dựng Bazel có thể đọc và ghi vào bộ nhớ đệm từ xa, bản dựng sẽ thực hiện các bước sau:
- Bazel tạo biểu đồ về các mục tiêu cần được tạo, sau đó tạo danh sách các hành động bắt buộc. Mỗi thao tác này đều có tên tệp đầu vào và đầu ra đã khai báo.
- Bazel kiểm tra máy cục bộ của bạn để tìm các đầu ra bản dựng hiện có và sử dụng lại mọi đầu ra mà nó tìm thấy.
- Bazel kiểm tra bộ nhớ đệm để tìm dữ liệu đầu ra của bản dựng hiện có. Nếu tìm thấy kết quả, Bazel sẽ truy xuất kết quả đó. Đây là một lần truy cập vào bộ nhớ đệm.
- Đối với các thao tác bắt buộc mà không tìm thấy kết quả, Bazel sẽ thực thi các thao tác cục bộ và tạo kết quả cần thiết của bản dựng.
- Đầu ra bản dựng mới được tải lên bộ nhớ đệm từ xa.
Thiết lập máy chủ làm phần phụ trợ của bộ nhớ đệm
Bạn cần thiết lập một máy chủ để đóng vai trò là phần phụ trợ của bộ nhớ đệm. Máy chủ HTTP/1.1 có thể coi dữ liệu của Bazel là các byte mờ và nhiều máy chủ hiện có có thể được dùng làm phần phụ trợ lưu vào bộ nhớ đệm từ xa. Giao thức lưu vào bộ nhớ đệm HTTP của Bazel là giao thức hỗ trợ lưu vào bộ nhớ đệm từ xa.
Bạn chịu trách nhiệm chọn, thiết lập và duy trì máy chủ phụ trợ sẽ lưu trữ các đầu ra đã lưu vào bộ nhớ đệm. Khi chọn máy chủ, hãy cân nhắc:
- Tốc độ kết nối mạng. Ví dụ: nếu nhóm của bạn ở cùng một văn phòng, bạn có thể muốn chạy máy chủ cục bộ của riêng mình.
- Bảo mật. Bộ nhớ đệm từ xa sẽ chứa các tệp nhị phân của bạn và vì vậy cần được bảo mật.
- Dễ quản lý. Ví dụ: Google Cloud Storage là dịch vụ được quản lý toàn diện.
Có nhiều phần phụ trợ có thể dùng cho bộ nhớ đệm từ xa. Một số lựa chọn bao gồm:
nginx
nginx là một máy chủ web nguồn mở. Với [mô-đun WebDAV], bạn có thể dùng mô-đun này làm bộ nhớ đệm từ xa cho Bazel. Trên Debian và Ubuntu, bạn có thể cài đặt gói nginx-extras
. Trên macOS, nginx có sẵn qua Homebrew:
brew tap denji/nginx
brew install nginx-full --with-webdav
Dưới đây là cấu hình mẫu cho nginx. Xin lưu ý rằng bạn sẽ cần thay đổi /path/to/cache/dir
thành một thư mục hợp lệ mà nginx có quyền ghi và đọc. Bạn có thể cần thay đổi tuỳ chọn client_max_body_size
thành một giá trị lớn hơn nếu có các tệp đầu ra lớn hơn. Máy chủ sẽ yêu cầu cấu hình khác, chẳng hạn như xác thực.
Cấu hình mẫu cho phần server
trong nginx.conf
:
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-remote
bazel-remote là một bộ nhớ đệm bản dựng từ xa nguồn mở mà bạn có thể sử dụng trên cơ sở hạ tầng của mình. API này đã được sử dụng thành công trong quá trình phát hành chính thức tại một số công ty kể từ đầu năm 2018. Xin lưu ý rằng dự án Bazel không cung cấp dịch vụ hỗ trợ kỹ thuật cho bazel-remote.
Bộ nhớ đệm này lưu trữ nội dung trên ổ đĩa, đồng thời cung cấp tính năng thu gom rác để thực thi giới hạn bộ nhớ trên và xoá các cấu phần phần mềm không dùng đến. Bộ nhớ đệm có sẵn dưới dạng [hình ảnh docker] và mã của bộ nhớ đệm này có trên GitHub. Cả API bộ nhớ đệm từ xa REST và gRPC đều được hỗ trợ.
Hãy tham khảo trang GitHub để biết hướng dẫn về cách sử dụng tệp này.
Google Cloud Storage
[Google Cloud Storage] là một kho đối tượng được quản lý hoàn toàn, cung cấp một API HTTP tương thích với giao thức lưu vào bộ nhớ đệm từ xa của Bazel. Bạn phải có một tài khoản Google Cloud đã bật tính năng thanh toán.
Cách sử dụng Cloud Storage làm bộ nhớ đệm:
Tạo bộ nhớ. Hãy đảm bảo bạn chọn vị trí bộ chứa gần bạn nhất, vì băng thông mạng là yếu tố quan trọng đối với bộ nhớ đệm từ xa.
Tạo một tài khoản dịch vụ để Bazel xác thực với Cloud Storage. Xem phần Tạo tài khoản dịch vụ.
Tạo khoá JSON bí mật rồi chuyển khoá đó đến Bazel để xác thực. Lưu trữ khoá một cách an toàn vì bất kỳ ai có khoá đều có thể đọc và ghi dữ liệu tuỳ ý vào/từ bộ chứa GCS của bạn.
Kết nối với Cloud Storage bằng cách thêm các cờ sau vào lệnh Bazel:
- Truyền URL sau đây đến Bazel bằng cách sử dụng cờ:
--remote_cache=https://storage.googleapis.com/bucket-name
trong đóbucket-name
là tên của bộ chứa bộ nhớ. - Truyền khoá xác thực bằng cách sử dụng cờ:
--google_credentials=/path/to/your/secret-key.json
hoặc--google_default_credentials
để sử dụng tính năng Xác thực ứng dụng.
- Truyền URL sau đây đến Bazel bằng cách sử dụng cờ:
Bạn có thể định cấu hình Cloud Storage để tự động xoá các tệp cũ. Để thực hiện việc này, hãy xem phần Quản lý vòng đời của đối tượng.
Các máy chủ khác
Bạn có thể thiết lập bất kỳ máy chủ HTTP/1.1 nào hỗ trợ PUT và GET làm phần phụ trợ của bộ nhớ đệm. Người dùng đã báo cáo thành công với các phần phụ trợ lưu vào bộ nhớ đệm như Hazelcast, Apache httpd và AWS S3.
Xác thực
Kể từ phiên bản 0.11.0, hỗ trợ cho Xác thực cơ bản HTTP đã được thêm vào Bazel.
Bạn có thể chuyển tên người dùng và mật khẩu tới Bazel qua URL bộ nhớ đệm từ xa. Cú pháp là https://username:password@hostname.com:port/path
. Lưu ý rằng phương thức Xác thực cơ bản HTTP truyền tên người dùng và mật khẩu dưới dạng văn bản thuần tuý qua mạng. Do đó, điều quan trọng là phải luôn sử dụng thông tin này cùng với HTTPS.
Giao thức lưu vào bộ nhớ đệm HTTP
Bazel hỗ trợ lưu vào bộ nhớ đệm từ xa qua HTTP/1.1. Giao thức này đơn giản về mặt khái niệm: Dữ liệu nhị phân (BLOB) được tải lên thông qua các yêu cầu PUT và tải xuống thông qua các yêu cầu GET.
Siêu dữ liệu kết quả hành động được lưu trữ trong đường dẫn /ac/
và các tệp đầu ra được lưu trữ trong đường dẫn /cas/
.
Ví dụ: hãy xem xét một bộ nhớ đệm từ xa chạy trong http://localhost:8080/cache
.
Yêu cầu Bazel để tải siêu dữ liệu kết quả hành động xuống cho một hành động có hàm băm SHA256 01ba4719...
sẽ có dạng như sau:
GET /cache/ac/01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b HTTP/1.1
Host: localhost:8080
Accept: */*
Connection: Keep-Alive
Yêu cầu Bazel để tải tệp đầu ra có hàm băm SHA256 15e2b0d3...
lên CAS sẽ có dạng như sau:
PUT /cache/cas/15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225 HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Length: 9
Connection: Keep-Alive
0x310x320x330x340x350x360x370x380x39
Chạy Bazel bằng bộ nhớ đệm từ xa
Sau khi một máy chủ được thiết lập làm bộ nhớ đệm từ xa, để sử dụng bộ nhớ đệm từ xa, bạn cần thêm các cờ vào lệnh Bazel. Xem danh sách cấu hình và cờ của các cấu hình đó ở bên dưới.
Bạn cũng có thể cần định cấu hình quy trình xác thực dành riêng cho máy chủ bạn đã chọn.
Bạn nên thêm các cờ này vào tệp .bazelrc
để không cần chỉ định các cờ này mỗi khi chạy Bazel. Tuỳ thuộc vào dự án và hoạt động của nhóm, bạn có thể thêm cờ vào tệp .bazelrc
:
- Trên máy cục bộ
- Trong không gian làm việc của dự án, được chia sẻ với nhóm
- Trên hệ thống CI
Đọc từ và ghi vào bộ nhớ đệm từ xa
Hãy quan tâm đến việc ai có khả năng ghi vào bộ nhớ đệm từ xa. Bạn có thể chỉ muốn hệ thống CI của mình có thể ghi vào bộ nhớ đệm từ xa.
Sử dụng cờ sau để đọc và ghi vào bộ nhớ đệm từ xa:
build --remote_cache=http://your.host:port
Ngoài HTTP
, các giao thức sau đây cũng được hỗ trợ: HTTPS
, grpc
, grpcs
.
Ngoài cờ trên, hãy sử dụng cờ sau để chỉ đọc từ bộ nhớ đệm từ xa:
build --remote_upload_local_results=false
Loại trừ một số mục tiêu cụ thể khỏi việc sử dụng bộ nhớ đệm từ xa
Để loại trừ các mục tiêu cụ thể khỏi việc sử dụng bộ nhớ đệm từ xa, hãy gắn thẻ mục tiêu bằng no-remote-cache
. Ví dụ:
java_library(
name = "target",
tags = ["no-remote-cache"],
)
Xoá nội dung khỏi bộ nhớ đệm từ xa
Việc xoá nội dung khỏi bộ nhớ đệm từ xa là một phần của việc quản lý máy chủ. Cách xoá nội dung khỏi bộ nhớ đệm từ xa tuỳ thuộc vào máy chủ mà bạn đã thiết lập làm bộ nhớ đệm. Khi xoá dữ liệu đầu ra, hãy xoá toàn bộ bộ nhớ đệm hoặc xoá các dữ liệu đầu ra cũ.
Các dữ liệu đầu ra đã lưu vào bộ nhớ đệm được lưu trữ dưới dạng một tập hợp tên và hàm băm. Khi xoá nội dung, bạn không thể phân biệt đầu ra nào thuộc về một bản dựng cụ thể.
Bạn nên xoá nội dung khỏi bộ nhớ đệm để:
- Tạo bộ nhớ đệm sạch sau khi bộ nhớ đệm bị nhiễm độc
- Giảm dung lượng bộ nhớ được sử dụng bằng cách xoá các dữ liệu đầu ra cũ
Sockets Unix
Bộ nhớ đệm HTTP từ xa hỗ trợ kết nối qua ổ cắm miền unix. Hành vi này tương tự như cờ --unix-socket
của curl. Sử dụng nội dung sau để định cấu hình ổ cắm miền unix:
build --remote_cache=http://your.host:port
build --remote_cache_proxy=unix:/path/to/socket
Tính năng này chưa được hỗ trợ trên Windows.
Bộ nhớ đệm của ổ đĩa
Bazel có thể sử dụng một thư mục trên hệ thống tệp làm bộ nhớ đệm từ xa. Điều này rất hữu ích khi chia sẻ cấu phần phần mềm bản dựng khi chuyển đổi nhánh và/hoặc làm việc trên nhiều không gian làm việc của cùng một dự án, chẳng hạn như nhiều lần thanh toán. Bật bộ nhớ đệm của ổ đĩa như sau:
build --disk_cache=path/to/build/cache
Bạn có thể truyền một đường dẫn dành riêng cho người dùng đến cờ --disk_cache
bằng cách sử dụng bí danh ~
(Bazel sẽ thay thế thư mục gốc của người dùng hiện tại). Điều này rất hữu ích khi bật bộ nhớ đệm trên ổ đĩa cho tất cả nhà phát triển của một dự án thông qua tệp .bazelrc
đã đánh dấu của dự án.
Thu gom rác
Kể từ Bazel 7.4, bạn có thể sử dụng --experimental_disk_cache_gc_max_size
và --experimental_disk_cache_gc_max_age
để đặt kích thước tối đa cho bộ nhớ đệm trên ổ đĩa hoặc cho tuổi của từng mục nhập bộ nhớ đệm. Bazel sẽ tự động thu thập dữ liệu rác vào bộ nhớ đệm của ổ đĩa trong khi không hoạt động giữa các bản dựng. Bạn có thể đặt bộ hẹn giờ ở trạng thái rảnh bằng --experimental_disk_cache_gc_idle_delay
(mặc định là 5 phút).
Bên cạnh tính năng thu gom rác tự động, chúng tôi cũng cung cấp một công cụ để thu gom rác theo yêu cầu.
Vấn đề đã biết
Sửa đổi tệp đầu vào trong quá trình tạo bản dựng
Khi tệp đầu vào được sửa đổi trong quá trình tạo bản dựng, Bazel có thể tải các kết quả không hợp lệ lên bộ nhớ đệm từ xa. Bạn có thể bật tính năng phát hiện thay đổi bằng cờ --experimental_guard_against_concurrent_changes
. Không có vấn đề nào đã biết và tính năng này sẽ được bật theo mặc định trong bản phát hành sau này.
Hãy xem [vấn đề #3360] để biết thông tin cập nhật. Nói chung, hãy tránh sửa đổi tệp nguồn trong quá trình tạo bản dựng.
Biến môi trường rò rỉ trong một hành động
Định nghĩa thao tác chứa các biến môi trường. Đây có thể là vấn đề khi chia sẻ các lượt truy cập bộ nhớ đệm từ xa trên các máy. Ví dụ: các môi trường có các biến $PATH
khác nhau sẽ không dùng chung lượt truy cập bộ nhớ đệm. Chỉ những biến môi trường được đưa vào danh sách trắng một cách rõ ràng thông qua --action_env
mới được đưa vào định nghĩa hành động. Gói Debian/Ubuntu của Bazel dùng để cài đặt /etc/bazel.bazelrc
với một danh sách cho phép gồm các biến môi trường bao gồm $PATH
. Nếu bạn nhận được ít lượt truy cập vào bộ nhớ đệm hơn dự kiến, hãy kiểm tra để đảm bảo môi trường của bạn không có tệp /etc/bazel.bazelrc
cũ.
Bazel không theo dõi các công cụ bên ngoài không gian làm việc
Bazel hiện không theo dõi các công cụ bên ngoài không gian làm việc. Điều này có thể là một vấn đề nếu một hành động sử dụng trình biên dịch từ /usr/bin/
. Sau đó, 2 người dùng đã cài đặt các trình biên dịch khác nhau sẽ chia sẻ nhầm lượt truy cập bộ nhớ đệm vì các kết quả khác nhau nhưng có cùng hàm băm hành động. Hãy xem vấn đề #4558 để biết thông tin cập nhật.
Trạng thái tăng dần trong bộ nhớ sẽ mất khi chạy các bản dựng bên trong vùng chứa Docker Bazel sử dụng cấu trúc máy chủ/ứng dụng ngay cả khi chạy trong một vùng chứa Docker. Ở phía máy chủ, Bazel duy trì trạng thái trong bộ nhớ giúp tăng tốc bản dựng. Khi chạy các bản dựng bên trong vùng chứa Docker, chẳng hạn như trong CI, trạng thái trong bộ nhớ sẽ bị mất và Bazel phải tạo lại trạng thái đó trước khi sử dụng bộ nhớ đệm từ xa.
Đường liên kết ngoài
Bản dựng của bạn trong một trung tâm dữ liệu: Nhóm Bazel đã thảo luận về việc lưu vào bộ nhớ đệm và thực thi từ xa tại FOSDEM năm 2018.
Bản dựng Bazel nhanh hơn nhờ lưu vào bộ nhớ đệm từ xa: điểm chuẩn: Nicolò Valigi đã viết một bài đăng trên blog trong đó ông đo điểm chuẩn cho tính năng lưu vào bộ nhớ đệm từ xa trong Bazel.