Tôi đang gọi cho Bazel bằng các tập lệnh

Báo cáo sự cố Xem nguồn

Bạn có thể gọi Bazel qua các tập lệnh để tạo bản dựng, chạy kiểm thử hoặc truy vấn biểu đồ phần phụ thuộc. Bazel được thiết kế để cho phép viết tập lệnh hiệu quả, nhưng phần này liệt kê một số chi tiết cần lưu ý để giúp tập lệnh mạnh mẽ hơn.

Chọn cơ sở đầu ra

Tuỳ chọn --output_base kiểm soát vị trí quy trình Bazel sẽ ghi đầu ra của bản dựng, cũng như các tệp hoạt động khác nhau được Bazel sử dụng nội bộ. Một trong số đó là khoá giúp ngăn chặn tình trạng đột biến đồng thời cơ sở đầu ra do nhiều quy trình Bazel sử dụng.

Việc chọn đúng thư mục cơ sở đầu ra cho tập lệnh của bạn phụ thuộc vào một số yếu tố. Nếu bạn cần đặt đầu ra của bản dựng ở một vị trí cụ thể, thao tác này sẽ cho biết cơ sở đầu ra mà bạn cần sử dụng. Nếu bạn đang thực hiện lệnh gọi "chỉ có thể đọc" đối với Bazel (chẳng hạn như bazel query), thì các hệ số khoá sẽ quan trọng hơn. Cụ thể, nếu cần chạy đồng thời nhiều phiên bản của tập lệnh, bạn nên lưu ý rằng mỗi quy trình của máy chủ Blaze có thể xử lý tối đa một lệnh gọi mỗi lần. Tuỳ thuộc vào tình huống của bạn, có thể bạn nên chờ đến lượt của tập lệnh hoặc sử dụng --output_base để chạy nhiều máy chủ Blaze và sử dụng các máy chủ đó.

Nếu sử dụng giá trị cơ sở đầu ra mặc định, bạn sẽ cạnh tranh cho cùng một khoá mà các lệnh Bazel tương tác của người dùng sử dụng. Nếu người dùng gặp vấn đề với các lệnh chạy trong thời gian dài, chẳng hạn như các bản dựng, thì tập lệnh của bạn sẽ phải đợi các lệnh đó hoàn tất trước khi có thể tiếp tục.

Lưu ý về chế độ máy chủ

Theo mặc định, Bazel sử dụng một quy trình máy chủ hoạt động trong thời gian dài làm phương án tối ưu hoá. Khi chạy Bazel trong một tập lệnh, đừng quên gọi shutdown khi bạn hoàn tất với máy chủ hoặc chỉ định --max_idle_secs=5 để các máy chủ ở trạng thái rảnh sẽ tự tắt ngay.

Tôi sẽ nhận được mã thoát nào?

Bazel cố gắng phân biệt các lỗi do mã nguồn được xem xét với các lỗi bên ngoài khiến Bazel không thể thực thi đúng cách. Quá trình thực thi Bazel có thể dẫn đến các mã thoát sau:

Mã thoát phổ biến cho tất cả các lệnh:

  • 0 - Thành công
  • 2 – Vấn đề dòng lệnh, cờ hoặc tổ hợp lệnh không hợp lệ hoặc không hợp lệ, hoặc Biến môi trường không hợp lệ. Bạn phải sửa đổi dòng lệnh.
  • 8 – Bản dựng bị gián đoạn nhưng chúng tôi đã chấm dứt do việc ngừng hoạt động theo thứ tự.
  • 9 – Khoá máy chủ bị giữ và --noblock_for_lock đã được thông qua.
  • 32 – Lỗi môi trường bên ngoài không có trên máy này.

  • 33 – Bazel hết bộ nhớ và gặp sự cố. Bạn cần sửa đổi dòng lệnh của mình.

  • 34 – Dành riêng cho Google sử dụng nội bộ.

  • 35 – Dành riêng cho Google sử dụng nội bộ.

  • 36 - Vấn đề môi trường cục bộ, nghi ngờ là vấn đề vĩnh viễn.

  • 37 – Lỗi ngoại lệ chưa được xử lý / Lỗi Bazel nội bộ.

  • 38 – Kết quả lỗi tạm thời khi xuất bản sang Dịch vụ sự kiện bản dựng.

  • 39 – Các Blob do Bazel yêu cầu sẽ bị loại khỏi Bộ nhớ đệm từ xa.

  • 41-44 – Dành riêng cho Google sử dụng nội bộ.

  • 45 – Lỗi liên tục khi xuất bản kết quả sang Dịch vụ sự kiện bản dựng.

  • 47 – Dành riêng cho Google sử dụng nội bộ.

  • 49 – Dành riêng cho Google sử dụng nội bộ.

