Lưu vào bộ nhớ đệm từ xa

Báo cáo vấn đề Xem nguồn Hằng đêm · 7.3 · 7.2 · 7.1 · 7 · 6,5

Trang này bao gồm 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.

Một nhóm các nhà phát triển sử dụng bộ nhớ đệm từ xa và/hoặc dịch vụ tích hợp liên tục (CI) để 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, dữ liệu đầu ra từ một máy có thể được sử dụng lại an toàn trên một máy khác, do đó giúp các 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 hành động có dữ liệu đầu vào, tên đầu ra, dòng lệnh và các biến môi trường. Bắt buộc đầu vào 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áy chủ làm bộ nhớ đệm từ xa cho đầu ra của bản dựng, đầu ra hành động. 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 của nội dung. Với bộ nhớ đệm từ xa, bạn có thể sử dụng lại kết quả đầ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 chức 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ữ 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à tín hiệu tốt cho ước tính lượt 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 một máy chủ được thiết lập làm bộ nhớ đệm từ xa, bạn sẽ sử dụng bộ nhớ đệm trong 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ẽ tuân theo các bước sau:

  1. Bazel tạo biểu đồ về các mục tiêu cần được xây dựng, sau đó tạo danh sách các hành động bắt buộc. Mỗi hành động trong số này đều có dữ liệu đầu vào đã khai báo và tên tệp đầu ra.
  2. Bazel kiểm tra máy cục bộ của bạn để tìm kết quả đầu ra của bản dựng hiện có và sử dụng lại bất kỳ mà nó tìm thấy.
  3. 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 kết quả được tìm thấy, Bazel truy xuất dữ liệu đầu ra. Đây là một kết quả tìm kiếm trong bộ nhớ đệm.
  4. Đối với các hành động bắt buộc mà không tìm thấy kết quả, Bazel thực thi hành động cục bộ và tạo kết quả đầu ra cần thiết của bản dựng.
  5. 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ủ để đóng vai trò là phần phụ trợ của bộ nhớ đệm. HTTP/1.1 có thể coi dữ liệu của Bazel là các byte mờ và rất 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. Của Bazel Giao thức lưu vào bộ nhớ đệm HTTP là giao thức hỗ trợ điều khiển từ xa lưu vào bộ nhớ đệm.

Bạn chịu trách nhiệm chọn, thiết lập và duy trì phần phụ trợ sẽ lưu trữ các đầu ra được lưu vào bộ nhớ đệm. Khi chọn một 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 ở trong 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 bạn.
  • 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], nó có thể được dùng 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ệ nơi nginx có quyền để ghi và đọc. Bạn có thể phải thay đổi tuỳ chọn client_max_body_size thành giá trị lớn hơn nếu bạn có tệp đầu ra lớn hơn. Máy chủ sẽ yêu cầu 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;
}

điều khiển từ xa bazel

bazel-remote là bộ nhớ đệm bản dựng nguồn mở từ xa mà bạn có thể sử dụng cơ sở hạ tầng của bạn. Chính sách này đã được sử dụng thành công trong phiên bản chính thức tại một số công ty kể từ đầu năm 2018. Lưu ý rằng dự án Bazel không cung cấp 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 là có sẵn dưới dạng [hình ảnh Docker] và mã của hình ảnh này có sẵn trên GitHub. Cả API bộ nhớ đệm từ xa REST và gRPC đều được hỗ trợ.

Tham khảo GitHub để biết hướng dẫn về cách sử dụng công cụ đó.

Google Cloud Storage

[Google Cloud Storage] là kho lưu trữ đối tượng được quản lý toàn diện, cung cấp API HTTP tương thích với giao thức lưu vào bộ nhớ đệm từ xa của Bazel. Cần có bạn có 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:

  1. Tạo bộ chứa lưu trữ. Đảm bảo rằng bạn chọn vị trí nhóm gần bạn nhất làm băng thông mạng rất quan trọng đối với bộ nhớ đệm từ xa.

  2. Tạo một tài khoản dịch vụ để Bazel xác thực với Cloud Storage. Xem Tạo tài khoản dịch vụ.

  3. Tạo một khoá JSON bí mật rồi truyền khoá đó đến Bazel để xác thực. Cửa hàng 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ỳ ý đến/từ bộ chứa GCS của bạn.

  4. 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 đến Bazel bằng cách sử dụng cờ: --remote_cache=https://storage.googleapis.com/bucket-name, trong đó bucket-name là tên bộ chứa lưu trữ của bạn.
    • 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 Xác thực ứng dụng.
  5. Bạn có thể định cấu hình Cloud Storage để tự động xoá các tệp cũ. Để làm như vậy, hãy xem 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 bộ nhớ đệm phần phụ trợ. Một số người dùng đã báo cáo thành công khi sử dụng các phần phụ trợ lưu vào bộ nhớ đệm như Hazelcast, Apache httpdAWS S3.

