Khắc phục sự cố Thực thi từ xa Bazel bằng Docker Sandbox

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

Các bản dựng Bazel thành công cục bộ có thể không thành công khi 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 gây ra những lỗi như vậy được mô tả trong Đ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 xảy ra khi thực thi từ xa bằng cách dùng tính năng hộp cát Docker. Tính năng này áp dụng các hạn chế đối với bản dựng giống với quy tắc hạn chế của quá trình 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 Docker bắt chước các hạn chế thực thi từ xa như sau:

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

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

  • Mỗi hành động được 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 được tạo.

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

  • Khắc phục sự cố một cách tự nhiên. Với phương thức này, Bazel và các hành động tạo bản dựng gốc chạy sẵn trên máy cục bộ của bạn. Tính năng hộp cát Docker áp dụng các hạn chế đối với bản dựng tương đương với các hạn chế của quá trình 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 cục bộ cũng như tình trạng rò rỉ dữ liệu trong bản dựng mà sẽ gây ra sự cố 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 hành động tạo bản dựng chạy bên trong 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ộ vào bản dựng, ngoài việc áp đặt các hạn chế tương tự như 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 ngay cả khi các phần của bản dựng bị lỗi. Phương thức này đang thử nghiệm và chưa đượ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 như 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 Docker.
  • Cài đặt Bazel 0.14.1 trở lên. Các phiên bản cũ không hỗ trợ tính năng hộp cát Docker.
  • Thêm kho lưu trữ bazel-toolchains (chuỗi công cụ) đượ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 chưa có. Cờ dưới đây là một mẫu tham khảo. 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 xác định ở đó 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 thêm công cụ, hãy làm như sau:

  1. Tạo vùng chứa Docker tuỳ chỉnh bằng cách cài đặt các công cụ dùng Dockerfiletạo hình ảnh cục bộ.

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

Khắc phục sự cố nguyên gốc

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

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 cài đặt cục bộ có thể rò rỉ vào bản dựng, đặc biệt là khi công cụ này sử dụng quy tắc WORKSPACE theo kiểu định cấu hình. Những sự cố rò rỉ như vậy sẽ gây ra 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ố một cách tự nhiê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à chờ quá trình này hoàn tất. Bản dựng này sẽ chạy chậm hơn tối đa 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 cho phép các thông báo lỗi chi tiết. Lỗi này thường do quá trình cài đặt Docker bị lỗi hoặc thiếu quyền thực thi trong tài khoản người dùng hiện tại. Hãy xem tài liệu về Docker để biết thêm thông tin. Nếu sự cố 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

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

  • Một tệp, công cụ, tệp nhị phân hoặc tài nguyên được cây chạy tệp Bazel tham chiếu bị thiếu.. Xác nhận rằng mọi phần phụ thuộc của các mục tiêu bị ảnh hưởng đã đượ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.

  • Một tệp, công cụ, tệp nhị phân hoặc tài nguyên được tham chiếu bằng đường dẫn tuyệt đối hoặc bị thiếu biến PATH. Xác nhận rằng bạn đã cài đặt tất cả công cụ bắt buộc 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 phần Gọi công cụ xây dựng thông qua quy tắc chuỗi công cụ để biết thêm thông tin.

  • Thực thi tệp nhị phân không thành công. Một trong những quy tắc xây dựng đang tham chiếu đến 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). 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 giải quyết được vấn đề, hãy liên hệ theo địa chỉ bazel-discuss@google.com để được trợ giúp.

  • Một tệp trong @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 đang bị rò rỉ vào bản dựng nhưng không tương thích với bản dựng đó. Sử dụng java_toolchain trong các quy tắc và mục tiêu của bạn thay vì @local_jdk. Hãy liên hệ theo địa chỉ bazel-discuss@google.com nếu bạn cần được trợ giúp thêm.

  • Các lỗi khác. Hãy liên hệ theo địa chỉ bazel-discuss@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 tạo của Bazel 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 tạo ra. 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 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 mang đến cho bạn khả năng 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 riêng hoạt động thực thi bản dựng khỏi hoạt động thực thi bản dựng và giữ cho công cụ đã cài đặt ở mức tối thiểu, bạn có thể xác minh xem bản dựng có bất kỳ phần phụ thuộc nào trên 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 một Dockerfile tạo vùng chứa Docker và cài đặt Bazel bằng một bộ công cụ xây 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 dưới đây. Trong lệnh này, hãy thay thế đường dẫn đến 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 gốc, ánh xạ ổ cắm Docker và gắn thư mục /tmp. Điều này cho phép Bazel tạo các vùng chứa Docker khác và sử dụng các thư mục trong /tmp để chia sẻ tệp với các vùng chứa đó. Mã nguồn của bạn có tại /src bên trong vùng chứa.

Lệnh này chủ ý 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 trong môi trường cục bộ bị rò rỉ vào vùng chứa chuỗi công cụ, các tệp nhị phân đó sẽ gây ra lỗi bản dựng.

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

Để kiểm thử, hãy chạy các lệnh sau từ bên trong vùng chứa Docker:

docker ps
bazel version

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

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

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

Bạn có thể giải quyết lỗi về bản dựng như sau:

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

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

  • Nếu không tạo được bản dự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.