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

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

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

Khi sử dụng phương thức thực thi từ xa, các bước tạo bản dựng và/hoặc kiểm thử thực tế sẽ không diễn ra trên máy chủ mà thay vào đó sẽ đượ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 của không gian làm việc của bạn truy cập vào thông tin về máy chủ để sử dụng trong quá trình thực thi, thì bản dựng có thể bị hỏng 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 của 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ể có 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

Các 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 thực hiện xử lý tuỳ ý trong quá trình này. Tất cả các lệnh liên quan đều xảy ra cục bộ và có thể là một nguồn có thể gây ra tính không độ mạnh. Thông thường, hành vi không mang tính ẩn học được thực hiện 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ể tạo nhật ký của một số hành động có thể không mang tính gợi ý 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 sẽ được tạo nhật ký.

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, để nhận đượ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 trong nhật ký nhiều lần.

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

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

  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ữ đã 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 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 rồi chuyển đến thư mục Bazel bằng cách 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 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ý Workspace 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 rồi kiểm tra xem có hoạt động không an toàn hay không.

Nhật ký bao gồm các thông báo WorkspaceEvent, trong đó nêu một số hành động có thể không mang tính khép kín được thực hiện trên repository_ctx.

Sau đây là những hành động được đánh dấu là có thể không mang tính ẩn dụ:

  • execute: thực thi một lệnh tuỳ ý trên môi trường lưu trữ. Kiểm tra xem các phần phụ thuộc này có thể dẫn đến 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 các bản dựng kín, hãy nhớ chỉ định sha256

  • file, template: bản thân hàm này không phải là tệp kín, nhưng có thể là cơ chế để đưa các phần phụ thuộc trên môi trường máy chủ vào kho lưu trữ. Hãy đảm bảo rằng bạn hiểu rõ 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 lưu trữ.

  • os: về bản chất, hàm này không phải là tệp 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 máy chủ lưu trữ. Bản dựng khép kín thường sẽ không gọi hàm này. Để đánh giá xem mức sử dụng của bạn có mang tính khép kín hay không, hãy lưu ý rằng quá trình này đang chạy trên máy chủ lưu trữ chứ không phải trên worker. Nhìn chung, bạn không nên lấy thông tin cụ thể về môi trường từ máy chủ lưu trữ để xây dựng các bản dựng từ xa.

  • symlink: chế độ này thường an toàn, nhưng hãy tìm 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 đều sẽ gây ra sự cố trên trình chạy 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 đó 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ủ lưu trữ thường gặp sự cố vì các worker có thể có nhiều cấu hình.