Tìm hành vi không nghiêm ngặt trong quy tắc WORKSPACE

Báo cáo vấn đề Xem nguồn Hằng đêm · 7.3 · 7.2 · 7.1 · 7 · 6,5

Trong ví dụ sau, máy chủ lưu trữ là máy mà Bazel chạy.

Khi sử dụng tính năng thực thi từ xa, các bước kiểm thử và/hoặc bản dựng thực tế sẽ không diễn ra trên máy chủ lưu trữ mà lại được gửi đến bộ phận thực thi từ xa hệ thống. Tuy nhiên, các bước liên quan đến việc giải quyết quy tắc không gian làm việc vẫn đang diễn ra trên máy chủ. Nếu quy tắc không gian làm việc của bạn truy cập vào thông tin về máy chủ lưu trữ để sử dụng trong quá trình thực thi, bản dựng của bạn có thể bị lỗi do sự không tương thích giữa các môi trường.

Trong quá trình điều chỉnh các quy tắc của Bazel cho điều khiển từ xa , bạn cần tìm các quy tắc không gian làm việc như vậy rồi khắc phục chúng. Trang này mô tả cách tìm không gian làm việc có thể có vấn đề bằng cách sử dụng nhật ký không gian làm việc.

Tìm quy tắc không khép kín

Quy tắc không gian làm việc cho phép nhà phát triển thêm các phần phụ thuộc vào không gian làm việc bên ngoài, nhưng các không gian làm việc này đủ phong phú để cho phép xử lý tuỳ ý xảy ra trong quá trình này. Tất cả các lệnh liên quan đều đang diễn ra trên máy và có thể là nguồn tiềm năng của tính không giống biệt. Thường thì hành vi không kín đáo là giới thiệu qua repository_ctx cho phép tương tác với máy chủ.

Bắt đầu với Bazel 0.18, bạn có thể nhận được nhật ký về một số báo cáo có khả năng không kín bằng cách thêm cờ --experimental_workspace_rules_log_file=[PATH] vào lệnh Bazel của bạn. Ở đây [PATH] là tên tệp chứa nhật ký đã tạo.

Những điều cần lưu ý:

  • nhật ký sẽ ghi lại các sự kiện khi chúng được thực thi. Nếu một số bước lưu vào bộ nhớ đệm, chúng sẽ không xuất hiện trong nhật ký. Vì vậy, để nhận được kết quả đầy đủ, đừng quên chạy trước bazel clean --expunge.

  • Đôi khi, các chức năng có thể được thực thi lại, trong trường hợp đó, mã liên quan các sự kiện sẽ xuất hiện trong nhật ký nhiều lần.

  • Các quy tắc của Workspace hiện chỉ ghi lại các sự kiện Starlark.

Cách tìm nội dung được thực thi trong quá trình khởi chạy không gian làm việc:

  1. Chạy bazel clean --expunge. Lệnh này sẽ xoá bộ nhớ đệm cục bộ và mọi kho lưu trữ được lưu vào bộ nhớ đệm, đảm bảo rằng tất cả hoạt động khởi tạo sẽ được chạy lại.

  2. Thêm --experimental_workspace_rules_log_file=/tmp/workspacelog vào Lệnh Bazel và chạy bản dựng.

    Thao tác này sẽ tạo một tệp proto nhị phân liệt kê các thông báo thuộc loại WorkspaceEvent

  3. Tải mã nguồn Bazel xuống và chuyển đến thư mục Bazel bằng cách sử dụng lệnh bên dưới. Bạn cần có mã nguồn để có thể phân tích cú pháp Workspace có chứa trình phân tích cú pháp nhật ký không gian làm việc.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  4. Trong kho lưu trữ mã nguồn Bazel, hãy chuyển đổi toàn bộ nhật ký không gian làm việc thành văn bản.

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
    
  5. Kết quả đầu ra có thể khá chi tiết và bao gồm đầu ra từ Bazel tích hợp sẵn quy tắc.

    Để loại trừ các quy tắc cụ thể khỏi kết quả, hãy sử dụng tuỳ chọn --exclude_rule. Ví dụ:

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \
        --exclude_rule "//external:local_config_cc" \
        --exclude_rule "//external:dep" > /tmp/workspacelog.txt
    
  6. Mở /tmp/workspacelog.txt và kiểm tra các hoạt động không an toàn.

Nhật ký bao gồm WorkspaceEvent thông báo chỉ rõ một số hành động có thể không kín được thực hiện trên một repository_ctx.

Sau đây là các thao tác được đánh dấu là có khả năng không chấm dứt:

  • execute: thực thi một lệnh tuỳ ý trên môi trường máy chủ lưu trữ. Kiểm tra xem chúng có thể tạo bất kỳ phần phụ thuộc nào trên môi trường lưu trữ.

  • download, download_and_extract: để đảm bảo các bản dựng khép kín, hãy đảm bảo sha256 được chỉ định

  • file, template: đây không phải là một cơ chế để đưa các phần phụ thuộc trên môi trường lưu trữ vào kho lưu trữ. Đảm bảo rằng bạn hiểu rõ nguồn gốc dữ liệu đầu vào và nguồn đầu vào đó không phụ thuộc vào môi trường lưu trữ.

  • os: về bản chất đây không phải là một cách chặt chẽ, mà là một cách dễ dàng để nhận được các phần phụ thuộc trên môi trường lưu trữ. Thường thì bản dựng khép kín sẽ không gọi thuộc tính này. Khi đánh giá xem cách sử dụng của bạn có mang tính khép kín hay không, xin lưu ý rằng đây là chạy trên máy chủ chứ không phải trên worker. Lấy thông tin cụ thể về môi trường từ máy chủ thường không phải là ý tưởng hay cho các bản dựng từ xa.

  • symlink: đây thường là an toàn, nhưng hãy tìm dấu hiệu cảnh báo. Bất kỳ liên kết tượng trưng nào đến bên ngoài kho lưu trữ hoặc tới một đường dẫn tuyệt đối sẽ gây ra sự cố về nhân viên từ xa. Nếu đường liên kết tượng trưng được tạo dựa trên thuộc tính của máy chủ lưu trữ thì nó cũng có thể gặp vấn đề.

  • which: kiểm tra các chương trình được cài đặt trên máy chủ thường gặp sự cố vì các worker có thể có nhiều cấu hình.