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 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Trong phần sau, máy chủ lưu trữ là máy chạy Bazel.

Khi sử dụng tính năng thực thi từ xa, các bước xây dựng và/hoặc kiểm thử thực tế không diễn ra trên máy chủ lưu trữ, mà được gửi đến hệ thống thực thi từ xa. 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 đ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 thông tin về máy chủ lưu trữ để sử dụng trong quá trình thực thi, thì bản dựng của bạn có thể bị lỗi do 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 Bazel để thực thi từ xa, bạn cần tìm và khắc phục các quy tắc không gian làm việc đó. Trang này mô tả cách tìm các quy tắc không gian làm việc có thể gặp 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 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 quy tắc này đủ phong phú để cho phép quá trình xử lý tuỳ ý xảy ra trong quy trình. Tất cả các lệnh liên quan đều đang diễn ra cục bộ và có thể là nguồn tiềm ẩn gây ra tình trạng không kín. Thông thường, hành vi không kín đáo được đưa vào thông qua repository_ctx cho phép tương tác với máy chủ lưu trữ.

Kể từ Bazel 0.18, bạn có thể nhận được nhật ký về một số thao tác có thể không kín bằng cách thêm cờ --experimental_workspace_rules_log_file=[PATH] vào lệnh Bazel. Ở đây [PATH] là tên tệp mà trong đó nhật ký sẽ được 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 được lưu vào bộ nhớ đệm, thì các bước đó sẽ không xuất hiện trong nhật ký. Vì vậy, để có kết quả đầy đủ, đừng quên chạy bazel clean --expunge trước.

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

  • 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 đã 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ả quá trình khởi chạy 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 nhật ký không gian làm việc bằng trình phân tích cú pháp workspacelog.

    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ả có thể khá chi tiết và bao gồm kết quả từ các quy tắc tích hợp sẵn trong Bazel.

    Để 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 thao tác không an toàn.

Nhật ký này bao gồm các thông báo WorkspaceEvent nêu ra một số hành động có thể không kín đáo được thực hiện trên 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 những vấn đề này có thể tạo ra bất kỳ phần phụ thuộc nào trên môi trường máy chủ lưu trữ hay không.

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

  • file, template: bản thân điều này không phải là không kín, nhưng có thể 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 nguồn gốc của dữ liệu đầu vào và dữ liệu đầ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à không khép kín, mà là một cách dễ dàng để nhận các phần phụ thuộc trên môi trường lưu trữ. Một bản dựng kín thường sẽ không gọi phương thức này. Khi đánh giá xem mức sử dụng của bạn có kín hay không, hãy lưu ý rằng việc này đang chạy trên máy chủ lưu trữ chứ không phải trên worker. Thông thường, bạn không nên lấy thông tin chi tiết về môi trường từ máy chủ lưu trữ cho các bản dựng từ xa.

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

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