BazelCon 2022 akan hadir pada 16-17 November ke New York dan online.
Daftar sekarang.

Menyesuaikan Aturan Bazel untuk Eksekusi Jarak Jauh

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Halaman ini ditujukan bagi pengguna Bazel yang menulis aturan build dan pengujian kustom yang ingin memahami persyaratan aturan Bazel dalam konteks eksekusi jarak jauh.

Eksekusi jarak jauh memungkinkan Bazel menjalankan tindakan pada platform terpisah, seperti pusat data. Bazel menggunakan protokol gRPC untuk eksekusi jarak jauhnya. Anda dapat mencoba eksekusi jarak jauh dengan bazel-buildfarm, sebuah project open source yang bertujuan menyediakan platform eksekusi jarak jauh terdistribusi.

Halaman ini menggunakan terminologi berikut saat merujuk pada jenis atau platform lingkungan yang berbeda:

  • Platform host - tempat Bazel berjalan.
  • Platform eksekusi - tempat tindakan Bazel berjalan.
  • Platform target - tempat output build (dan beberapa tindakan) dijalankan.

Ringkasan

Saat mengonfigurasi build Bazel untuk eksekusi jarak jauh, Anda harus mengikuti panduan yang dijelaskan di halaman ini untuk memastikan bahwa build dapat dijalankan dari jarak jauh tanpa error. Hal ini disebabkan oleh sifat eksekusi jarak jauh, yaitu:

  • Tindakan build terpisah. Alat build tidak mempertahankan status dan dependensi tidak dapat 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 meng-build build dan menguji aturan Bazel kustom untuk eksekusi jarak jauh dan cara menghindarinya. Topik tersebut meliputi:

Memanggil alat build melalui aturan toolchain

Aturan toolchain Bazel adalah penyedia konfigurasi yang memberi tahu aturan build tentang alat build, seperti compiler dan penaut, yang akan 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 dikonfigurasi sebelumnya yang kompatibel dengan eksekusi jarak jauh. Misalnya, gunakan aturan toolchain daripada memanggil alat build melalui PATH, JAVA_HOME, atau variabel lokal lainnya yang mungkin tidak ditetapkan ke nilai yang setara (atau tidak sama sekali) di remote lingkungan eksekusi.

Aturan Toolchain saat ini ada untuk build dan aturan pengujian Bazel untuk Sala ,Karat , danLanjutkan , dan aturan toolchain baru sedang disiapkan untuk bahasa dan alat lain seperti bash Domain. 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 dijalankan dari jarak jauh karena setiap tindakan build jarak jauh dijalankan secara terpisah dari tindakan lainnya. Beberapa alat build mempertahankan status di seluruh tindakan build dan dependensi dependensi yang belum disertakan secara eksplisit dalam pemanggilan alat, yang akan menyebabkan kegagalan tindakan build yang dilakukan dari jarak jauh.

Misalnya, saat Bazel menginstruksikan compiler stateful untuk mem-build foo secara lokal, compiler mempertahankan referensi ke output build foo. Lalu saat Bazel menginstruksikan compiler untuk mem-buildbar, yang bergantung padafoo, tanpa secara eksplisit menyatakan bahwa dependensi dalam file BUILD untuk disertakan dalam pemanggilan compiler, tindakan ini akan berhasil dijalankan selama instance compiler yang sama dieksekusi untuk kedua tindakan (seperti yang biasa dilakukan untuk eksekusi lokal). Namun, karena dalam skenario eksekusi jarak jauh, setiap tindakan build menjalankan instance compiler terpisah, status compiler dan dependensi implisit bar pada foo akan hilang. dan build akan gagal.

Untuk membantu mendeteksi dan mengatasi 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 mengatasi error build terkait dependensi. Lihat Memecahkan Masalah Eksekusi Bazel Jarak Jauh dengan Docker Sandbox untuk informasi selengkapnya.

Mengelola biner yang bergantung pada platform

