Halaman ini ditujukan bagi pengguna Bazel yang menulis aturan build dan pengujian kustom yang ingin memahami persyaratan untuk aturan Bazel dalam konteks eksekusi jarak jauh.
Eksekusi jarak jauh memungkinkan Bazel mengeksekusi tindakan di platform terpisah, seperti pusat data. Bazel menggunakan protokol gRPC untuk eksekusi jarak jauhnya. Anda dapat mencoba eksekusi jarak jauh dengan bazel-buildfarm, project open source yang bertujuan untuk menyediakan platform eksekusi jarak jauh terdistribusi.
Halaman ini menggunakan terminologi berikut saat merujuk ke 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 build Bazel untuk eksekusi jarak jauh, Anda harus mengikuti pedoman yang dijelaskan di halaman ini untuk memastikan build dieksekusi dari jarak jauh tanpa error. Hal ini disebabkan oleh sifat eksekusi jarak jauh, yaitu:
Tindakan build terisolasi. Alat build tidak mempertahankan status dan dependensi tidak dapat bocor di antaranya.
Lingkungan eksekusi yang beragam. Konfigurasi build lokal tidak selalu cocok untuk lingkungan eksekusi jarak jauh.
Halaman ini menjelaskan masalah yang dapat muncul saat menerapkan aturan build dan pengujian Bazel kustom untuk eksekusi jarak jauh dan cara menghindarinya. Panduan ini membahas topik berikut:
- Memanggil alat build melalui aturan toolchain
- Mengelola dependensi implisit
- Mengelola biner yang bergantung pada platform
- Mengelola aturan WORKSPACE gaya konfigurasi
Memanggil alat build melalui aturan toolchain
Aturan toolchain Bazel adalah penyedia konfigurasi yang memberi tahu aturan build alat build apa, seperti compiler dan linker, yang akan digunakan dan cara mengonfigurasinya menggunakan parameter yang ditentukan oleh pembuat aturan. Aturan toolchain memungkinkan aturan build
dan pengujian memanggil alat build dengan cara yang dapat diprediksi dan telah dikonfigurasi sebelumnya
yang kompatibel dengan eksekusi jarak jauh. Misalnya, gunakan aturan toolchain
daripada memanggil alat build melalui PATH
, JAVA_HOME
, atau variabel lokal
lain yang mungkin tidak ditetapkan ke nilai yang setara (atau tidak ditetapkan sama sekali) di lingkungan
eksekusi jarak jauh.
Aturan toolchain saat ini ada untuk aturan build dan pengujian Bazel untuk Scala, Rust, dan Go, dan aturan toolchain baru sedang dalam proses untuk bahasa dan alat lain seperti bash. Jika aturan toolchain tidak ada untuk alat yang digunakan aturan Anda, pertimbangkan untuk membuat aturan toolchain.
Mengelola dependensi implisit
Jika alat build dapat mengakses dependensi di seluruh tindakan build, tindakan tersebut akan gagal saat dieksekusi dari jarak jauh karena setiap tindakan build jarak jauh dieksekusi secara terpisah dari yang lain. Beberapa alat build mempertahankan status di seluruh tindakan build dan mengakses dependensi yang belum disertakan secara eksplisit dalam pemanggilan alat, yang akan menyebabkan tindakan build yang dieksekusi dari jarak jauh gagal.
Misalnya, saat Bazel menginstruksikan compiler stateful untuk membuat foo secara lokal, compiler akan mempertahankan referensi ke output build foo. Saat Bazel kemudian menginstruksikan compiler untuk membangun bar, yang bergantung pada foo, tanpa menyatakan dependensi tersebut secara eksplisit dalam file BUILD untuk disertakan dalam pemanggilan compiler, tindakan akan berhasil dieksekusi selama instance compiler yang sama dieksekusi untuk kedua tindakan (seperti yang biasa terjadi pada 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 dependensi ini, Bazel 0.14.1 menawarkan sandbox Docker lokal, yang memiliki batasan yang sama untuk dependensi seperti eksekusi jarak jauh. Gunakan sandbox untuk menyiapkan build Anda untuk eksekusi jarak jauh dengan mengidentifikasi dan menyelesaikan error build terkait dependensi. Lihat Memecahkan Masalah Eksekusi Jarak Jauh Bazel dengan Sandbox Docker untuk mengetahui informasi selengkapnya.
Mengelola biner yang bergantung pada platform
Biasanya, biner yang dibuat di platform host tidak dapat dieksekusi dengan aman di platform eksekusi jarak jauh arbitrer karena potensi ketidakcocokan dependensi. Misalnya, biner SingleJar yang disediakan dengan Bazel menargetkan platform host. Namun, untuk eksekusi jarak jauh, SingleJar harus dikompilasi sebagai bagian dari proses membangun kode Anda sehingga menargetkan platform eksekusi jarak jauh. (Lihat logika pemilihan target.)
Jangan kirimkan biner alat build yang diperlukan oleh build Anda dengan kode sumber Anda, kecuali Anda yakin bahwa biner tersebut akan berjalan dengan aman di platform eksekusi Anda. Sebagai gantinya, lakukan salah satu hal berikut:
Kirim atau referensikan kode sumber untuk alat secara eksternal sehingga dapat dibuat untuk platform eksekusi jarak jauh.
Menginstal alat sebelumnya ke lingkungan eksekusi jarak jauh (misalnya, container toolchain) jika cukup stabil dan menggunakan aturan toolchain untuk menjalankannya dalam build Anda.
Mengelola aturan WORKSPACE gaya konfigurasi
Aturan WORKSPACE
Bazel dapat digunakan untuk menyelidiki platform host untuk menemukan alat dan library yang diperlukan oleh build, yang untuk build lokal, juga merupakan platform eksekusi Bazel. Jika build secara eksplisit bergantung pada alat dan artefak build lokal, build akan gagal selama eksekusi jarak jauh jika platform eksekusi jarak jauh tidak identik dengan platform host.
Tindakan berikut yang dilakukan oleh aturan WORKSPACE
tidak kompatibel dengan eksekusi jarak jauh:
Membangun biner. Mengeksekusi tindakan kompilasi dalam aturan
WORKSPACE
menghasilkan biner yang tidak kompatibel dengan platform eksekusi jarak jauh jika berbeda dengan platform host.Menginstal paket
pip
. Paketpip
yang diinstal melalui aturanWORKSPACE
mengharuskan dependensinya diinstal terlebih dahulu di platform host. Paket tersebut, yang dibuat khusus untuk platform host, tidak akan kompatibel dengan platform eksekusi jarak jauh jika berbeda dengan platform host.Membuat link simbolis ke alat atau artefak lokal. Link simbolis ke alat atau library yang diinstal di platform host yang dibuat melalui aturan
WORKSPACE
akan menyebabkan build gagal di platform eksekusi jarak jauh karena Bazel tidak akan dapat menemukannya. Sebagai gantinya, buat link simbolis menggunakan tindakan build standar sehingga alat dan library yang di-link simbolis dapat diakses dari hierarkirunfiles
Bazel. Jangan gunakanrepository_ctx.symlink
untuk membuat link simbolis ke file target di luar direktori repo eksternal.Mengubah platform host. Hindari membuat file di luar hierarki
runfiles
Bazel, membuat variabel lingkungan, dan tindakan serupa, karena tindakan tersebut dapat berperilaku tidak terduga di platform eksekusi jarak jauh.
Untuk membantu menemukan potensi perilaku non-hermetik, Anda dapat menggunakan Log aturan Workspace.
Jika dependensi eksternal menjalankan operasi tertentu yang bergantung pada platform
host, Anda harus membagi operasi tersebut antara WORKSPACE
dan membuat
aturan sebagai berikut:
Pemeriksaan platform dan enumerasi dependensi. Operasi ini aman untuk dijalankan secara lokal melalui aturan
WORKSPACE
, yang dapat memeriksa pustaka mana yang diinstal, mendownload paket yang harus dibuat, dan menyiapkan artefak yang diperlukan untuk kompilasi. Untuk eksekusi jarak jauh, aturan ini juga harus mendukung penggunaan artefak yang telah diperiksa sebelumnya untuk memberikan informasi yang biasanya diperoleh selama pemeriksaan platform host. Artefak yang sudah diperiksa sebelumnya memungkinkan Bazel mendeskripsikan dependensi seolah-olah dependensi tersebut bersifat lokal. Gunakan pernyataan bersyarat atau flag--override_repository
untuk hal ini.Membuat atau mengompilasi artefak khusus target dan mutasi platform. Operasi ini harus dieksekusi melalui aturan build reguler. Tindakan yang menghasilkan artefak khusus target untuk dependensi eksternal harus dijalankan selama build.
Untuk menghasilkan artefak yang sudah dicentang sebelumnya dengan lebih mudah untuk eksekusi jarak jauh, Anda dapat menggunakan aturan
WORKSPACE
untuk memancarkan file yang dihasilkan. Anda dapat menjalankan aturan tersebut di setiap lingkungan eksekusi baru, seperti di dalam setiap container toolchain, dan memeriksa output build eksekusi jarak jauh ke dalam repositori sumber untuk dirujuk.
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 kondisional
pada variabel lingkungan memungkinkan aturan menggunakan file yang diperiksa ke
repo.
File BUILD
mendeklarasikan genrules
yang dapat berjalan secara lokal dan jarak jauh, serta melakukan pemrosesan yang diperlukan
yang sebelumnya dilakukan melalui repository_ctx.symlink
seperti yang ditunjukkan di sini.