Khắc phục sự cố thực thi từ xa Bazel với Docker Sandbox

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Báo cáo sự cố Xem nguồn

Các bản dựng Bazel thành công trên máy có thể không thành công khi được thực thi từ xa do các hạn chế và yêu cầu không ảnh hưởng đến các bản dựng cục bộ. Nguyên nhân phổ biến nhất của những lỗi này được mô tả trong phần Điều chỉnh quy tắc Bazel để thực thi từ xa.

Trang này mô tả cách xác định và giải quyết các vấn đề thường gặp nhất phát sinh khi thực thi từ xa bằng cách sử dụng tính năng hộp cát Docker. Tính năng này sẽ áp đặt các quy định hạn chế đối với bản dựng bằng với các quy tắc hạn chế đối với việc thực thi từ xa. Điều này cho phép bạn khắc phục sự cố cho bản dựng mà không cần dịch vụ thực thi từ xa.

Tính năng hộp cát của Docker bắt chước các hạn chế của việc thực thi từ xa như sau:

  • Hành động tạo bản dựng thực thi trong vùng chứa chuỗi công cụ. Bạn có thể sử dụng cùng các vùng chứa chuỗi công cụ để chạy bản dựng trên máy và từ xa thông qua dịch vụ hỗ trợ thực thi từ xa vùng chứa.

  • Không có dữ liệu không liên quan vượt qua ranh giới của vùng chứa. Chỉ các đầu vào và đầu ra được khai báo tường minh mới có thể nhập và rời khỏi vùng chứa, và chỉ sau khi hành động xây dựng được liên kết hoàn tất.

  • Mỗi thao tác sẽ thực thi trong một vùng chứa mới. Một vùng chứa mới, duy nhất được tạo cho mỗi hành động tạo bản dựng đã tạo.

Bạn có thể khắc phục những sự cố này bằng một trong những cách sau:

  • Khắc phục sự cố về nguồn gốc. Với phương thức này, Bazel và các hành động xây dựng gốc sẽ chạy trên máy cục bộ của bạn. Tính năng Docker hộp cát sẽ áp đặt các hạn chế đối với bản dựng bằng với các tính năng thực thi từ xa. Tuy nhiên, phương thức này sẽ không phát hiện được các công cụ, trạng thái và dữ liệu cục bộ bị rò rỉ trong bản dựng, gây ra các vấn đề khi thực thi từ xa.

  • Khắc phục sự cố trong vùng chứa Docker. Với phương thức này, Bazel và các thao tác tạo bản dựng sẽ chạy bên trong một vùng chứa Docker, cho phép bạn phát hiện các công cụ, trạng thái và dữ liệu bị rò rỉ từ máy cục bộ trong bản dựng ngoài các hạn chế có áp dụng như bằng các hạn chế thực thi từ xa. Phương thức này cung cấp thông tin chi tiết về bản dựng của bạn ngay cả khi các phần của bản dựng không hoạt động. Phương thức này đang trong giai đoạn thử nghiệm và không được hỗ trợ chính thức.

Điều kiện tiên quyết

Trước khi bắt đầu khắc phục sự cố, hãy làm theo các bước sau nếu bạn chưa thực hiện:

  • Cài đặt Docker và định cấu hình các quyền cần thiết để chạy ứng dụng này.
  • Cài đặt Bazel 0.14.1 trở lên. Các phiên bản trước không hỗ trợ tính năng hộp cát Docker.
  • Thêm kho lưu trữ bazel-toolchains được ghim vào phiên bản phát hành mới nhất vào tệp WORKSPACE của bản dựng như mô tả tại đây.
  • Thêm cờ vào tệp .bazelrc để bật tính năng này. Tạo tệp trong thư mục gốc của dự án Bazel nếu tệp này không tồn tại. Cờ bên dưới là mẫu tham chiếu. Vui lòng xem tệp .bazelrc mới nhất trong kho lưu trữ bazel-toolchains và sao chép giá trị của các cờ được xác định tại đó cho cấu hình docker-sandbox.
# Docker Sandbox Mode
build:docker-sandbox --host_javabase=<...>
build:docker-sandbox --javabase=<...>
build:docker-sandbox --crosstool_top=<...>
build:docker-sandbox --experimental_docker_image=<...>
build:docker-sandbox --spawn_strategy=docker --strategy=Javac=docker --genrule_strategy=docker
build:docker-sandbox --define=EXECUTOR=remote
build:docker-sandbox --experimental_docker_verbose
build:docker-sandbox --experimental_enable_docker_sandbox

