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

Các bản dựng Bazel thành công cục bộ 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ộ. Các nguyên nhân phổ biến nhất gây ra lỗi như vậ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 xảy ra khi thực thi từ xa bằ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 như các hạn chế đối với thực thi từ xa. Nhờ đó, bạn có thể khắc phục sự cố 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 mô phỏng các quy định hạn chế của việc thực thi từ xa như sau:

  • Các thao tác tạo bản dựng sẽ thực thi trong vùng chứa chuỗi công cụ. Bạn có thể sử dụng cùng một 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ợ việc thực thi từ xa được đóng gói trong vùng chứa.

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

  • Mỗi hành động sẽ thực thi trong một vùng chứa mới. Một vùng chứa mới, riêng biệt sẽ đượ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 những vấn đề này bằng một trong các phương thức sau:

  • Khắc phục sự cố gốc. Với phương thức này, Bazel và các thao tác bản dựng của nó sẽ chạy nguyên gốc trên máy cục bộ của bạn. Tính năng hộp cát của 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ế 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ỉ vào bản dựng, 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 xây dựng của nó 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ộ vào bản dựng, ngoài việc áp dụng các quy tắc hạn chế tương đương với các quy tắc hạn chế của quá trình 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 một số phần của bản dựng không thành công. Phương thức này đang trong giai đoạn 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 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 Docker.
  • 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 chưa có. Các cờ dưới đây là mẫu tham khảo. Vui lòng xem tệp .bazelrc mới nhất trong kho lưu trữ chuỗi công cụ bazel và sao chép các 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 các công cụ bổ sung, 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ụ bằ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ố ngay từ đầu

Phương thức này thực thi Bazel và tất cả thao tác liên quan đến bản dựng ngay 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ủa bạn có thành công khi 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ể bị rò rỉ vào bản dựng, đặc biệt là nếu bản dựng sử dụng các quy tắc WORKSPACE kiểu cấu hình. Những trường hợp rò rỉ như vậy sẽ gây ra vấn đề với quá trình thực thi từ xa. Để phát hiện chúng, bạn có thể 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 sẽ chạy chậm hơn gấp bốn 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 có, hãy chạy lại bản dựng bằng cờ --experimental_docker_verbose. Cờ này bật thông báo lỗi chi tiết. Lỗi này thường xảy ra 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. 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 đượ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 được tham chiếu bằng cây tệp chạy Bazel.. 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 đã được khai báo rõ ràng. Hãy xem phần Quản lý phần phụ thuộc ngầm ẩn để biết thêm thông tin.

  • Thiếu tệp, công cụ, tệp nhị phân hoặc tài nguyên được tham chiếu bằng một đường dẫn tuyệt đối hoặc biến PATH. Xác nhận rằng tất cả các công cụ cần thiết đều được cài đặt trong vùng chứa chuỗi công cụ và sử dụng các 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. Xem bài viết Gọi công cụ xây 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 các quy tắc xây dựng đang tham chiếu đến một 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 phần 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 đề, hãy liên hệ theo địa chỉ bazel-discuss@google.com để được trợ giúp.

  • Thiếu tệp từ @local-jdk hoặc tệp đó 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 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ệ 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ệ với 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 thao tác tạo 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 của Docker tạo ra. Hộp cát này tạo 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 thực thi trong mỗi vùng chứa chuỗi công cụ.

Phương thức này cung cấp 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ủ. Bằng cách tách quá trình thực thi bản dựng khỏi quá trình thực thi các hành động thực thi bản dựng và duy trì 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 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 hiển thị bên dưới. Trong lệnh, hãy thay thế đường dẫn đến mã nguồn trên máy chủ 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 ra 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 có chủ đích bắt đầu từ vùng chứa cơ sở debian:stretch 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ụ, thì các tệp này sẽ gây ra lỗi bản dựng.

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

Chạy các lệnh sau từ 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ư minh hoạ bên dưới. 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 bằng cùng một đường dẫn tuyệt đối từ bên trong vùng chứa máy chủ nơi Bazel chạy, từ các vùng chứa chuỗi công cụ do tính năng hộp cát Docker tạo ra trong đó các hành động xây dựng của Bazel đang chạy và từ máy cục bộ nơi vùng chứa máy chủ và 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

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

  • Nếu bản dựng không thành công với 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ủ 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 khó đoán.

  • Nếu bản dựng không thành công trong 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 mà bạn khai báo trong tệp WORKSPACE không tương thích với việc thực thi từ xa. Xem bài viết Điều chỉnh quy tắc Bazel để thực thi từ xa để biết các nguyên nhân có thể xảy ra và cách giải quyết.

  • Nếu 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 vấn đề đã phát hiện.