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

Báo cáo vấn đề Xem nguồn Hằng đêm · 7,3 · 7.2 · 7.1 · 7 · 6,5

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ộ. Phổ biến nhất nguyên nhân gây ra những lỗi đó đượ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 mà phát sinh với quá trình thực thi từ xa bằng tính năng hộp cát Docker, tính năng này khiến 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. Điều này cho phép bạn để 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 bắt chước các hạn chế 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ợ 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 qua ranh giới vùng chứa. Chỉ một cách rõ ràng đầu vào và đầu ra đã khai báo vào và rời khỏi vùng chứa, chỉ sau khi hành động tạo 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, duy nhất là đượ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 pháp sau:

  • Khắc phục sự cố tự nhiên. Với phương pháp này, Bazel và các hành động tạo bản dựng tương ứng chạy tự nhiên trên máy cục bộ của bạn. Docker tính năng hộp cát áp đặt các hạn chế đối với bản dựng giống như các hạn chế của điều khiển từ xa thực thi chính sách. Tuy nhiên, phương pháp này sẽ không phát hiện các công cụ, trạng thái và rò rỉ dữ liệu 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 tạo bản dựng của nó chạy bên trong vùng chứa Docker, giúp bạn phát hiện các công cụ, trạng thái và dữ liệu bị rò rỉ từ vào bản dựng ngoài các hạn chế áp đặt bằng với thực thi từ xa. Phương pháp này cung cấp thông tin chi tiết về ngay cả khi một số phần của bản dựng bị lỗi. 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 Docker.
  • Cài đặt Bazel 0.14.1 trở lên. Các phiên bản trước không hỗ trợ Docker hộp cát.
  • Thêm chuỗi công cụ bazel kho lưu trữ (đượ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 không có thư mục này. Cờ bên dưới là mẫu tham chiếu. Vui lòng xem thông tin mới nhất .bazelrc trong kho lưu trữ bazel-toolchains và sao chép giá trị của các 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ụ bằng Dockerfilexây dựng cục bộ hình ảnh.

  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 tùy chỉnh.

Khắc phục sự cố tự nhiên

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 của phương thức này trực tiếp trên và là cách đáng tin cậy để xác nhận xem bản dựng của bạn có thành công hay không khi thực thi từ xa.

Tuy nhiên, với phương pháp 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ủa bạn, đặc biệt nếu bản dựng đó sử dụng các quy tắc WORKSPACE kiểu định cấu hình. Những trường hợp rò rỉ như vậy sẽ gây ra các sự cố khi thực thi từ xa; để phát hiện chúng, hãy khắc phục sự cố trong vùng chứa Docker bên cạnh việc khắc phục sự cố 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 tạo hoàn tất. Bản dựng sẽ chạy tối đa 4 chậm hơn bình thường gấp nhiều 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 đúng như vậy, hãy chạy lại bản dựng với cờ --experimental_docker_verbose. Cờ này bật 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 Docker 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

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 tham chiếu bởi cây chạy tệp Bazel thiế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. Xem 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ằng một đường dẫn tuyệt đối hoặc PATH bị thiếu biến. Xác nhận rằng tất cả các công cụ cần thiết đã đượ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 các phần phụ thuộc trỏ đến tài nguyên bị thiếu. Xem 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.

  • 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 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 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.

  • Tệp từ @local-jdk bị thiếu hoặc gây ra lỗi. 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 đồng thời không tương thích với nó. 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 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à bản dựng của Bazel các thao tác được thực thi bên trong các vùng chứa chuỗi công cụ riêng lẻ do Docker tạo ra hộp cát. Hộp cát tạo ra một vùng chứa chuỗi công cụ hoàn toàn mới cho mỗi tạo hành độ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 giúp kiểm soát chi tiết hơn đối với các công cụ được cài đặt trong máy chủ lưu trữ môi trường. 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ủa tạo hành động và giảm thiểu công cụ đã cài đặt, bạn có thể xác minh xem bản dựng của bạn có phần phụ thuộc nào trong 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, thay thế đường dẫn đến mã nguồn trên máy chủ lưu trữ mà bạn muốn xây dựng.

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 kết 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 đó. Nguồn của bạn mã có sẵn 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 bao gồm 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 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 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ạ dưới đây. Người dùng đầu ra là thư mục gốc (root) tương ứng với một 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 máy chủ lưu trữ vùng chứa mà Bazel chạy, từ các vùng chứa chuỗi công cụ do Docker tạo ra tính năng hộp cát trong đó các hành động xây dựng của Bazel đang chạy và từ máy chủ lưu trữ và vùng chứa 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ể khắc phục các lỗi của bản dựng như sau:

  • Nếu bản dựng bị lỗi "hết dung lượng ổ đĩa" Bạn có thể tăng chỉ số này bằng cách bắt đầu 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 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, một hoặc nhiều các quy tắc xây dựng của bạn được khai báo trong tệp WORKSPACE không tương thích với thực thi từ xa. Xem bài viết Điều chỉnh quy tắc Bazel để thực thi từ xa để tìm nguyên nhân và cách giải quyết khả thi.

  • 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.