Nếu quy tắc của bạn yêu cầu công cụ bổ sung, hãy làm như sau:

  1. Tạo một vùng chứa Docker tùy chỉnh bằng cách cài đặt các công cụ bằng Dockerfilexây dựng hình ảnh cục bộ.

  2. Thay thế giá trị của cờ --experimental_docker_image ở trên bằng tên hình ảnh vùng chứa tuỳ chỉnh của bạn.

Khắc phục sự cố về nguyên bản

Phương thức này thực thi Bazel và tất cả thao tác tạo bản dựng trực tiếp trên máy cục bộ. Đây là một cách đáng tin cậy để xác nhận xem bản dựng có thành công hay không khi thực thi từ xa.

Tuy nhiên, với phương thức này, các công cụ, tệp nhị phân và dữ liệu đã cài đặt trên máy có thể bị rò rỉ vào bản dựng, đặc biệt là khi sử dụng các quy tắc WORKSPACE kiểu định cấu hình. Các sự cố rò rỉ như vậy sẽ gây ra các sự cố khi thực thi từ xa. Để phát hiện các sự cố này, hãy khắc phục sự cố trong vùng chứa Docker ngoài việc khắc phục sự cố nguyên bản.

Bước 1: Chạy bản dựng

  1. Thêm cờ --config=docker-sandbox vào lệnh Bazel thực thi bản dựng của bạn. Ví dụ:

    bazel --bazelrc=.bazelrc build --config=docker-sandbox target
    
  2. Chạy bản dựng và đợi quá trình này hoàn tất. Bản dựng sẽ chạy chậm hơn gấp 4 lần so với bình thường do tính năng hộp cát Docker.

Bạn có thể gặp phải lỗi sau:

ERROR: 'docker' is an invalid value for docker spawn strategy.

Nếu bạn làm như vậy, hãy chạy lại bản dựng với cờ --experimental_docker_verbose. Cờ này bật thông báo lỗi chi tiết. Lỗi này thường do lỗi cài đặt Docker lỗi hoặc thiếu quyền thực thi trong tài khoản người dùng hiện tại. Xem tài liệu về Docker để biết thêm thông tin. Nếu vấn đề vẫn tiếp diễn, hãy chuyển đến phần Khắc phục sự cố trong vùng chứa Docker.

Bước 2: Giải quyết các vấn đề phát hiện được

Sau đây là những vấn đề thường gặp nhất và cách giải quyết.

  • Thiếu một tệp, công cụ, tệp nhị phân hoặc tài nguyên mà cây chạy tệp Bazel tham chiếu. Xác nhận rằng tất cả phần phụ thuộc của các mục tiêu bị ảnh hưởng đều đã được khai báo rõ ràng. Hãy xem bài viết Quản lý các phần phụ thuộc ngầm ẩn để biết thêm thông tin.

  • Tệp, công cụ, tệp nhị phân hoặc tài nguyên được tham chiếu bởi đường dẫn tuyệt đối hoặc biến PATH bị thiếu. Xác nhận rằng tất cả công cụ bắt buộc đều được cài đặt trong vùng chứa chuỗi công cụ và sử dụng quy tắc chuỗi công cụ để khai báo đúng cách các phần phụ thuộc trỏ đến tài nguyên bị thiếu. Hãy xem bài viết Gọi các công cụ bản dựng thông qua các quy tắc chuỗi công cụ để biết thêm thông tin.

  • Không thực thi được tệp nhị phân. Một trong những quy tắc xây dựng đang tham chiếu tệp nhị phân không tương thích với môi trường thực thi (vùng chứa Docker). Hãy xem bài viết Quản lý tệp nhị phân phụ thuộc vào nền tảng để biết thêm thông tin. Nếu bạn không thể giải quyết vấn đề này, hãy liên hệ với bazel-Talk@google.com để được trợ giúp.

  • Tệp từ @local-jdk bị thiếu hoặc gây ra lỗi. Các tệp nhị phân Java trên máy cục bộ của bạn sẽ bị rò rỉ vào bản dựng trong khi không tương thích với tệp đó. Sử dụng java_toolchain trong các quy tắc và mục tiêu thay vì @local_jdk. Hãy liên hệ với bazel- Thảo@google.com nếu bạn cần được trợ giúp thêm.

  • Lỗi khác. Hãy liên hệ với bazel-Talk@google.com để được trợ giúp.

Khắc phục sự cố trong vùng chứa Docker

Với phương thức này, Bazel chạy bên trong một vùng chứa Docker lưu trữ và các hành động xây dựng của Bazel sẽ thực thi bên trong các vùng chứa chuỗi công cụ riêng lẻ do tính năng hộp cát Docker cung cấp. Hộp cát sẽ tạo ra một vùng chứa chuỗi công cụ hoàn toàn mới cho mỗi hành động tạo bản dựng và chỉ một hành động được thực thi trong mỗi vùng chứa chuỗi công cụ.