Biasanya, biner yang dibuat di platform host tidak dapat berjalan dengan aman di platform eksekusi jarak jauh yang arbitrer karena kemungkinan dependensi tidak cocok. Misalnya, biner SingleJar yang disediakan dengan Bazel menargetkan platform host. Namun, untuk eksekusi jarak jauh, SingleJar harus dikompilasi sebagai bagian dari proses pembuatan kode sehingga menargetkan platform eksekusi jarak jauh. (Lihat logika pemilihan target.)

Jangan kirimkan biner alat build yang diperlukan oleh build Anda dengan kode sumber, kecuali jika Anda yakin bahwa alat tersebut akan berjalan dengan aman di platform eksekusi Anda. Sebagai gantinya, lakukan salah satu hal berikut:

  • Kirimkan atau referensikan kode sumber secara eksternal untuk alat tersebut agar dapat dibuat untuk platform eksekusi jarak jauh.

  • Lakukan pra-penginstalan alat ke lingkungan eksekusi jarak jauh (misalnya, penampung toolchain) jika sudah cukup stabil dan gunakan aturan toolchain untuk menjalankannya dalam build Anda.

Mengelola aturan WORKSPACE bergaya konfigurasi

Aturan WORKSPACE Bazel dapat digunakan untuk memeriksa platform host atas alat dan library yang diperlukan oleh build, yang untuk build lokal juga merupakan platform eksekusi Bazel. Jika build secara eksplisit bergantung pada fitur dan artefak build lokal, build akan gagal selama eksekusi jarak jauh jika platform eksekusi jarak jauh tidak sama dengan platform host.

Tindakan berikut yang dilakukan oleh aturan WORKSPACE tidak kompatibel dengan eksekusi jarak jauh:

  • Membuat biner. Mengeksekusi tindakan kompilasi dalam aturan WORKSPACE menghasilkan biner yang tidak kompatibel dengan platform eksekusi jarak jauh jika berbeda dengan platform host.

  • Menginstal pip paket. Paket pip yang diinstal melalui aturan WORKSPACE memerlukan dependensi yang telah diinstal sebelumnya di platform host. Paket tersebut, yang dibuat khusus untuk platform host, tidak akan kompatibel dengan platform eksekusi jarak jauh jika berbeda dengan platform host.

  • Mengsimulasikan dengan alat atau artefak lokal. Symlink ke alat atau library yang diinstal pada platform host yang dibuat melalui aturan WORKSPACE akan menyebabkan build gagal pada platform eksekusi jarak jauh karena Bazel tidak akan dapat menemukannya. Sebagai gantinya, buat symlink menggunakan tindakan build standar agar library dan alat symlink dapat diakses dari hierarki runfiles Bazel. Jangan gunakan repository_ctx.symlink untuk menyimpan file target symlink di luar direktori repo eksternal.

  • Memutasi platform host. Hindari membuat file di luar hierarki runfiles Bazel, membuat variabel lingkungan, dan tindakan serupa, karena mungkin berperilaku secara tidak terduga pada platform eksekusi jarak jauh.

Untuk membantu menemukan potensi perilaku non-hermetic, Anda dapat menggunakan Log aturan ruang kerja.

Jika dependensi eksternal menjalankan operasi tertentu yang bergantung pada platform host, Anda harus membagi operasi tersebut antara WORKSPACE dan aturan build seperti berikut:

  • Pemeriksaan platform dan enumerasi dependensi. Operasi ini aman untuk dijalankan secara lokal melalui aturan WORKSPACE, yang dapat memeriksa library 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 dapat diperoleh selama pemeriksaan platform host. Artefak yang telah diperiksa sebelumnya memungkinkan Bazel mendeskripsikan dependensi seolah-olah dependensi tersebut bersifat lokal. Gunakan pernyataan bersyarat atau tanda --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 dijalankan selama build.

Agar lebih mudah membuat artefak yang telah diperiksa sebelumnya untuk eksekusi jarak jauh, Anda dapat menggunakan aturan WORKSPACE untuk menghasilkan 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 repo sumber Anda sebagai referensi.

Misalnya, untuk aturan Tensorflow untukcuda danpython , WORKSPACE menghasilkanBUILD files Domain. 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 ke dalam 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.