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 · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Trong phần 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 thực tế để tạo và/hoặc kiểm thử 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 các quy tắc không gian làm việc đang diễn ra trên máy chủ lưu trữ. Nếu các quy tắc không gian làm việc của bạn truy cập thông tin về máy chủ để 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 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 Bazel để thực thi từ xa, bạn cần tìm các quy tắc không gian làm việc như vậy và khắc phục chúng. Trang này mô tả cách tìm các quy tắc không gian làm việc có thể gây ra vấn đề bằng cách sử dụng nhật ký không gian làm việc.

Tìm các 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 chúng đủ phong phú để cho phép quá trình xử lý tuỳ ý diễn ra trong quá trình này. Tất cả các lệnh liên quan đều diễn ra cục bộ và có thể là nguồn tiềm ẩn của tính không khép kín. Thông thường, hành vi không khép kín được giới thiệu thông qua repository_ctx, cho phép tương tác với máy chủ.

Kể từ Bazel 0.18, bạn có thể nhận được nhật ký của một số thao tác có thể không khép kín bằng cách thêm cờ --experimental_workspace_rules_log_file=[PATH] vào lệnh Bazel. Trong đó, [PATH] là tên tệp mà nhật ký sẽ được tạo.

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

  • nhật ký 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, chúng 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 đó, 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 không gian làm việc hiện chỉ ghi lại các sự kiện Starlark.

Cách tìm những gì đã được thực thi trong quá trình khởi tạo 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 tạo sẽ được chạy lại.

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

    Thao tác này tạo ra 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 cả kết quả từ các quy tắc Bazel tích hợp.

    Để loại trừ các quy tắc cụ thể khỏi đầu ra, hãy sử dụng lựa 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 rõ một số hành động có khả năng không khép kín được thực hiện trên repository_ctx.

Sau đây là những thao tác được đánh dấu là có khả năng không khép kín:

  • execute: thực thi một lệnh tuỳ ý trên môi trường máy chủ. Kiểm tra xem những điều này có thể gây ra bất kỳ sự phụ thuộc nào vào môi trường máy chủ hay không.

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

  • 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 vào 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 đó không phụ thuộc vào môi trường máy chủ.

  • os: bản thân nó không phải là không kín, nhưng là một cách dễ dàng để nhận được các phần phụ thuộc trên môi trường máy chủ. Bản dựng khép kín thường sẽ không gọi lệnh này. Khi đánh giá xem việc sử dụng của bạn có khép 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 các worker. Việc lấy thông tin cụ thể về môi trường từ máy chủ lưu trữ thường không phải là ý tưởng hay cho các bản dựng từ xa.

  • symlink: thường thì việc này không gây hại, nhưng hãy chú ý đến những dấu hiệu đáng ngờ. Mọi symlink đến bên ngoài kho lưu trữ hoặc đến một đường dẫn tuyệt đối sẽ gây ra vấn đề cho worker từ xa. Nếu bạn tạo symlink dựa trên các thuộc tính của máy chủ lưu trữ, thì có thể symlink đó cũng sẽ 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ủ lưu trữ thường có vấn đề vì các worker có thể có nhiều cấu hình.