Trang này trình bày về tính năng lưu vào bộ nhớ đệm từ xa, cách thiết lập máy chủ để lưu trữ bộ nhớ đệm và chạy bản dựng bằng bộ nhớ đệm từ xa.
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 bộ nhớ đệm từ xa để chia sẻ kết quả của bản dựng. Nếu bản dựng có thể tái tạo, thì kết quả từ một máy có thể được sử dụng lại một cách an toàn trên một máy khác, nhờ đó có thể giúp bản dựng chạy nhanh hơn đáng kể.
Tổng quan
Bazel chia bản dựng thành các bước riêng biệt, được gọi là hành động. Mỗi hành động có dữ liệu đầu vào, tên đầu ra, dòng lệnh và biến môi trường. Dữ liệu đầu vào bắt buộc và dữ liệu đầ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 kết quả của bản dựng (đây là kết quả của hành động) . Các kết quả này bao gồm danh sách tên tệp đầu ra và hàm băm của nội dung. Với bộ nhớ đệm từ xa, bạn có thể sử dụng lại kết quả của bản dựng từ bản dựng của người dùng khác thay vì xây dựng từng kết quả 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áy chủ làm phần phụ trợ của bộ nhớ đệm
- Định cấu hình bản dựng Bazel để sử 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ữ 2 loại dữ liệu:
- Bộ nhớ đệm hành động, là một bản đồ hàm băm hành động đến siêu dữ liệu kết quả hành động.
- Kho lưu trữ có thể định địa chỉ theo nội dung (CAS) của các tệp đầu ra.
Xin lưu ý rằng bộ nhớ đệm từ xa lưu trữ thêm stdout và stderr cho mọi hành động. 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 số lần truy cập 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áy chủ làm bộ nhớ đệm từ xa, bạn có thể 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 mục tiêu 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 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 đồ các mục tiêu cần xây dựng, sau đó tạo danh sách các hành động bắt buộc. Mỗi hành động này có dữ liệu đầu vào và tên tệp đầu ra đã khai báo.
- Bazel kiểm tra máy cục bộ để tìm các kết quả của bản dựng hiện có và sử dụng lại mọi kết quả tìm thấy.
- Bazel kiểm tra bộ nhớ đệm để tìm các kết quả 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 bộ nhớ đệm.
- Đối với các hành động bắt buộc mà không tìm thấy kết quả, Bazel sẽ thực thi các hành động cục bộ và tạo kết quả của bản dựng bắt buộc.
- Kết quả của 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ủ để hoạt động như phần phụ trợ của bộ nhớ đệm. Máy chủ HTTP/1.1 có thể xử lý dữ liệu của Bazel dưới dạng byte mờ đục, vì vậy, bạn có thể sử dụng nhiều máy chủ hiện có 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ợ tính năng 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 kết quả được lưu vào bộ nhớ đệm. Khi chọn máy chủ, hãy cân nhắc:
- Tốc độ 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ẽ có các tệp nhị phân của bạn, vì vậy, cần phải đảm bảo an toàn.
- Dễ quản lý. Ví dụ: Google Cloud Storage là một dịch vụ được quản lý toàn diện.
Có nhiều phần phụ trợ mà bạn có thể sử 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ể sử 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 thông qua Homebrew:
brew tap denji/nginxbrew install nginx-full --with-webdav
Dưới đây là một ví dụ về cấu hình cho nginx. Xin lưu ý rằng bạn 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. Bộ nhớ đệm này đã được sử dụng thành công trong quá trình sản xuất 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 và cũng cung cấp tính năng thu thập rác để thực thi giới hạn lưu trữ trên và làm sạch các cấu phần phần mềm không dùng đế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.
Google Cloud Storage
[Google Cloud Storage] là một kho lưu trữ đối tượng được quản lý toàn diệ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 cần 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 một bộ chứa lưu trữ. Đảm bảo bạn chọn một vị trí bộ chứa gần bạn nhất, vì băng thông mạng rấ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, sau đó truyền khoá đó cho 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-nametrong đóbucket-namelà tên của bộ chứa lưu trữ. - Truyền khoá xác thực bằng cờ:
--google_credentials=/path/to/your/secret-key.json, hoặc--google_default_credentialsđể sử dụ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, tính năng hỗ trợ Xác thực cơ bản HTTP đã được thêm vào Bazel.
Bạn có thể truyền tên người dùng và mật khẩu đến Bazel thông qua URL bộ nhớ đệm từ xa. Cú pháp là https://username:password@hostname.com:port/path. Xin lưu ý rằng
tính năng Xác thực cơ bản HTTP truyền tên người dùng và mật khẩu ở dạng văn bản thuần tuý qua
mạng, do đó, bạn luôn phải sử dụng tính năng này với HTTPS.
Giao thức lưu vào bộ nhớ đệm HTTP
Bazel hỗ trợ tính năng lưu vào bộ nhớ đệm từ xa thông qua HTTP/1.1. Giao thức này về mặt khái niệm rất đơn giản:
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ữ theo đường dẫn /ac/ và các tệp đầu ra được lưu trữ
theo đường dẫn /cas/.
Ví dụ: hãy xem xét một bộ nhớ đệm từ xa đang 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 một 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 thiết lập máy chủ làm bộ nhớ đệm từ xa, để sử dụng bộ nhớ đệm từ xa, bạn cần thêm cờ vào lệnh Bazel. Xem danh sách cấu hình và cờ tương ứng bên dưới.
Bạn cũng có thể cần định cấu hình tính năng xác thực, tính năng này dành riêng cho máy chủ bạn chọn.
Bạn có thể muố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à
động lực 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 và ghi vào bộ nhớ đệm từ xa
Hãy cẩn thận khi cấp quyền ghi vào bộ nhớ đệm từ xa. Bạn có thể muốn chỉ hệ thống CI 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:portNgoài HTTP, các giao thức sau cũng được hỗ trợ: HTTPS, grpc, grpcs.
Sử dụng cờ sau ngoài cờ ở trên để chỉ đọc từ bộ nhớ đệm từ xa:
build --remote_upload_local_results=falseLoại trừ các 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 bạn xoá nội dung khỏi bộ nhớ đệm từ xa phụ thuộc vào máy chủ mà bạn đã thiết lập làm bộ nhớ đệm. Khi xoá kết quả, hãy xoá toàn bộ bộ nhớ đệm, hoặc xoá các kết quả cũ.
Các kết quả được 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 kết quả nào thuộc về bản dựng cụ thể.
Bạn có thể muốn xoá nội dung khỏi bộ nhớ đệm để:
- Tạo bộ nhớ đệm sạch sau khi bộ nhớ đệm bị hỏng
- Giảm dung lượng lưu trữ được sử dụng bằng cách xoá các kết quả cũ
Cổng Unix
Bộ nhớ đệm HTTP từ xa hỗ trợ kết nối qua cổng miền Unix. Hành vi
tương tự như cờ --unix-socket của curl. Sử dụng lệnh sau để định cấu hình cổng miền Unix:
build --remote_cache=http://your.host:port
build --remote_cache_proxy=unix:/path/to/socketTính năng này không được hỗ trợ trên Windows.
Bộ nhớ đệm trên ổ đĩ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 hữu ích cho việc chia sẻ cấu phần phần mềm của 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 kiểm xuất. Vì Bazel không thu thập rác thư mục, nên bạn có thể muốn tự động hoá việc dọn dẹp định kỳ thư mục này. Bật bộ nhớ đệm trên ổ đĩa như sau:
build --disk_cache=path/to/build/cacheBạn có thể truyền đường dẫn dành riêng cho người dùng đến cờ --disk_cache bằng bí danh ~
(Bazel sẽ thay thế thư mục chính 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
đã kiểm xuất .bazelrc của dự án.
Vấn đề đã biết
Sửa đổi tệp đầu vào trong quá trình xây dựng
Khi một tệp đầu vào được sửa đổi trong quá trình xây dựng, Bazel có thể tải 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 với. 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 trong tương lai.
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 các tệp nguồn trong quá trình xây dựng.
Biến môi trường rò rỉ vào một hành động
Định nghĩa hành động chứa các biến môi trường. Điều này có thể gây ra vấn đề khi
chia sẻ số lần truy cập bộ nhớ đệm từ xa trên các máy. Ví dụ: các môi trường có
biến $PATH khác nhau sẽ không chia sẻ số lần truy cập bộ nhớ đệm. Chỉ các biến môi trường
được đưa vào danh sách cho phép 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 danh sách cho phép các biến môi trường, bao gồm $PATH. Nếu bạn nhận được
ít số lần truy cập bộ nhớ đệm hơn dự kiến, hãy kiểm tra để đảm bảo rằng 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ể gây ra
vấn đề nếu, chẳng hạn như 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ẻ sai số lần truy cập bộ nhớ đệm
vì 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ớ bị mất khi chạy bản dựng bên trong vùng chứa Docker Bazel sử dụng kiến trúc máy chủ/máy khách 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 độ xây dựng. Khi chạy 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 xây dựng lại trạng thái đó trước khi sử dụng bộ nhớ đệm từ xa.