Xác thực

Kể từ phiên bản 0.11.0, hỗ trợ 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. Chiến lược phát hành đĩa đơn là https://username:password@hostname.com:port/path. Lưu ý rằng Xác thực HTTP cơ bản 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 và do đó, điều quan trọng là luôn sử dụng giao thức này cùng với HTTPS.

Giao thức lưu vào bộ nhớ đệm của HTTP

Bazel hỗ trợ lưu vào bộ nhớ đệm từ xa qua HTTP/1.1. Giao thức này về mặt khái niệm thì đơn giản: Dữ liệu nhị phân (BLOB) được tải lên thông qua yêu cầu PUT và được tải xuống thông qua các yêu cầu GET. Siêu dữ liệu của kết quả hành động được lưu trữ trong đường dẫn /ac/ và các tệp đầu ra sẽ đượ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 về kết quả hành động xuống cho một hành động bằng thuật toán SHA256 hàm băm 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ột máy chủ làm bộ nhớ đệm từ xa, để sử dụng bộ nhớ đệm từ xa, bạn bạn cần thêm cờ vào lệnh Bazel. Xem danh sách cấu hình và cờ của họ bên dưới.

Bạn cũng có thể cần định cấu hình xác thực dành riêng cho máy chủ đã chọn.

Bạn nên thêm những cờ này vào tệp .bazelrc để chỉ định chúng mỗi khi bạn chạy Bazel. Tuỳ thuộc vào dự án của bạn và cho 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ể muốn chỉ hệ thống CI mới 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 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=false

Loạ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

Xoá nội dung khỏi bộ nhớ đệm từ xa là một phần trong quá trình quản lý máy chủ của bạn. Cách xoá nội dung khỏi bộ nhớ đệm từ xa tuỳ thuộc vào máy chủ bạn đang sử dụng 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á 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á không có cách nào để phân biệt đầu ra nào thuộc về một nội dung cụ thể bản dựng.

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ị 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ũ

ổ cắm Unix

Bộ nhớ đệm HTTP từ xa hỗ trợ kết nối qua ổ cắm miền Unix. Hành vi tương tự như cờ --unix-socket của curl. Sử dụng mã sau đây để định cấu hình Unix cổng kết nối miền:

   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. Đây là hữu ích cho việc chia sẻ các cấu phần phần mềm của bản dựng khi chuyển đổi các nhánh và/hoặc đang hoạt động 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 quy trình thanh toán. Từ Bazel không thu thập dữ liệu rác trong thư mục, có thể bạn cần tự động hoá dọn dẹp định kỳ thư mục này. Bật bộ nhớ đệm của ổ đĩa như sau:

build --disk_cache=path/to/build/cache

Bạn có thể chuyển một đường dẫn dành riêng cho người dùng tới 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). Cách này hữu ích khi bật bộ nhớ đệm trên đĩa cho tất cả các nhà phát triển của một dự án thông qua tính năng đã xác nhận trong tệp .bazelrc.

Vấn đề đã biết

Sửa đổi tệp nhập trong quá trình tạo bản dựng

Khi tệp nhập được sửa đổi trong quá trình tạo bản dựng, Bazel có thể tải tệp không hợp lệ lên kết quả vào 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. Có không có vấn đề nào đã biết và chế độ này sẽ được bật theo mặc định trong bản phát hành sau này. Xem [vấn đề #3360] để biết thông tin cập nhật. Nhìn chung, hãy tránh sửa đổi các tệp nguồn trong 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 đề đối với chia sẻ số lần truy cập bộ nhớ đệm từ xa giữa các máy. Ví dụ: những 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ỉ 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 qua --action_env được đưa vào một hành động định nghĩa. Gói Debian/Ubuntu của Bazel dùng để cài đặt /etc/bazel.bazelrc bằng một danh sách cho phép chứa 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 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ó lượt truy cập cũ Tệp /etc/bazel.bazelrc.

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. Đây có thể là chẳng hạn như nếu một hành động sử dụng trình biên dịch từ /usr/bin/. Sau đó: hai người dùng đã cài đặt các trình biên dịch khác nhau sẽ chia sẻ sai lượt truy cập bộ nhớ đệm vì các dữ liệu đầu ra khác nhau nhưng có cùng một hàm băm hành động. 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 kiến 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 cá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ước khi dùng bộ nhớ đệm từ xa.