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 quy định 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 Đ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 đề phổ biến nhất phát sinh với việc thực thi từ xa bằng tính năng hộp cát Docker. Tính năng này áp đặt các quy định hạn chế đối với bản dựng tương đương với các quy định hạn chế khi 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ế khi thực thi từ xa như sau:
Các hành động xây dựng 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 xây dựng được liên kết hoàn tất thành công.
Mỗi hành động thực thi trong một vùng chứa mới. Một vùng chứa mới, riêng biệt được tạo cho mỗi hành động xây dựng được tạo.
Bạn có thể khắc phục các 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 hành động xây dựng của nó sẽ chạy gốc trên máy cục bộ của bạn. Tính năng hộp cát Docker áp đặt các quy định hạn chế đối với bản dựng tương đương với các quy định hạn chế khi 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 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 hành động xây dựng của nó sẽ chạy bên trong vùng chứa Docker, Điều này 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 quy định hạn chế tương đương với các quy định hạn chế khi 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 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à 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 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 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
WORKSPACEcủ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 đó không tồn tại. Các cờ bên dưới là mẫu tham chiếu. Vui lòng xem tệp.bazelrcmới nhất trong kho lưu trữ bazel-toolchains và sao chép các giá trị của các cờ được xác định ở đó cho cấu hìnhdocker-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 --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:
Tạo vùng chứa Docker tuỳ chỉnh bằng cách cài đặt các công cụ bằng Dockerfile và xây dựng hình ảnh cục bộ.
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ố gốc
Phương thức này thực thi Bazel và tất cả các hành động xây dựng của nó trực tiếp 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ủa bạn 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ể 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 theo kiểu định cấu hình. Việc rò rỉ như vậy sẽ gây ra vấn đề khi thực thi từ xa; để phát hiện các vấn đề 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ố gốc.
Bước 1: Chạy bản dựng
Thêm cờ
--config=docker-sandboxvào lệnh Bazel thực thi bản dựng của bạn. Ví dụ:bazel --bazelrc=.bazelrc build --config=docker-sandbox targetChạy bản dựng và đợi bản dựng hoàn tất. Bản dựng sẽ chạy chậm hơn bình thường tối đa 4 lần 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 gặp phải lỗi này, 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 là do cài đặt Docker bị lỗi
hoặc thiếu quyền thực thi lỗi đó trong tài khoản người dùng hiện tại. Hãy xem tài liệu Docker
để biết thêm thông tin. Nếu vấn đề vẫn tiếp diễn, hãy chuyển sang 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 đề được phát hiện
Sau đây là các 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 cây runfiles Bazel tham chiếu.. Xác nhận rằng tất cả các phần phụ thuộc của mục tiêu bị ảnh hưởng đã được khai báo rõ ràng. 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 đường dẫn tuyệt đối hoặc biến
PATHtham chiếu. 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ác phần phụ thuộc trỏ đến tài nguyên bị thiếu. Xem phần 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ệ với bazel-discuss@google.com để được trợ giúp.
Thiếu tệp từ
@local-jdkhoặ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 trong khi không tương thích với bản dựng đó. Sử dụngjava_toolchaintrong các quy tắc và mục tiêu thay vì@local_jdk. Liên hệ với bazel-discuss@google.com nếu bạn cần được trợ giúp thêm.Các lỗi khác. 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 vùng chứa Docker máy chủ và các hành động xây dựng 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 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 xây 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 chặt chẽ hơn các công cụ được cài đặt trong môi trường máy chủ. Bằng cách tách biệt quá trình thực thi bản dựng khỏi quá trình thực thi các hành động xây dựng của 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ủ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: Xây dựng vùng chứa
Tạo
Dockerfiletạo vùng chứa Docker và cài đặt Bazel với 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.shXây dựng 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 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/bashLệ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ó sẵn tại /src bên trong vùng chứa.
Lệnh này cố ý 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 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 này sẽ gây ra lỗi xây dựng.
Bước 3: Kiểm tra vùng chứa
Chạy các lệnh sau từ bên trong vùng chứa Docker để kiểm tra vùng chứa đó:
docker psbazel 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à 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 máy chủ vùng chứa 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ộ mà các vùng chứa hành động và máy chủ chạy.
bazel --output_user_root=/tmp/bazel_docker_root --bazelrc=.bazelrc \ build --config=docker-sandbox targetBước 5: Giải quyết các vấn đề được phát hiện
Bạn có thể giải quyết lỗi xây dựng như sau:
Nếu bản dựng không thành cô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ủ bằng cờ
--memory=XXtrong đóXXlà 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ông thể đoán trước.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 xây 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 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 và cách giải quyết có thể.
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 đề được phát hiện.