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

Báo cáo vấn đề Xem nguồn Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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.

Tính năng thực thi từ xa cho phép Bazel thực thi 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 nền tảng thực thi từ xa phân tán.

Trang này sử dụng các thuật ngữ sau 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 lưu trữ – nơi Bazel chạy.
  • Nền tảng thực thi – nơi các thao tác Bazel chạy.
  • Nền tảng mục tiêu – nơi chạy các đầu ra bản dựng (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 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 việc thực thi từ xa, cụ thể là:

  • Các thao tác tạo riêng biệt. Các 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 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ả những vấn đề có thể phát sinh khi triển khai các 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 những vấn đề đó. Bài viết này đề cập đến các chủ đề sau:

Gọi các công cụ tạo thông qua các 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 nhữ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ách sử dụ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 kiểm thử và bản dựng 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 trước, tương thích với việc 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 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 hoàn toàn không được đặt) trong môi trường thực thi từ xa.

Các quy tắc về chuỗi công cụ hiện có cho các quy tắc kiểm thử và bản dựng Bazel cho Scala, RustGo, đồng thời các quy tắc mới về chuỗi công cụ đang được triển khai cho các ngôn ngữ và công cụ khác 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ếu một công cụ tạo 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 tạo bản dựng, thì những thao tác đó sẽ không thành công khi được thực thi từ xa vì mỗi thao tác tạo bản dựng từ xa được thực thi riêng biệt với các thao tác khác. Một số công cụ tạo giữ lại trạng thái trên các thao tác tạo 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 thao tác tạo đượ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 cục bộ foo, 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. Khi Bazel hướng dẫn trình biên dịch tạo bar (phụ thuộc vào foo) mà không nêu rõ rằng phần phụ thuộc đó trong tệp BUILD sẽ được đưa vào lệnh gọi trình biên dịch, thao tác sẽ thực thi thành công miễn là cùng một phiên bản trình biên dịch thực thi cho cả hai thao tác (như thường lệ đối với quá trình thực thi cục bộ). Tuy nhiên, vì trong trường hợp thực thi từ xa, mỗi thao tác tạo sẽ thực thi một thực thể trình biên dịch riêng biệt, trạng thái trình biên dịch và phần phụ thuộc ngầm của bar vào foo sẽ bị mất và quá trình tạo sẽ thất bại.

Để giúp phát hiện và loại bỏ những 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ộ, 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. Hãy xem bài viết Khắc phục sự cố khi thực thi từ xa Bazel bằng hộp cát Docker để 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 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 lưu trữ. Tuy nhiên, đối với hoạt động thực thi từ xa, SingleJar phải được biên dịch trong quá trình tạo mã để nhắm đến nền tảng thực thi từ xa. (Xem logic lựa chọn mục tiêu.)

Đừng vận chuyển các tệp nhị phân của công cụ tạo 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 chúng sẽ chạy an toàn trong nền tảng thực thi của bạn. Thay vào đó, hãy thực hiện một trong những thao tác sau:

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

  • Cài đặt trước công cụ 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 của bạn.

Quản lý các quy tắc WORKSPACE kiểu định cấu hình

Bạn có thể dùng các quy tắc WORKSPACE của Bazel để kiểm tra nền tảng lưu trữ 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 thao tác 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:

  • Tạo tệp nhị phân. Việc thực thi các thao tác biên dịch trong các quy tắc WORKSPACE sẽ 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 lưu trữ.

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

Để 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 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 từng vùng chứa chuỗi công cụ, đồng thời kiểm tra các đầ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 đâ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ủ lưu trữ sẽ được dùng. Đối với hoạt động thực thi từ xa, 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 trong 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 quy trình xử lý cần thiết đã được thực hiện trước đó thông qua repository_ctx.symlink như minh hoạ tại đây.