Điều chỉnh các quy tắc Bazel để thực thi từ xa

Trang này dành cho những 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 tìm 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.

Khả 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 một nền tảng thực thi từ xa được phân phối.

Trang này sử dụng thuật ngữ sau đây khi đề cập đến nhiều loại môi trường hoặc nền tảng:

  • Nền tảng lưu trữ – nơi Bazel điều hành.
  • Nền tảng thực thi – nơi thực hiện các hành động trên Bazel.
  • Nền tảng mục tiêu – nơi đầu ra 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 làm theo các nguyên tắc mô tả trong trang này để đảm bảo bản dựng thực thi từ xa mà không gặp lỗi. Nguyên nhân là do bản chất của quá trình thực thi từ xa, cụ thể là:

  • Các hành động xây dựng riêng biệt. Công cụ xây dựng không giữ lại trạng thái và các phần phụ thuộc không được rò rỉ giữa chúng.

  • Nhiều 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 các 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 các quy tắc kiểm thử và tạo bản dựng Bazel tuỳ chỉnh để thực thi từ xa cũng như cách tránh các vấn đề đó. Hướng dẫn này bao gồm các chủ đề sau:

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à trình cung cấp cấu hình cho quy tắc bản dựng biết nên sử dụng những công cụ tạo bản dựng nào (chẳng hạn như trình biên dịch và trình liên kết) cũng như cách định cấu hình những 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 các quy tắc tạo và kiểm thử gọi các công cụ xây dựng theo cách có thể dự đoán, được định cấu hình sẵn và tương thích với quá trình 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ác công cụ xây dựng qua PATH, JAVA_HOME hoặc các biến cục bộ khác có thể không được đặt thành giá trị tương đương (hoặc thậm chí không được đặt thành giá trị tương đương) trong môi trường thực thi từ xa.

Hiện tại, các quy tắc chuỗi công cụ dành cho các quy tắc tạo và kiểm thử của Bazel dành cho Scala, RustGo cũng đang được áp dụng cho các quy tắc chuỗi công cụ mới cho các ngôn ngữ và công cụ khác như bash. 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 việ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 tạo 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 tạo 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 thao tác tạo bản dựng và các phần phụ thuộc chưa được đưa rõ ràng vào lệnh gọi công cụ. Điều này sẽ khiến các hành động xây 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 trạng thái tạo foo cục bộ, trình biên dịch sẽ giữ lại các tham chiếu đến đầu ra bản dựng của foo. Sau đó, khi Bazel hướng dẫn trình biên dịch tạo bar (thanh này phụ thuộc vào foo) mà không nêu rõ ràng rằng 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ư điển hình cho việc thực thi cục bộ). Tuy nhiên, vì trong trường hợp thực thi từ xa, mỗi hành động trong bản dựng 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à phần phụ thuộc ngầm ẩn của bar trên foo sẽ bị mất và bản dựng sẽ không hoạt động được.

Để giúp phát hiện và loại bỏ các vấn đề phụ thuộc này, Bazel 0.14.1 cung cấp hộp cát Docker cục bộ, có các hạn chế tương tự đối với các phần phụ thuộc như thực thi từ xa. Sử 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 các 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ý các 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 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 mục tiêu nền tảng lưu trữ. Tuy nhiên, để thực thi từ xa, SingleJar phải được biên dịch trong quá trình xây dựng 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.)

Đừng gửi tệp nhị phân của các công cụ bản dựng mà bản dựng yêu cầu kèm theo mã nguồn, trừ khi bạn chắc chắn rằng các tệp nhị phân đó sẽ chạy một cách an toàn trong nền tảng thực thi của mình. Thay vào đó, hãy thực hiện một trong những thao tác sau:

  • Gửi hoặc tham chiếu bên ngoài mã nguồn của công cụ này để có thể tạo mã nguồn cho nền tảng thực thi từ xa.

  • Cài đặt trước 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 công cụ đủ ổn định và sử dụng các 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 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 lưu trữ cho 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ụ xây dựng và cấu phần phần mềm 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 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 quy trình 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 các quy tắc WORKSPACE sẽ 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 các gói pip. Các gói pip được cài đặt thông qua quy tắc WORKSPACE yêu cầu các phần phụ thuộc phải được cài đặt sẵn trên nền tảng lưu trữ. Các gói như vậy được tạo riêng cho nền tảng lưu trữ 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 lưu trữ.

  • Liên kết đến các công cụ hoặc cấu phần phần mềm cục bộ. Các đườ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 các quy tắc WORKSPACE sẽ khiến bản dựng không hoạt động được trên nền tảng thực thi từ xa vì Bazel sẽ không thể xác định các bản dựng này. Thay vào đó, hãy tạo các đường liên kết tượng trưng bằng các thao tác xây dựng tiêu chuẩn để có thể truy cập vào các công cụ và thư viện liên kết tượng trưng qua cây runfiles của Bazel. Không sử dụng repository_ctx.symlink để liên kết tượng trưng các tệp đích bên ngoài thư mục kho lưu trữ 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 cây Bazel runfiles, tạo các biến môi trường và các thao tác tương tự, vì các biến này 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 mang tính khép kín, bạn có thể sử 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 nền tảng lưu trữ, thì bạn nên phân tách các thao tác đó giữa WORKSPACE và các quy tắc xây 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 cục bộ thông qua các quy tắc WORKSPACE. Các quy tắc này có thể kiểm tra xem thư viện nào được cài đặt, tải các gói phải được tạo xuống và chuẩn bị các cấu phần phần mềm cần thiết cho quá trình biên dịch. Để 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 được kiểm tra trước để cung cấp thông tin thường thu được trong quá trình kiểm tra nền tảng của máy chủ lưu trữ. Các cấu phần phần mềm được kiểm tra trước cho phép Bazel mô tả các phần phụ thuộc như thể đó là các phần phụ thuộc cục bộ. Hãy 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ấu phần phần mềm dành riêng cho mục tiêu và đột biến nền tảng. Những hoạt động này phải được thực thi thông qua quy tắc tạo bản dựng thông thường. Các thao tác tạo 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 được thực thi trong quá trình tạo bản dựng.

Để tạo các cấu phần phần mềm được kiểm tra trước nhằm thực thi từ xa một cách dễ dàng hơn, bạn có thể sử dụng các quy tắc WORKSPACE để phát ra 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 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 đầ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 cudapython, các quy tắc WORKSPACE sẽ tạo ra BUILD files sau. Đối với quá trình thực thi cục bộ, hệ thống sẽ sử dụng các tệp tạo ra bằng cách kiểm tra môi trường máy chủ. Để thực thi từ xa, câu lệnh có điều kiện trên biến môi trường sẽ 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ả trên máy tính và từ xa, đồng thời thực hiện quá trình xử lý cần thiết đã thực hiện trước đó thông qua repository_ctx.symlink như hiển thị tại đây.