Phương thức này cung cấp quyền kiểm soát chi tiết hơn đối với các công cụ được cài đặt trong môi trường máy chủ lưu trữ. Bằng cách tách việc thực thi bản dựng với việc thực thi các hành động của bản dựng và giữ cho công cụ được cài đặt ở mức tối thiểu, bạn có thể xác minh xem bản dựng của mình có phụ thuộc vào môi trường thực thi cục bộ hay không.

Bước 1: Tạo vùng chứa

  1. Tạo Dockerfile để tạo vùng chứa Docker và cài đặt Bazel bằng một bộ công cụ bản dựng tối thiểu:

    FROM debian:stretch
    
    RUN apt-get update && apt-get install -y apt-transport-https curl software-properties-common git gcc gnupg2 g++ openjdk-8-jdk-headless python-dev zip wget vim
    
    RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
    
    RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    
    RUN apt-get update && apt-get install -y docker-ce
    
    RUN wget https://releases.bazel.build/<latest Bazel version>/release/bazel-<latest Bazel version>-installer-linux-x86_64.sh -O ./bazel-installer.sh && chmod 755 ./bazel-installer.sh
    
    RUN ./bazel-installer.sh
    
  2. Tạo vùng chứa dưới dạng bazel_container:

    docker build -t bazel_container - < Dockerfile
    

Bước 2: Khởi động vùng chứa

Khởi động vùng chứa Docker bằng lệnh bên dưới. Trong lệnh này, hãy thay thế đường dẫn tới mã nguồn trên máy chủ lưu trữ mà bạn muốn tạo.

docker run -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /tmp:/tmp \
  -v your source code directory:/src \
  -w /src \
  bazel_container \
  /bin/bash

Lệnh này chạy vùng chứa dưới dạng thư mục gốc, liên kết ổ cắm docker và gắn thư mục /tmp. Việc này cho phép Bazel sinh ra các vùng chứa Docker khác và sử dụng thư mục trong /tmp để chia sẻ tệp với những vùng chứa đó. Mã nguồn có sẵn tại /src bên trong vùng chứa.

Lệnh này bắt đầu từ một vùng chứa cơ sở debian:stretch có chứa các tệp nhị phân không tương thích với vùng chứa rbe-ubuntu16-04 được dùng làm vùng chứa chuỗi công cụ. Nếu các tệp nhị phân từ môi trường cục bộ bị rò rỉ vào vùng chứa chuỗi công cụ, chúng sẽ gây ra lỗi bản dựng.

Bước 3: Kiểm tra vùng chứa

Chạy các lệnh sau bên trong vùng chứa Docker để kiểm thử:

docker ps
bazel version

Bước 4: Chạy bản dựng

Chạy bản dựng như hiển thị dưới đây. Người dùng đầu ra là thư mục gốc, tương ứng với thư mục có thể truy cập được bằng cùng một đường dẫn tuyệt đối từ bên trong vùng chứa lưu trữ mà Bazel chạy, từ vùng chứa chuỗi công cụ được tạo ra từ tính năng hộp cát Docker mà các thao tác tạo bản dựng của Bazel đang chạy và từ máy cục bộ mà máy chủ lưu trữ và vùng chứa hành động chạy.

bazel --output_user_root=/tmp/bazel_docker_root --bazelrc=.bazelrc \ build --config=docker-sandbox target

Bước 5: Giải quyết các vấn đề phát hiện được

Bạn có thể khắc phục lỗi bản dựng như sau:

  • Nếu việc tạo bản dựng thất bại vì lỗi "hết dung lượng ổ đĩa", bạn có thể tăng giới hạn này bằng cách bắt đầu vùng chứa máy chủ bằng cờ --memory=XX, trong đó XX là dung lượng ổ đĩa phân bổ trong gigabyte. Đây là thử nghiệm và có thể dẫn đến hành vi không thể đoán trước.

  • Nếu việc tạo bản dựng không thành công trong giai đoạn phân tích hoặc tải, một hoặc nhiều quy tắc bản dựng bạn đã khai báo trong tệp WORKSPACE không tương thích với quá trình thực thi từ xa. Xem mục Điều chỉnh quy tắc Bazel cho quá trình thực thi từ xa để nắm được các nguyên nhân và giải pháp có thể áp dụng.

  • Nếu việc tạo bản dựng không thành công vì bất kỳ lý do nào khác, hãy xem các bước khắc phục sự cố trong Bước 2: Giải quyết các sự cố đã phát hiện.