Memanggil Bazel dari skrip

Laporkan masalah Lihat sumber

Anda dapat memanggil Bazel dari skrip untuk menjalankan build, menjalankan pengujian, atau membuat kueri grafik dependensi. Bazel telah didesain untuk memungkinkan pembuatan skrip yang efektif, tetapi bagian ini mencantumkan beberapa detail yang perlu diingat untuk membuat skrip Anda lebih kokoh.

Memilih basis output

Opsi --output_base mengontrol tempat proses Bazel akan menulis output build, serta berbagai file kerja yang digunakan secara internal oleh Bazel, salah satunya adalah kunci yang melindungi dari mutasi serentak output base oleh beberapa proses Bazel.

Memilih direktori dasar output yang benar untuk skrip Anda bergantung pada beberapa faktor. Jika Anda perlu menempatkan output build di lokasi tertentu, tindakan ini akan mendikte basis output yang perlu Anda gunakan. Jika Anda membuat panggilan "hanya baca" ke Bazel (seperti bazel query), faktor penguncian akan menjadi lebih penting. Secara khusus, jika Anda perlu menjalankan beberapa instance skrip secara serentak, perhatikan bahwa setiap proses server Blaze dapat menangani maksimal satu pemanggilan dalam satu waktu. Bergantung pada situasi, mungkin masuk akal bagi setiap instance skrip untuk menunggu gilirannya, atau mungkin masuk akal menggunakan --output_base untuk menjalankan beberapa server Blaze dan menggunakannya.

Jika menggunakan nilai dasar output default, Anda akan bersaing untuk mendapatkan kunci yang sama dengan yang digunakan oleh perintah Bazel interaktif pengguna. Jika pengguna mengeluarkan perintah yang berjalan lama seperti build, skrip Anda harus menunggu hingga perintah tersebut selesai sebelum dapat dilanjutkan.

Catatan tentang mode server

Secara default, Bazel menggunakan proses server yang berjalan lama sebagai pengoptimalan. Saat menjalankan Bazel dalam skrip, jangan lupa memanggil shutdown saat Anda selesai dengan server, atau menentukan --max_idle_secs=5 agar server tidak ada aktivitas segera mati.

Kode keluar apa yang akan saya dapatkan?

Bazel mencoba membedakan kegagalan yang terjadi karena kode sumber sedang dipertimbangkan dengan error eksternal yang mencegah Bazel dijalankan dengan benar. Eksekusi Bazel dapat menghasilkan exit code berikut:

Kode Keluar yang umum untuk semua perintah:

  • 0 - Berhasil
  • 2 - Masalah Command Line, Tanda atau kombinasi perintah yang Buruk atau Ilegal, atau Variabel Lingkungan yang Buruk. Command line Anda harus diubah.
  • 8 - Build Terganggu tetapi kami dihentikan dengan penonaktifan yang berurutan.
  • 9 - Kunci server ditahan dan --noblock_for_lock diteruskan.
  • 32 - Kegagalan Lingkungan Eksternal tidak ada di komputer ini.

  • 33 - Bazel kehabisan memori dan mengalami error. Anda perlu mengubah command line.

  • 34 - Ditujukan untuk penggunaan internal Google.

  • 35 - Ditujukan untuk penggunaan internal Google.

  • 36 - Masalah Lingkungan Lokal, dicurigai permanen.

  • 37 - Pengecualian yang Tidak Tertangani / Error Bazel Internal.

  • 38 - Hasil publikasi error sementara ke Layanan Peristiwa Build.

  • 39 - Blob yang diperlukan oleh Bazel dikeluarkan dari Cache Jarak Jauh.

  • 41-44 - Ditujukan untuk penggunaan internal Google.

  • 45 - Error yang terus-menerus memublikasikan hasil ke Layanan Peristiwa Build.

  • 47 - Ditujukan untuk penggunaan internal Google.

  • 49 - Ditujukan untuk penggunaan internal Google.

Kode pengembalian untuk perintah bazel build, bazel test:

  • 1 - Build gagal.
  • 3 - Build Oke, tetapi beberapa pengujian gagal atau waktu habis.
  • 4 - Build berhasil, tetapi tidak ada pengujian yang ditemukan meskipun pengujian diminta.

Untuk bazel run:

  • 1 - Build gagal.
  • Jika build berhasil, tetapi subproses yang dieksekusi menampilkan kode keluar bukan nol, ini juga akan menjadi kode keluar dari perintah tersebut.

Untuk bazel query:

  • 3 - Berhasil sebagian, tetapi kueri menemukan 1 atau beberapa error dalam kumpulan file BUILD input sehingga hasil operasi tidak dapat diandalkan 100%. Hal ini mungkin karena opsi --keep_going pada command line.
  • 7 - Kegagalan perintah.

Versi Bazel mendatang dapat menambahkan exit code tambahan, yang menggantikan kode keluar kegagalan umum 1 dengan nilai selain nol yang berbeda dengan arti tertentu. Namun, semua nilai keluar yang bukan nol akan selalu menghasilkan error.

Membaca file .bazelrc

Secara default, Bazel akan membaca file .bazelrc dari direktori ruang kerja dasar atau direktori beranda pengguna. Terlepas dari apakah hal ini diinginkan atau tidak bagi skrip Anda; jika skrip harus sepenuhnya hermetis (seperti saat melakukan build rilis), Anda harus menonaktifkan pembacaan file .bazelrc dengan menggunakan opsi --bazelrc=/dev/null. Jika Anda ingin menjalankan build menggunakan setelan pilihan pengguna, perilaku default-nya akan lebih baik.

Log perintah

Output Bazel juga tersedia dalam file log perintah yang dapat Anda temukan dengan perintah berikut:

bazel info command_log

File log perintah berisi stream stdout dan stderr interleftd dari perintah Bazel terbaru. Perlu diperhatikan bahwa menjalankan bazel info akan menimpa konten file ini, karena konten tersebut akan menjadi perintah Bazel terbaru. Namun, lokasi file log perintah tidak akan berubah kecuali jika Anda mengubah setelan opsi --output_base atau --output_user_root.

Mengurai output

Output Bazel cukup mudah diurai untuk berbagai tujuan. Dua opsi yang mungkin berguna untuk skrip Anda adalah --noshow_progress yang menyembunyikan pesan progres, dan --show_result n, yang mengontrol apakah pesan "build terbaru" akan dicetak atau tidak; pesan ini dapat diurai untuk menemukan target mana yang berhasil dibuat, dan lokasi file output yang dibuatnya. Pastikan untuk menentukan nilai yang sangat besar n jika Anda mengandalkan pesan ini.

Memecahkan masalah performa dengan pembuatan profil

Lihat bagian Pembuatan Profil Performa.