Trang này dành cho người dùng Bazel viết các 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 hiện các thao tác 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ử thực thi từ xa bằng bazel-buildfarm, một dự án nguồn mở nhằm cung cấp khả năng thực thi từ xa được phân phối chủ.
Trang này sử dụng các thuật ngữ sau đây khi đề cập đến các thuật ngữ khác nhau các loại môi trường hoặc nền tảng khác:
- Nền tảng lưu trữ – nơi Bazel hoạt động.
- Nền tảng thực thi – nơi các hành động Bazel chạy.
- Nền tảng mục tiêu – nơi chạy bản dựng đầu ra (và một số hành động).
Tổng quan
Khi định cấu hình bản dựng Bazel để thực thi từ xa, bạn phải làm theo các nguyên tắc được mô tả trên trang này để đảm bảo bản dựng có thể thực thi từ xa không có lỗi. Điều này là do bản chất của quá trình thực thi từ xa, cụ thể là:
Thao tác riêng biệt đối với bản dựng. Công cụ xây dựng không giữ lại trạng thái và phần phụ thuộc không thể bị rò rỉ giữa chúng.
Đa dạng hoá môi trường thực thi. 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 Bazel tuỳ chỉnh tạo và kiểm thử các quy tắc để thực thi từ xa cũng như cách tránh các quy tắc đó. Chiến dịch này bao gồm các chủ đề sau:
- Gọi công cụ xây 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ý các quy tắc WORKSPACE kiểu định cấu hình
Gọi công cụ xây 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 nhà cung cấp cấu hình giúp quy tắc tạo bản dựng biết gì
các công cụ tạo (chẳng hạn như trình biên dịch và trình liên kết) để sử dụng cũng như cách định cấu hình các công cụ đó
bằng cách sử dụng các thông số do người tạo quy tắc xác định. Quy tắc chuỗi công cụ cho phép tạo
và quy tắc kiểm thử để gọi các công cụ xây 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 quy trình thực thi từ xa. Ví dụ: sử dụng quy tắc chuỗi công cụ
thay vì gọi các công cụ bản dựng qua PATH
, JAVA_HOME
hoặc các thuộc tính cục bộ
các biến có thể không được đặt thành giá trị tương đương (hoặc hoàn toàn không được đặt) trong điều khiển từ xa
môi trường thực thi.
Các quy tắc về chuỗi công cụ hiện tồn tại cho các quy tắc tạo và kiểm thử Bazel cho Scala, Râm, và Go (Bắt đầu), và các quy tắc chuỗi công cụ mới đang được triển khai cho các ngôn ngữ và công cụ khác như nhảy vào. Nếu quy tắc chuỗi công cụ không tồn tại 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 thao tác đối với bản dựng, thì những thao tác đó sẽ không thành công khi thực thi từ xa vì từng hành động tạo bản dựng từ xa đã được thực thi riêng biệt. Một số công cụ xây dựng giữ nguyên trạng thái trong các thao tác tạo bản dựng và các phần phụ thuộc truy cập chưa được đưa vào công cụ một cách rõ ràng và lệnh gọi 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 tạo foo cục bộ, trình biên dịch giữ lại các tệp tham chiếu đến dữ liệu đầu ra của bản dựng của foo. Khi đó là khi Bazel hướng dẫn trình biên dịch tạo bar, phụ thuộc vào foo mà không cần 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à thực thể trình biên dịch cho cả hai thao tác (như thông thường đối với quá trình thực thi cục bộ). Tuy nhiên, vì trong tình huống thực thi từ xa, mỗi hành động tạo bản dựng sẽ thực thi một tách riêng thực thể trình biên dịch, trạng thái trình biên dịch và phần phụ thuộc ngầm ẩn của thanh 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ề sự phụ thuộc này, Bazel 0.14.1 cung cấp hộp cát Docker cục bộ, có cùng hạn chế đối với các phần phụ thuộc như điều khiển từ xa thực thi chính sách. Dùng hộp cát để chuẩn bị bản dựng cho quá trình thực thi từ xa bằng cách xác định và giải quyết lỗi bản dựng liên quan đến phần phụ thuộc. Xem bài viết Khắc phục sự cố thực thi từ xa Bazel bằng Docker Sandbox để 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, tệp nhị phân được tạo trên nền tảng lưu trữ không thể thực thi an toàn trên 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 lưu trữ. Tuy nhiên, để thực thi từ xa, SingleJar phải được biên dịch trong quy trình tạo mã để nhắm mục tiêu nền tảng thực thi từ xa. (Xem logic lựa chọn mục tiêu.)
Không gửi tệp nhị phân của các công cụ xây dựng mà bản dựng yêu cầu cùng với mã nguồn của bạn trừ phi bạn chắc chắn chúng sẽ chạy an toàn trong nền tảng thực thi của mình. Thay vào đó, hãy một trong các lệnh sau:
Gửi mã nguồn của công cụ hoặc tham chiếu bên ngoài để mã đó có thể được tạo cho nền tảng thực thi từ xa.
Cài đặt sẵn công cụ này vào môi trường thực thi từ xa (ví dụ: vùng chứa chuỗi công cụ) nếu nó đủ ổn định và sử dụng các quy tắc chuỗi công cụ để chạy nó trong bản dựng của bạn.
Quản lý các quy tắc WORKSPACE kiểu định cấu hình
Các quy tắc WORKSPACE
của Bazel có thể được dùng để thăm dò nền tảng lưu trữ các công cụ
và các 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à thư viện của Bazel
nền tảng thực thi. Nếu bản dựng phụ thuộc rõ ràng vào các công cụ bản dựng cục bộ và
cấu phần phần mềm 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 lưu trữ.
Các thao tác sau đây do quy tắc WORKSPACE
thực hiện không tương thích với
thực thi từ xa:
Tạo tệp nhị phân. Thực thi các hành động biên dịch trong
WORKSPACE
quy tắc dẫn đến 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 lưu trữ.Đang cài đặt gói
pip
.pip
gói được cài đặt quaWORKSPACE
quy tắc yê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 lưu trữ. Các gói được tạo riêng cho nền tảng lưu trữ như vậy sẽ không tương thích với nền tảng thực thi từ xa nếu khác với máy chủ chủ.Liên kết đến các công cụ hoặc cấu phần phần mềm tại địa phương. Liên kết đến các công cụ hoặc thư viện cài đặt trên nền tảng lưu trữ được tạo thông qua quy tắc
WORKSPACE
sẽ khiến không thành công trên nền tảng thực thi từ xa vì Bazel sẽ không thể định vị chúng. Thay vào đó, hãy tạo đường liên kết tượng trưng bằng các thao tác xây dựng chuẩn để Bạn có thể truy cập các công cụ và thư viện liên kết tượng trưng từrunfiles
của Bazel cây xanh. Không sử dụngrepository_ctx.symlink
để liên kết các tệp đích liên kết tượng trưng bên ngoài thư mục repo bên ngoài.Thay đổi nền tảng lưu trữ. Tránh tạo các tệp bên ngoài Bazel Cây
runfiles
, tạo ra các biến môi trường và các hành động tương tự, như chúng có thể hoạt động không như mong đợi trên nền tảng thực thi từ xa.
Để tìm hành vi tiềm ẩn không gián đoạn, bạn có thể dùng Nhật ký quy tắc của Workspace.
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 máy chủ lưu trữ
nền tảng, bạn nên phân tách các hoạt động đó giữa WORKSPACE
và bản dựng
quy tắc như sau:
Kiểm tra nền tảng và liệt kê phần phụ thuộc. Các phép toán này an toàn để thực thi cục bộ thông qua các quy tắc
WORKSPACE
. Quy tắc này có thể kiểm tra xem thư viện đã được cài đặt, tải các gói cần xây dựng xuống và chuẩn bị cấu phần phần mềm cần thiết để biên dịch. Để thực thi từ xa, các quy tắc này phải cũng hỗ trợ sử dụng các cấu phần phần mềm được 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 lưu trữ. Đã kiểm tra trước Cấu phần phần mềm 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_repository
cho trường hợp này.Tạo hoặc biên dịch các cấu phần phần mềm dành riêng cho mục tiêu và đột biến nền tảng. Các thao tác này phải được thực thi thông qua quy tắc xây dựng thông thường. Hành động thì phải thực thi các 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 trong quá trình tạo bản dựng.
Để dễ dàng tạo các cấu phần phần mềm được kiểm tra trước cho quá trình thực thi từ xa, bạn có thể sử dụng
Các quy tắc WORKSPACE
để phát hành các tệp đã tạo. Bạn có thể chạy các quy tắc đó trên từng
môi trường thực thi, chẳng hạn như bên trong mỗi vùng chứa chuỗi công cụ và kiểm tra
đầu ra của bản dựng thực thi từ xa vào 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
tạo ra BUILD files
sau đây.
Để thực thi cục bộ, các tệp được tạo ra bằng cách kiểm tra môi trường lưu trữ sẽ được sử dụ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
kho lưu trữ.
Các tệp BUILD
khai báo genrules
có thể chạy cả trên máy và từ xa, đồng thời thực hiện quá trình xử lý cần thiết
trước đây được thực hiện thông qua repository_ctx.symlink
như minh hoạ tại đây.