Build Bazel yang berhasil secara lokal dapat gagal saat dieksekusi dari jarak jauh karena batasan dan persyaratan yang tidak memengaruhi build lokal. Penyebab paling umum kegagalan tersebut dijelaskan dalam Menyesuaikan Aturan Bazel untuk Eksekusi Jarak Jauh.
Halaman ini menjelaskan cara mengidentifikasi dan menyelesaikan masalah paling umum yang terjadi dengan eksekusi jarak jauh menggunakan fitur sandbox Docker, yang memberlakukan batasan pada build yang sama dengan eksekusi jarak jauh. Hal ini memungkinkan Anda memecahkan masalah build tanpa memerlukan layanan eksekusi jarak jauh.
Fitur sandbox Docker meniru batasan eksekusi jarak jauh sebagai berikut:
Tindakan build dijalankan di penampung toolchain. Anda dapat menggunakan penampung toolchain yang sama untuk menjalankan build secara lokal dan jarak jauh melalui layanan yang mendukung eksekusi jarak jauh dalam penampung.
Tidak ada data yang tidak relevan yang melintasi batas penampung. Hanya input dan output yang dideklarasikan secara eksplisit yang masuk dan keluar dari penampung, dan hanya setelah tindakan build terkait berhasil selesai.
Setiap tindakan dijalankan di penampung baru. Penampung baru yang unik dibuat untuk setiap tindakan build yang dihasilkan.
Anda dapat memecahkan masalah ini menggunakan salah satu metode berikut:
Memecahkan masalah secara native. Dengan metode ini, Bazel dan tindakan build-nya berjalan secara native di komputer lokal Anda. Fitur sandbox Docker menerapkan batasan pada build yang sama dengan batasan eksekusi jarak jauh. Namun, metode ini tidak akan mendeteksi alat, status, dan data lokal yang bocor ke build Anda, yang akan menyebabkan masalah pada eksekusi jarak jauh.
Memecahkan masalah di container Docker. Dengan metode ini, Bazel dan tindakan build-nya berjalan di dalam penampung Docker, yang memungkinkan Anda mendeteksi alat, status, dan kebocoran data dari mesin lokal ke build, selain menerapkan batasan yang sama dengan eksekusi jarak jauh. Metode ini memberikan insight tentang build Anda meskipun sebagian build gagal. Metode ini bersifat eksperimental dan tidak didukung secara resmi.
Prasyarat
Sebelum Anda mulai memecahkan masalah, lakukan hal berikut jika Anda belum melakukannya:
- Instal Docker dan konfigurasikan izin yang diperlukan untuk menjalankannya.
- Instal Bazel 0.14.1 atau yang lebih baru. Versi sebelumnya tidak mendukung fitur sandbox Docker.
- Tambahkan repo bazel-toolchains, yang disematkan ke versi rilis terbaru, ke file
WORKSPACE
build seperti yang dijelaskan di sini. - Tambahkan flag ke file
.bazelrc
untuk mengaktifkan fitur. Buat file di direktori utama project Bazel Anda jika tidak ada. Tanda di bawah adalah contoh referensi. Lihat file.bazelrc
terbaru di repo bazel-toolchains dan salin nilai tanda yang ditentukan di sana untuk konfigurasidocker-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
Jika aturan Anda memerlukan alat tambahan, lakukan hal berikut:
Buat container Docker kustom dengan menginstal alat menggunakan Dockerfile dan mem-build image secara lokal.
Ganti nilai flag
--experimental_docker_image
di atas dengan nama image container kustom Anda.
Memecahkan masalah secara native
Metode ini mengeksekusi Bazel dan semua tindakan build-nya langsung di mesin lokal dan merupakan cara yang andal untuk mengonfirmasi apakah build Anda akan berhasil saat dieksekusi dari jarak jauh.
Namun, dengan metode ini, alat, biner, dan data yang diinstal secara lokal dapat bocor ke dalam build Anda, terutama jika menggunakan aturan WORKSPACE gaya konfigurasi. Kebocoran tersebut akan menyebabkan masalah pada eksekusi jarak jauh; untuk mendeteksinya, pecahkan masalah dalam penampung Docker selain memecahkan masalah secara native.
Langkah 1: Jalankan build
Tambahkan flag
--config=docker-sandbox
ke perintah Bazel yang menjalankan build Anda. Contoh:bazel --bazelrc=.bazelrc build --config=docker-sandbox target
Jalankan build dan tunggu hingga selesai. Build akan berjalan hingga empat kali lebih lambat dari biasanya karena fitur sandbox Docker.
Anda mungkin mengalami error berikut:
ERROR: 'docker' is an invalid value for docker spawn strategy.
Jika ya, jalankan build lagi dengan flag --experimental_docker_verbose
.
Flag ini mengaktifkan pesan error panjang. Error ini biasanya disebabkan oleh
penginstalan Docker yang rusak atau kurangnya izin untuk menjalankannya di bawah
akun pengguna saat ini. Lihat dokumentasi Docker
untuk informasi selengkapnya. Jika masalah berlanjut, lanjutkan ke Pemecahan masalah dalam penampung Docker.
Langkah 2: Selesaikan masalah yang terdeteksi
Berikut adalah masalah yang paling sering terjadi dan solusinya.
File, alat, biner, atau resource yang direferensikan oleh hierarki runfile Bazel tidak ada.. Pastikan semua dependensi target yang terpengaruh telah dideklarasikan secara eksplisit. Lihat Mengelola dependensi implisit untuk mengetahui informasi selengkapnya.
File, alat, biner, atau resource yang dirujuk oleh jalur absolut atau variabel
PATH
tidak ada. Pastikan semua alat yang diperlukan diinstal dalam penampung toolchain dan gunakan aturan toolchain untuk mendeklarasikan dependensi yang mengarah ke resource yang hilang dengan benar. Lihat Memanggil alat build melalui aturan toolchain untuk mengetahui informasi selengkapnya.Eksekusi biner gagal. Salah satu aturan build mereferensikan biner yang tidak kompatibel dengan lingkungan eksekusi (penampung Docker). Lihat Mengelola biner yang bergantung pada platform untuk mengetahui informasi selengkapnya. Jika Anda tidak dapat menyelesaikan masalah, hubungi bazel-discuss@google.com untuk mendapatkan bantuan.
File dari
@local-jdk
tidak ada atau menyebabkan error. Biner Java di komputer lokal Anda bocor ke build saat tidak kompatibel dengan build tersebut. Gunakanjava_toolchain
dalam aturan dan target, bukan@local_jdk
. Hubungi bazel-discuss@google.com jika Anda memerlukan bantuan lebih lanjut.Error lainnya. Hubungi bazel-discuss@google.com untuk mendapatkan bantuan.
Memecahkan masalah di container Docker
Dengan metode ini, Bazel berjalan di dalam container Docker host, dan tindakan build Bazel dijalankan di dalam setiap container toolchain yang dihasilkan oleh fitur sandbox Docker. Sandbox membuat penampung toolchain baru untuk setiap tindakan build dan hanya satu tindakan yang dieksekusi di setiap penampung toolchain.
Metode ini memberikan kontrol yang lebih terperinci atas alat yang diinstal di lingkungan host. Dengan memisahkan eksekusi build dari eksekusi tindakan build dan meminimalkan alat yang diinstal, Anda dapat memverifikasi apakah build Anda memiliki dependensi pada lingkungan eksekusi lokal.
Langkah 1: Build penampung
Buat
Dockerfile
yang membuat penampung Docker dan menginstal Bazel dengan kumpulan alat build minimal: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
Build penampung sebagai
bazel_container
:docker build -t bazel_container - < Dockerfile
Langkah 2: Mulai penampung
Mulai penampung Docker menggunakan perintah yang ditampilkan di bawah. Dalam perintah, ganti jalur ke kode sumber di host yang ingin Anda build.
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
Perintah ini menjalankan container sebagai root, memetakan soket docker, dan memasang
direktori /tmp
. Hal ini memungkinkan Bazel membuat container Docker lain dan
menggunakan direktori di /tmp
untuk berbagi file dengan container tersebut. Kode sumber
Anda tersedia di /src
di dalam penampung.
Perintah sengaja dimulai dari penampung dasar debian:stretch
yang
menyertakan biner yang tidak kompatibel dengan penampung rbe-ubuntu16-04
yang digunakan sebagai
penampung toolchain. Jika biner dari lingkungan lokal bocor ke dalam
penampung toolchain, biner tersebut akan menyebabkan error build.
Langkah 3: Uji penampung
Jalankan perintah berikut dari dalam penampung Docker untuk mengujinya:
docker ps
bazel version
Langkah 4: Jalankan build
Jalankan build seperti yang ditunjukkan di bawah. Pengguna output adalah root sehingga sesuai dengan direktori yang dapat diakses dengan jalur absolut yang sama dari dalam penampung host tempat Bazel berjalan, dari penampung toolchain yang dihasilkan oleh fitur sandbox Docker tempat tindakan build Bazel berjalan, dan dari mesin lokal tempat penampung host dan tindakan berjalan.
bazel --output_user_root=/tmp/bazel_docker_root --bazelrc=.bazelrc \ build --config=docker-sandbox target
Langkah 5: Selesaikan masalah yang terdeteksi
Anda dapat mengatasi kegagalan build sebagai berikut:
Jika build gagal dengan error "ruang disk habis", Anda dapat meningkatkan batas ini dengan memulai penampung host dengan flag
--memory=XX
denganXX
adalah ruang disk yang dialokasikan dalam gigabyte. Fitur ini bersifat eksperimental dan dapat menghasilkan perilaku yang tidak dapat diprediksi.Jika build gagal selama fase analisis atau pemuatan, satu atau beberapa aturan build yang dideklarasikan dalam file WORKSPACE tidak kompatibel dengan eksekusi jarak jauh. Lihat Menyesuaikan Aturan Bazel untuk Eksekusi Jarak Jauh untuk mengetahui kemungkinan penyebab dan solusinya.
Jika build gagal karena alasan lain, lihat langkah-langkah pemecahan masalah di Langkah 2: Menyelesaikan masalah yang terdeteksi.