Trang này dành cho những người dùng Bazel viết quy tắc kiểm thử và bản dựng tuỳ chỉnh muốn hiểu các yêu cầu đối với quy tắc Bazel trong bối cảnh thực thi từ xa.
Tính năng thực thi từ xa cho phép Bazel thực thi các hành động trên một nền tảng riêng biệt, chẳng hạn như một trung tâm dữ liệu. Bazel sử dụng giao thức gRPC để thực thi từ xa. Bạn có thể thử tính năng thực thi từ xa bằng bazel-buildfarm, một dự án nguồn mở nhằm cung cấp nền tảng thực thi từ xa phân tán.
Trang này sử dụng thuật ngữ sau đây khi đề cập đến các loại môi trường hoặc nền tảng khác nhau:
- Nền tảng máy chủ – nơi Bazel chạy.
- Nền tảng thực thi – nơi các hành động của Bazel chạy.
- Nền tảng mục tiêu – nơi các kết quả đầu ra của bản dựng (và một số hành động) chạy.
Tổng quan
Khi định cấu hình bản dựng Bazel để thực thi từ xa, bạn phải tuân theo các nguyên tắc được mô tả trên trang này để đảm bảo bản dựng thực thi từ xa mà không gặp lỗi. Điều này là do bản chất của tính năng thực thi từ xa, cụ thể là:
Các hành động bản dựng riêng biệt. Các công cụ bản dựng không giữ lại trạng thái và các phần phụ thuộc không thể rò rỉ giữa chúng.
Môi trường thực thi đa dạng. Cấu hình bản dựng cục bộ không phải lúc nào cũng phù hợp với môi trường thực thi từ xa.
Trang này mô tả các vấn đề có thể phát sinh khi triển khai quy tắc kiểm thử và bản dựng Bazel tuỳ chỉnh để thực thi từ xa cũng như cách tránh các vấn đề đó. Trang này đề cập đến các chủ đề sau:
- Gọi công cụ bản dựng thông qua quy tắc chuỗi công cụ
- Quản lý các phần phụ thuộc ngầm ẩn
- Quản lý tệp nhị phân phụ thuộc vào nền tảng
- Quản lý quy tắc WORKSPACE theo kiểu định cấu hình
Gọi công cụ bản dựng thông qua quy tắc chuỗi công cụ
Quy tắc chuỗi công cụ Bazel là một trình cung cấp cấu hình cho biết quy tắc bản dựng cần sử dụng công cụ bản dựng nào
(chẳng hạn như trình biên dịch và trình liên kết) và cách định cấu hình các công cụ đó
bằng các tham số do người tạo quy tắc xác định. Quy tắc chuỗi công cụ cho phép quy tắc kiểm thử và bản dựng
gọi công cụ bản dựng theo cách có thể dự đoán và được định cấu hình sẵn
tương thích với tính năng thực thi từ xa. Ví dụ: hãy sử dụng quy tắc chuỗi công cụ
thay vì gọi công cụ bản dựng thông qua PATH, JAVA_HOME, hoặc các biến cục bộ
khác có thể không được đặt thành các giá trị tương đương (hoặc không được đặt) trong môi trường thực thi từ xa.
Hiện có các quy tắc chuỗi công cụ cho quy tắc kiểm thử và bản dựng Bazel cho Scala, Rust, và Go, và các quy tắc chuỗi công cụ mới đang được phát triển cho các ngôn ngữ và công cụ khác, chẳng hạn như bash. Nếu không có quy tắc chuỗi công cụ cho công cụ mà quy tắc của bạn sử dụng, hãy cân nhắc tạo quy tắc chuỗi công cụ.
Quản lý các phần phụ thuộc ngầm ẩn
Nếu một công cụ bản dựng có thể truy cập vào các phần phụ thuộc trên các hành động bản dựng, thì các hành động đó sẽ không thành công khi được thực thi từ xa vì mỗi hành động bản dựng từ xa được thực thi riêng biệt với các hành động khác. Một số công cụ bản dựng giữ lại trạng thái trên các hành động bản dựng và truy cập vào các phần phụ thuộc chưa được đưa vào rõ ràng trong lệnh gọi công cụ . Điều này sẽ khiến các hành động bản dựng được thực thi từ xa không thành công.
Ví dụ: khi Bazel hướng dẫn một trình biên dịch có trạng thái xây dựng foo cục bộ, trình biên dịch sẽ giữ lại các tham chiếu đến kết quả đầu ra của bản dựng foo. Sau đó, khi Bazel hướng dẫn trình biên dịch xây dựng bar (phụ thuộc vào foo) mà không nêu rõ phần phụ thuộc đó trong tệp BUILD để đưa vào lệnh gọi trình biên dịch, hành động sẽ thực thi thành công miễn là cùng một thực thể trình biên dịch thực thi cho cả hai hành động (như thường lệ đối với quá trình thực thi cục bộ). Tuy nhiên, vì trong một tình huống thực thi từ xa, mỗi hành động bản dựng sẽ thực thi một thực thể trình biên dịch riêng biệt, nên trạng thái trình biên dịch và bar's phần phụ thuộc ngầm ẩn vào foo sẽ bị mất và bản dựng sẽ không thành công.
Để giúp phát hiện và loại bỏ các vấn đề về phần phụ thuộc này, Bazel 0.14.1 cung cấp hộp cát Docker cục bộ. Hộp cát này có các hạn chế tương tự đối với các phần phụ thuộc như tính năng thực thi từ xa . Hãy sử dụng hộp cát để chuẩn bị bản dựng cho tính năng thực thi từ xa bằng cách xác định và giải quyết các lỗi bản dựng liên quan đến phần phụ thuộc. Hãy xem bài viết Khắc phục sự cố về tính năng thực thi từ xa của Bazel bằng hộp cát Docker để biết thêm thông tin.
Quản lý tệp nhị phân phụ thuộc vào nền tảng
Thông thường, một tệp nhị phân được xây dựng trên nền tảng máy chủ không thể thực thi một cách an toàn trên một nền tảng thực thi từ xa tuỳ ý do các phần phụ thuộc có thể không khớp. Ví dụ: tệp nhị phân SingleJar được cung cấp cùng với Bazel nhắm đến nền tảng máy chủ. Tuy nhiên, để thực thi từ xa, SingleJar phải được biên dịch như một phần của quy trình xây dựng mã để nhắm đến nền tảng thực thi từ xa. (Xem logic chọn mục tiêu.)
Không được gửi tệp nhị phân của các công cụ bản dựng mà bản dựng của bạn yêu cầu cùng với mã nguồn trừ phi bạn chắc chắn rằng các tệp nhị phân đó sẽ chạy an toàn trong nền tảng thực thi. Thay vào đó, hãy thực hiện một trong những việc sau:
Gửi hoặc tham chiếu bên ngoài mã nguồn cho công cụ để có thể xây dựng mã nguồn đó cho nền tảng thực thi từ xa.
Cài đặt sẵn công cụ vào môi trường thực thi từ xa (ví dụ: một vùng chứa chuỗi công cụ) nếu công cụ đó đủ ổn định và sử dụng quy tắc chuỗi công cụ để chạy công cụ đó trong bản dựng.
Quản lý quy tắc WORKSPACE theo kiểu định cấu hình
Bạn có thể sử dụng các quy tắc WORKSPACE của Bazel để thăm dò nền tảng máy chủ nhằm tìm các công cụ
và thư viện mà bản dựng yêu cầu. Đối với các bản dựng cục bộ, đây cũng là nền tảng
thực thi của Bazel. Nếu bản dựng phụ thuộc rõ ràng vào các công cụ và cấu phần phần mềm bản dựng cục bộ, thì bản dựng đó sẽ không thành công trong quá trình thực thi từ xa nếu nền tảng thực thi từ xa
không giống với nền tảng máy chủ.
Các hành động sau đây do quy tắc WORKSPACE thực hiện không tương thích với
tính năng thực thi từ xa:
Xây dựng tệp nhị phân. Việc thực thi các hành động biên dịch trong quy tắc
WORKSPACEsẽ tạo ra các tệp nhị phân không tương thích với nền tảng thực thi từ xa nếu khác với nền tảng máy chủ.Cài đặt gói
pipCác góipipđược cài đặt thông qua quy tắcWORKSPACEyêu cầu các phần phụ thuộc của chúng phải được cài đặt sẵn trên nền tảng máy chủ. Các gói như vậy được xây dựng dành riêng cho nền tảng máy chủ sẽ không tương thích với nền tảng thực thi từ xa nếu khác với nền tảng máy chủ.Tạo liên kết tượng trưng đến các công cụ hoặc cấu phần phần mềm cục bộ. Các liên kết tượng trưng đến các công cụ hoặc thư viện được cài đặt trên nền tảng máy chủ được tạo thông qua quy tắc
WORKSPACEsẽ khiến bản dựng không thành công trên nền tảng thực thi từ xa vì Bazel sẽ không thể tìm thấy các công cụ hoặc thư viện đó. Thay vào đó, hãy tạo liên kết tượng trưng bằng các hành động bản dựng tiêu chuẩn để các công cụ và thư viện được liên kết tượng trưng có thể truy cập được từ câyrunfilescủa Bazel. Không sử dụngrepository_ctx.symlinkđể liên kết tượng trưng các tệp mục tiêu bên ngoài thư mục kho lưu trữ bên ngoài.Thay đổi nền tảng máy chủ. Tránh tạo tệp bên ngoài cây Bazel
runfiles, tạo biến môi trường và các hành động tương tự, vì các tệp này có thể hoạt động không như mong đợi trên nền tảng thực thi từ xa.
Để giúp tìm hành vi không khép kín tiềm ẩn, bạn có thể sử dụng nhật ký quy tắc không gian làm việc.
Nếu một phần phụ thuộc bên ngoài thực thi các thao tác cụ thể phụ thuộc vào nền tảng máy chủ, bạn nên phân tách các thao tác đó giữa WORKSPACE và quy tắc bản dựng
như sau:
Kiểm tra nền tảng và liệt kê phần phụ thuộc. Các thao tác này có thể thực thi an toàn cục bộ thông qua quy tắc
WORKSPACE. Quy tắc này có thể kiểm tra những thư viện nào được cài đặt, tải các gói phải được xây dựng và chuẩn bị các cấu phần phần mềm cần thiết để biên dịch. Đối với tính năng thực thi từ xa, các quy tắc này cũng phải hỗ trợ việc sử dụng các cấu phần phần mềm đã kiểm tra trước để cung cấp thông tin thường được thu thập trong quá trình kiểm tra nền tảng máy chủ. Các cấu phần phần mềm đã kiểm tra trước cho phép Bazel mô tả các phần phụ thuộc như thể chúng là cục bộ. Sử dụng câu lệnh có điều kiện hoặc cờ--override_repositorycho việc này.Tạo hoặc biên dịch cấu phần phần mềm dành riêng cho mục tiêu và thay đổi nền tảng. Các thao tác này phải được thực thi thông qua quy tắc bản dựng thông thường. Các hành động tạo ra cấu phần phần mềm dành riêng cho mục tiêu cho các phần phụ thuộc bên ngoài phải thực thi trong quá trình xây dựng.
Để dễ dàng tạo các cấu phần phần mềm đã kiểm tra trước cho tính năng thực thi từ xa, bạn có thể sử dụng
WORKSPACE quy tắc để phát ra các tệp được tạo. Bạn có thể chạy các quy tắc đó trên mỗi môi trường thực thi mới
, chẳng hạn như bên trong mỗi vùng chứa chuỗi công cụ và kiểm tra kết quả đầu ra
của bản dựng thực thi từ xa trong kho lưu trữ nguồn để tham chiếu.
Ví dụ: đối với các quy tắc của Tensorflow cho cuda
và python,
quy tắc WORKSPACE sẽ tạo ra BUILD files sau đây.
Đối với quá trình thực thi cục bộ, các tệp được tạo bằng cách kiểm tra môi trường máy chủ sẽ được sử dụng.
Đối với tính năng thực thi từ xa, một câu lệnh có điều kiện
trên một biến môi trường cho phép quy tắc sử dụng các tệp được kiểm tra vào
kho lưu trữ.
Các tệp BUILD khai báo genrules
có thể chạy cả cục bộ và từ xa, đồng thời thực hiện quá trình xử lý cần thiết
đã được thực hiện trước đó thông qua repository_ctx.symlink như minh hoạ ở đây.