Halaman ini ditujukan untuk pengguna Bazel yang menulis aturan build dan pengujian kustom yang ingin memahami persyaratan aturan Bazel dalam konteks eksekusi jarak jauh.
Dengan eksekusi jarak jauh, Bazel dapat menjalankan tindakan pada platform terpisah, seperti sebuah pusat data. Bazel menggunakan Protokol gRPC untuk eksekusi jarak jauh. Anda dapat mencoba eksekusi jarak jauh dengan bazel-buildfarm, sebuah proyek {i>open source<i} yang bertujuan untuk menyediakan eksekusi jarak jauh yang terdistribusi terkelola sepenuhnya.
Halaman ini menggunakan terminologi berikut saat mengacu pada berbagai jenis lingkungan atau platform:
- Platform host - tempat Bazel berjalan.
- Platform eksekusi - tempat tindakan Bazel dijalankan.
- Platform target - tempat output build (dan beberapa tindakan) dijalankan.
Ringkasan
Saat mengonfigurasi versi Bazel untuk eksekusi jarak jauh, Anda harus mengikuti panduan yang dijelaskan di halaman ini untuk memastikan build dijalankan dari jarak jauh bebas dari error. Hal ini disebabkan oleh sifat dari eksekusi jarak jauh, yaitu:
Tindakan build yang terisolasi. Alat build tidak mempertahankan status dan dependensi tidak boleh bocor di antara keduanya.
Lingkungan eksekusi yang beragam. Konfigurasi build lokal tidak selalu cocok untuk lingkungan eksekusi jarak jauh.
Halaman ini menjelaskan masalah yang dapat muncul saat menerapkan Bazel kustom membuat dan menguji aturan untuk eksekusi jarak jauh dan cara menghindarinya. Materi ini mencakup topik berikut:
- Memanggil alat build melalui aturan toolchain
- Mengelola dependensi implisit
- Mengelola biner yang bergantung pada platform
- Mengelola aturan WORKSPACE dengan gaya konfigurasi
Memanggil alat build melalui aturan toolchain
Aturan toolchain Bazel adalah penyedia konfigurasi
yang memberi tahu aturan {i>build<i} apa
alat build, seperti compiler dan penaut, untuk digunakan dan cara mengonfigurasinya
menggunakan parameter yang ditentukan oleh pembuat aturan. Aturan toolchain memungkinkan build
dan menguji aturan untuk memanggil alat build dengan cara yang dapat diprediksi dan telah dikonfigurasi
yang kompatibel dengan eksekusi jarak jauh. Misalnya, gunakan aturan toolchain
bukan memanggil alat build melalui PATH
, JAVA_HOME
, atau resource
variabel yang mungkin tidak ditetapkan ke nilai yang setara (atau tidak sama sekali) dalam
dalam lingkungan eksekusi.
Saat ini aturan {i>toolchain<i} ada untuk aturan {i>build<i} dan pengujian Bazel untuk Scala, Rust, dan Go, dan aturan toolchain baru sedang berlangsung untuk bahasa dan alat lain seperti bash. Jika tidak ada aturan toolchain untuk alat yang digunakan aturan Anda, pertimbangkan membuat aturan toolchain.
Mengelola dependensi implisit
Jika alat build bisa mengakses dependensi di berbagai tindakan build, tindakan tersebut akan gagal saat dijalankan dari jarak jauh karena setiap tindakan build jarak jauh dijalankan secara terpisah dari yang lain. Beberapa alat build mempertahankan status di seluruh tindakan build dan dependensi akses yang belum disertakan secara eksplisit dalam alat pemanggilan, yang akan menyebabkan kegagalan tindakan build yang dijalankan dari jarak jauh.
Misalnya, ketika Bazel memerintahkan compiler stateful untuk membangun foo secara lokal, {i>compiler<i} mempertahankan referensi ke {i>output<i} build foo. Ketika Bazel lalu menginstruksikan compiler untuk membangun bar, yang bergantung pada foo, tanpa yang secara eksplisit menyatakan ketergantungan tersebut pada file BUILD untuk disertakan dalam pemanggilan compiler, tindakan berhasil dijalankan selama instance compiler dieksekusi untuk kedua tindakan (seperti yang biasa untuk eksekusi lokal). Namun, karena dalam skenario eksekusi jarak jauh, setiap tindakan build mengeksekusi instance compiler terpisah, status compiler, dan dependensi implisit bar pada foo akan hilang dan build akan gagal.
Untuk membantu mendeteksi dan menghilangkan masalah-masalah dependensi ini, Bazel 0.14.1 menawarkan sandbox Docker lokal, yang memiliki pembatasan yang sama untuk dependensi dalam proses eksekusi. Gunakan sandbox untuk menyiapkan build untuk eksekusi jarak jauh dengan mengidentifikasi dan mengatasi error build terkait dependensi. Lihat Memecahkan Masalah Bazel Remote Execution dengan Docker Sandbox untuk informasi selengkapnya.
Mengelola biner yang bergantung pada platform
Biasanya, biner yang dibangun di platform {i>host<i} tidak dapat dieksekusi dengan aman pada platform eksekusi jarak jauh arbitrer karena dependensi yang berpotensi tidak cocok. Misalnya, biner SingleJar yang disediakan bersama Bazel menargetkan platform host. Namun, untuk eksekusi jarak jauh, SingleJar harus dikompilasi sebagai bagian dari proses membangun kode Anda agar menargetkan platform eksekusi jarak jauh. (Lihat logika pemilihan target.)
Jangan mengirimkan biner alat build yang diperlukan build dengan kode sumber Anda kecuali Anda yakin bahwa mereka akan berjalan dengan aman di platform eksekusi Anda. Sebagai gantinya, lakukan salah satu hal berikut:
Mengirimkan atau secara eksternal mereferensikan kode sumber untuk alat tersebut sehingga dapat yang dibuat untuk platform eksekusi jarak jauh.
Lakukan pra-instal alat ke dalam lingkungan eksekusi jarak jauh (misalnya, container toolchain) jika cukup stabil dan menggunakan aturan toolchain untuk menjalankannya dalam build Anda.
Mengelola aturan WORKSPACE bergaya konfigurasi
Aturan WORKSPACE
Bazel dapat digunakan untuk memeriksa platform host alat
dan library yang dibutuhkan oleh build, yang, untuk build lokal, juga merupakan
dan deployment sepenuhnya. Jika build secara eksplisit bergantung pada alat build lokal dan
artefak, kode itu akan gagal selama eksekusi jarak jauh jika platform eksekusi jarak jauh
tidak sama dengan platform {i>host<i}.
Tindakan yang dilakukan oleh aturan WORKSPACE
berikut tidak kompatibel dengan
eksekusi jarak jauh:
Membangun biner. Mengeksekusi tindakan kompilasi di aturan
WORKSPACE
menghasilkan sistem biner yang tidak kompatibel dengan platform eksekusi jarak jauh jika berbeda dari platform {i>host<i}.Menginstal paket
pip
.pip
paket diinstal melaluiWORKSPACE
mengharuskan dependensinya diinstal sebelumnya di platform host. Paket tersebut, yang dibuat khusus untuk platform {i>host<i}, akan tidak kompatibel dengan platform eksekusi jarak jauh jika berbeda dengan {i>host<i} terkelola sepenuhnya.Bersama nama dengan alat atau artefak lokal. Symlink ke alat atau library diinstal di platform host yang dibuat melalui aturan
WORKSPACE
akan menyebabkan akan gagal pada platform eksekusi jarak jauh karena Bazel tidak akan dapat menemukannya. Sebagai gantinya, buat symlink menggunakan tindakan build standar sehingga alat dan library symlink dapat diakses darirunfiles
hierarki. Jangan gunakanrepository_ctx.symlink
untuk melakukan symlink file target di luar direktori repo eksternal.Mengubah platform host. Hindari membuat file di luar Bazel Hierarki
runfiles
, membuat variabel lingkungan, dan tindakan serupa, sebagai mereka mungkin berperilaku tidak terduga di platform eksekusi jarak jauh.
Untuk membantu menemukan potensi perilaku non-hermetik, Anda dapat menggunakan log aturan Workspace.
Jika dependensi eksternal mengeksekusi operasi tertentu yang bergantung pada host
terpisah, Anda harus membagi operasi tersebut antara WORKSPACE
dan build
aturan sebagai berikut:
Pemeriksaan platform dan enumerasi dependensi. Operasi ini adalah aman untuk dijalankan secara lokal melalui aturan
WORKSPACE
, yang dapat memeriksa library diinstal, mendownload paket yang harus dibuat, dan menyiapkan artefak yang diperlukan untuk kompilasi. Untuk eksekusi jarak jauh, aturan ini harus juga mendukung penggunaan artefak yang telah diperiksa untuk memberikan informasi yang biasanya akan diperoleh selama pemeriksaan platform {i>host<i}. Sudah diperiksa artefak memungkinkan Bazel untuk menggambarkan dependensi seolah-olah itu adalah {i>lokal<i}. Gunakan pernyataan kondisional atau flag--override_repository
untuk ini.Membuat atau mengompilasi artefak khusus target dan mutasi platform. Operasi ini harus dijalankan melalui aturan build reguler. Tindakan yang menghasilkan artefak khusus target untuk dependensi eksternal harus dieksekusi selama proses build.
Agar lebih mudah membuat artefak yang telah diperiksa untuk eksekusi jarak jauh, Anda dapat menggunakan
WORKSPACE
aturan untuk memunculkan file yang dihasilkan. Anda dapat menjalankan aturan
tersebut pada setiap
seperti di dalam setiap container toolchain, dan periksa
output eksekusi jarak jauh Anda yang di-build ke repo sumber sebagai referensi.
Misalnya, untuk aturan Tensorflow untuk cuda
dan python
,
aturan WORKSPACE
menghasilkan BUILD files
berikut.
Untuk eksekusi lokal, file yang dihasilkan dengan memeriksa lingkungan host akan digunakan.
Untuk eksekusi jarak jauh, pernyataan bersyarat
pada variabel lingkungan memungkinkan aturan
untuk menggunakan file yang diperiksa
repo tersebut.
File BUILD
mendeklarasikan genrules
yang dapat berjalan secara lokal dan jarak jauh, dan melakukan pemrosesan yang diperlukan
yang sebelumnya dilakukan melalui repository_ctx.symlink
seperti yang ditampilkan di sini.