Thích ứng với các quy tắc Bazel để thực thi từ xa

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Báo cáo vấn đề Xem nguồn

Trang này dành cho những người dùng Bazel đang viết các quy tắc xây dựng và kiểm thử 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.

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, chẳng hạn như 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, dự án nguồn mở nhằm cung cấp nền tảng thực thi từ xa được phân phối.

Trang này sử dụng thuật ngữ sau 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 chạy.
  • Nền tảng thực thi – nơi chạy các hành động Bazel.
  • Nền tảng mục tiêu – nơi hoạt động của 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 tuân thủ 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 tính chất của việc thực thi từ xa, cụ thể là:

  • Các hành động xây dựng tách 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ể bị rò rỉ giữa các trạng thái đó.

  • Môi trường thực thi đa dạng. Cấu hình xây 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 các quy tắc xây dựng và kiểm thử Bazel tuỳ chỉnh để thực thi từ xa và cách tránh các vấn đề đó. Chương trình này bao gồm những 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 công cụ Bazel là một nhà cung cấp cấu hình cho quy tắc xây dựng biết nên sử dụng công cụ xây 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 các công cụ đó bằng cách sử dụng các tham số do trình tạo quy tắc xác định. Quy tắc chuỗi công cụ cho phép các quy tắc xây dựng và thử nghiệm gọi các công cụ bản dựng theo cách dự đoán được, được định cấu hình trước tương thích với quá 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 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 giá trị tương đương (hoặc hoàn toàn) trong môi trường thực thi từ xa.

Hiện tại, các quy tắc công cụ tạo chuỗi công cụ đang được sử dụng cho các quy tắc xây dựng và kiểm thử Bazel cho Scala, RustGo, và các quy tắc chuỗi công cụ mới đang được tiến hành cho các ngôn ngữ và công cụ khác như bash. Nếu công cụ mà quy tắc của bạn sử dụng không có quy tắc chuỗi công cụ, hãy xem xét 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ụ xây dựng có thể truy cập vào các phần phụ thuộc trên các hành động xây 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 xây dựng từ xa đều được thực thi riêng biệt với các hành động khác. Một số công cụ xây dựng giữ lại trạng thái trên các hành động xây dựng và truy cập các phần phụ thuộc chưa được đưa 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 có trạng thái tạo foo cục bộ, trình biên dịch sẽ giữ lại tệp tham chiếu đến đầ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, việc này phụ thuộc vào foo, mà không nêu rõ rằng phần phụ thuộc trong tệp BUILD để đưa vào lệnh gọi trình biên dịch, thì hành động này 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 thường đố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 hành động tạo 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à phần phụ thuộc ngầm định của bar trên foo sẽ bị mất và bản dựng sẽ không hoạt động.

Để 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ự cho các phần phụ thuộc như quá trình thực thi từ xa. Sử dụng hộp cát để chuẩn bị bản dựng 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 phần Khắc phục sự cố 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, tệp nhị phân được xây dựng trên nền tảng lưu trữ không thể thực thi một cách 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.)

Khô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 bằng mã nguồn của bạn, trừ khi bạn chắc chắn rằng các công cụ đó sẽ chạy 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:

  • Giao hàng hoặc tham chiếu đến mã nguồn của công cụ để có thể tạo mã cho nền tảng thực thi từ xa.

  • Cài đặt trước công cụ này trong 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ày đủ ổ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ý 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ữ 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ụ và cấu phần phần mềm bản dựng cục bộ, thì bản dựng này sẽ không thể hoạt động trong quá trình thực thi từ xa nếu nền tảng thực thi từ xa này 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:

  • Tạo 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 qua quy tắc WORKSPACE yêu cầu phải cài đặt sẵn các phần phụ thuộc trên nền tảng lưu trữ. Các gói như vậy, được xây dựng 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ông cụ hoặc cấu phần phần mềm cục bộ. Việc liên kết với 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 bản dựng không thể hoạt động trên nền tảng thực thi từ xa vì Bazel sẽ không thể xác định các đường liên kết đó. 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 hành động tạo bản dựng tiêu chuẩn để truy cập được vào các công cụ và thư viện đã liên kết từ 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 mục tiêu bên ngoài thư mục repo bên ngoài.

  • Sửa đổi nền tảng lưu trữ. Tránh tạo các tệp bên ngoài cây runfiles Bazel, tạo các biến môi trường và những hành động tương tự, vì các biến này có thể hoạt động không như mong muốn trên nền tảng thực thi từ xa.

Để tìm các hành vi có thể không phải do người viết báo, 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 tách các thao tác đó giữa WORKSPACE và các quy tắc xây dựng như sau:

  • liệt kê phần phụ thuộc và kiểm tra nền tảng. Những thao tác này sẽ an toàn để 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 thư viện nào đã đượ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. Để thực thi từ xa, các quy tắc này cũng phải hỗ trợ việc sử dụng cấu phần phần mềm được đánh dấu sẵn để cung cấp thông tin thường sẽ được lấy trong quá trình kiểm tra nền tảng lưu trữ. Cấu phần phần mềm được đánh dấu sẵn cho phép Bazel mô tả các phần phụ thuộc như thể các phần phụ thuộc này. Sử dụng câu lệnh có điều kiện hoặc cờ --override_repository để thực hiện 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à sự thay đổi của nền tảng. Các thao tác 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 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 tạo bản dựng.

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