Trang này đề cập đến tính khép kín, lợi ích của việc sử dụng các bản dựng khép kín và các chiến lược để xác định hành vi không khép kín trong các bản dựng của bạn.
Tổng quan
Khi được cung cấp cùng một mã nguồn đầu vào và cấu hình sản phẩm, hệ thống tạo bản dựng khép kín luôn trả về cùng một đầu ra bằng cách tách biệt bản dựng khỏi các thay đổi đối với hệ thống máy chủ.
Để tách biệt bản dựng, các bản dựng khép kín không nhạy cảm với các thư viện và phần mềm khác được cài đặt trên máy chủ lưu trữ cục bộ hoặc từ xa. Chúng phụ thuộc vào các phiên bản cụ thể của công cụ bản dựng, chẳng hạn như trình biên dịch và các phần phụ thuộc, chẳng hạn như thư viện. Điều này giúp quá trình tạo bản dựng khép kín vì quá trình này không dựa vào các dịch vụ bên ngoài môi trường tạo bản dựng.
Hai khía cạnh quan trọng của tính khép kín là:
- Cách ly: Hệ thống xây dựng khép kín coi các công cụ là mã nguồn. Họ tải bản sao của các công cụ xuống, đồng thời quản lý bộ nhớ và mức sử dụng trong các cây tệp được quản lý. Điều này tạo ra sự tách biệt giữa máy chủ lưu trữ và người dùng cục bộ, bao gồm cả các phiên bản ngôn ngữ đã cài đặt.
- Danh tính nguồn: Hệ thống xây dựng khép kín cố gắng đảm bảo tính đồng nhất của các đầu vào. Các kho lưu trữ mã (chẳng hạn như Git) xác định các tập hợp đột biến mã bằng một mã băm duy nhất. Hệ thống xây dựng khép kín sử dụng hàm băm này để xác định các thay đổi đối với đầu vào của bản dựng.
Lợi ích
Sau đây là những lợi ích chính của bản dựng khép kín:
- Tốc độ: Bạn có thể lưu kết quả của một thao tác vào bộ nhớ đệm và không cần chạy lại thao tác đó trừ phi dữ liệu đầu vào thay đổi.
- Thực thi song song: Đối với đầu vào và đầu ra nhất định, hệ thống bản dựng có thể tạo một biểu đồ gồm tất cả các thao tác để tính toán việc thực thi hiệu quả và song song. Hệ thống bản dựng tải các quy tắc và tính toán biểu đồ hành động cũng như băm các đầu vào để tra cứu trong bộ nhớ đệm.
- Nhiều bản dựng: Bạn có thể tạo nhiều bản dựng khép kín trên cùng một máy, mỗi bản dựng sử dụng các công cụ và phiên bản khác nhau.
- Khả năng tái tạo: Các bản dựng khép kín rất hữu ích cho việc khắc phục sự cố vì bạn biết chính xác các điều kiện tạo ra bản dựng.
Xác định tính không khép kín
Nếu bạn đang chuẩn bị chuyển sang Bazel, thì quá trình di chuyển sẽ dễ dàng hơn nếu bạn cải thiện tính khép kín của các bản dựng hiện có trước. Sau đây là một số nguồn phổ biến gây ra tình trạng không khép kín trong các bản dựng:
- Xử lý tuỳ ý trong các tệp
.mk
- Các thao tác hoặc công cụ tạo tệp theo cách không xác định, thường liên quan đến mã nhận dạng bản dựng hoặc dấu thời gian
- Các tệp nhị phân hệ thống khác nhau trên các máy chủ (chẳng hạn như tệp nhị phân
/usr/bin
, đường dẫn tuyệt đối, trình biên dịch C++ hệ thống để tự động định cấu hình các quy tắc C++ gốc) - Ghi vào cây nguồn trong quá trình tạo bản dựng. Điều này ngăn không cho cùng một cây nguồn được dùng cho một mục tiêu khác. Bản dựng đầu tiên ghi vào cây nguồn, cố định cây nguồn cho mục tiêu A. Sau đó, việc cố gắng tạo mục tiêu B có thể không thành công.
Khắc phục sự cố về các bản dựng không khép kín
Bắt đầu bằng việc thực thi cục bộ, các vấn đề ảnh hưởng đến lượt truy cập vào bộ nhớ đệm cục bộ sẽ cho thấy các thao tác không khép kín.
- Đảm bảo các bản dựng tuần tự rỗng: Nếu bạn chạy
make
và nhận được một bản dựng thành công, thì việc chạy lại bản dựng sẽ không tạo lại bất kỳ mục tiêu nào. Nếu bạn chạy từng bước xây dựng hai lần hoặc trên các hệ thống khác nhau, hãy so sánh hàm băm của nội dung tệp và nhận được kết quả khác nhau, thì bản dựng sẽ không thể tái tạo. - Chạy các bước để gỡ lỗi các lượt truy cập bộ nhớ đệm cục bộ từ nhiều máy khách tiềm năng để đảm bảo bạn nắm bắt mọi trường hợp môi trường máy khách rò rỉ vào các hành động.
- Thực thi bản dựng trong một vùng chứa Docker chỉ chứa cây nguồn đã kiểm xuất và danh sách rõ ràng về các công cụ lưu trữ. Các thông báo lỗi và sự cố khi tạo sẽ nắm bắt được các phần phụ thuộc hệ thống ngầm.
- Khám phá và khắc phục các vấn đề về tính khép kín bằng cách sử dụng các quy tắc thực thi từ xa.
- Bật tính năng tạo hộp cát nghiêm ngặt ở cấp độ mỗi thao tác, vì các thao tác trong bản dựng có thể có trạng thái và ảnh hưởng đến bản dựng hoặc đầu ra.
- Quy tắc không gian làm việc cho phép nhà phát triển thêm các phần phụ thuộc vào không gian làm việc bên ngoài, nhưng chúng đủ phong phú để cho phép quá trình xử lý tuỳ ý diễn ra trong quy trình. Bạn có thể nhận được nhật ký về một số thao tác có khả năng không khép kín trong các quy tắc không gian làm việc của Bazel bằng cách thêm cờ
--experimental_workspace_rules_log_file=PATH
vào lệnh Bazel.
Tính khép kín với Bazel
Để biết thêm thông tin về cách các dự án khác đã thành công khi sử dụng bản dựng khép kín với Bazel, hãy xem các bài nói chuyện này tại BazelCon:
- Xây dựng hệ thống theo thời gian thực bằng Bazel (SpaceX)
- Bazel Remote Execution and Remote Caching (Uber và TwoSigma)
- Faster Builds With Remote Execution and Caching
- Kết hợp Bazel: Tăng tốc độ xây dựng gia tăng
- Thực thi từ xa so với thực thi cục bộ
- Cải thiện khả năng sử dụng tính năng lưu vào bộ nhớ đệm từ xa (IBM)
- Xây dựng ô tô tự lái bằng Bazel (BMW)
- Xây dựng xe tự lái bằng Bazel + Hỏi và đáp (GM Cruise)