Đ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 .

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 hiểu rõ các yêu cầu đối với các 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 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 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 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 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 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á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 được 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 các quy tắc kiểm thử và xây dựng Bazel tuỳ chỉnh để thực thi từ xa, cũng như cách tránh các vấn đề đó. Bài viết 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ụ

Quy tắc chuỗi công cụ Bazel là một nhà cung cấp cấu hình giúp cho quy tắc xây dựng biết nên sử dụng các 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á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 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 tính năng 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 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) trong môi trường thực thi từ xa.

Các quy tắc chuỗi công cụ hiện tồn tại cho các quy tắc kiểm thử và tạo Bazel cho Scala, RustGo, đồng thời 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ư 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 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 xây 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 những thao tác khác. Một số công cụ xây dựng giữ nguyên trạng thái trên các hành động tạo bản dựng và các phần phụ thuộc truy cập 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 tạo 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 sẽ giữ lại các thông tin tham chiếu đến dữ liệu đầu ra của bản dựng của foo. Sau đó, 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õ phần phụ thuộc đó trong tệp BUILD để đưa vào lệnh gọi trình biên dịch, thao tác này 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 cả hai hành động (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 bản dựng sẽ thực thi một phiên bản 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 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ư quá trì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ố thực thi từ xa 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 tạo trên nền tảng lưu trữ không thể thực thi 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, để thực thi từ xa, SingleJar phải được biên dịch trong quá trình tạo mã để nhắm mục tiêu đến 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ụ xây dựng mà bản dựng 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 đó 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:

  • Gửi hoặc tham chiếu bên ngoài mã nguồn cho 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ụ: một 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 của bạn.

Quản lý các 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ữ đối với 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ụ bản 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 chế độ 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ẽ 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. Các gói pip được cài đặt thông qua quy tắc WORKSPACE yêu cầu phải cài đặt sẵn các phần phụ thuộc của các gói đó 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 nền tảng máy chủ lưu trữ.

  • 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. Các liên kết đế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 bản dựng gặp lỗi 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 đó. 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 tạo bản 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 từ cây runfiles của Bazel. Không sử dụng repository_ctx.symlink để liên kết các tệp đích liên kết 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ì 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 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à 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 an toàn khi 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 cần tạo xuống và chuẩn bị các cấu phần phần mềm bắt buộc để 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 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 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ộ. 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á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. Các thao tác 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á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 quy tắc WORKSPACE để phát 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 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 tạo ra các 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, 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ả trên máy và từ xa, cũng như thực hiện hoạt động xử lý cần thiết trước đây thông qua repository_ctx.symlink như minh hoạ tại đây.