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 Nightly/3}

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 những lỗi như vậy được mô tả trong bài viết Đ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. Tính năng 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 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ỉ các dữ liệu đầ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 hành động liên kết với bản dựng 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 pháp sau:

  • Khắc phục sự cố tự nhiên. Với phương thức này, Baazel và các hành động tạo bản dựng của Bazel tự nhiên chạy 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ông cụ, trạng thái và dữ liệu cục bộ bị rò rỉ vào bản dựng của bạn, điều này 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 thao tác tạo bản dựng sẽ 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 dụng các hạn chế tương tự như việc 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ác 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à 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 của 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ữ 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 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ố tự nhiên

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ể rò rỉ vào bản dựng của bạn, đặc biệt nếu bản dựng sử dụng quy tắc WORKSPACE theo kiểu định 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 tạo 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 của 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 việc cài đặt Docker bị lỗi hoặc thiếu quyền để thực thi lỗi này 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 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.

  • Thiếu 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.. 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ý các 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ởi 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ụ bắt buộc đã đượ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.

  • 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 đ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 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à 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 mang lại 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 lưu trữ. 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ụ 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 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ủ 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 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 nhị phân đó 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à gốc (root) 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ủ mà 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 mà 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 lưu trữ 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ể khắc phục các lỗi của 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 bắt đầu 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 ngoài dự đ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 của bạn được khai báo trong tệp WORKSPACE không tương thích với tính năng 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 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.