Mã trả về cho lệnh bazel build, bazel test:

  • 1 – Không tạo được.
  • 3 – Xây dựng được, nhưng một số lượt kiểm thử không thành công hoặc hết thời gian chờ.
  • 4 – Tạo thành công nhưng không tìm thấy kiểm thử nào mặc dù kiểm thử được yêu cầu.

Đối với bazel run:

  • 1 – Không tạo được.
  • Nếu việc tạo bản dựng thành công nhưng quy trình phụ được thực thi trả về một mã thoát khác 0, thì đó cũng sẽ là mã thoát của lệnh.

Đối với bazel query:

  • 3 – Thành công một phần, nhưng truy vấn đã gặp 1 hoặc nhiều lỗi trong nhóm tệp BUILD đầu vào và do đó kết quả của thao tác không đáng tin cậy 100%. Điều này có thể là do một tuỳ chọn --keep_going trên dòng lệnh.
  • 7 – Lỗi lệnh.

Các phiên bản Bazel trong tương lai có thể thêm các mã thoát khác, thay thế mã thoát lỗi chung 1 bằng một giá trị khác 0 với một ý nghĩa cụ thể. Tuy nhiên, tất cả các giá trị thoát khác 0 sẽ luôn tạo thành lỗi.

Đọc tệp .bazelrc

Theo mặc định, Bazel đọc tệp .bazelrc trong thư mục không gian làm việc cơ sở hoặc thư mục gốc của người dùng. Liệu đây có phải là lựa chọn mong muốn cho tập lệnh của bạn hay không; nếu tập lệnh của bạn cần phải hoàn toàn khép kín (chẳng hạn như khi tạo bản phát hành), thì bạn nên tắt tính năng đọc tệp .bazelrc bằng cách sử dụng tuỳ chọn --bazelrc=/dev/null. Nếu bạn muốn tạo bản dựng bằng các chế độ cài đặt ưu tiên của người dùng, thì hành vi mặc định sẽ tốt hơn.

Nhật ký lệnh

Đầu ra Bazel cũng có trong tệp nhật ký lệnh mà bạn có thể tìm thấy bằng lệnh sau:

bazel info command_log

Tệp nhật ký lệnh chứa các luồng stdout và stderr xen kẽ của lệnh Bazel mới nhất. Lưu ý rằng việc chạy bazel info sẽ ghi đè nội dung của tệp này, vì tệp này sẽ trở thành lệnh Bazel gần đây nhất. Tuy nhiên, vị trí của tệp nhật ký lệnh sẽ không thay đổi trừ phi bạn thay đổi chế độ cài đặt của các tuỳ chọn --output_base hoặc --output_user_root.

Phân tích cú pháp kết quả đầu ra

Kết quả đầu ra của Bazel khá dễ phân tích cú pháp cho nhiều mục đích. 2 tuỳ chọn có thể hữu ích cho tập lệnh là --noshow_progress chặn các thông báo tiến trình và --show_result n (giúp kiểm soát việc có in thông báo "build up-to-date" hay không). Các thông báo này có thể được phân tích cú pháp để khám phá xem mục tiêu nào đã được tạo thành công và vị trí của các tệp đầu ra đã tạo. Hãy nhớ chỉ định một giá trị n rất lớn nếu bạn dựa vào các thông báo này.

Khắc phục sự cố về hiệu suất bằng cách phân tích

Xem phần Phân tích hiệu suất.