Memanggil Bazel dari skrip

Laporkan masalah Lihat sumber Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Anda dapat memanggil Bazel dari skrip untuk melakukan build, menjalankan pengujian, atau membuat kueri grafik dependensi. Bazel telah dirancang 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 harus menulis output build, serta berbagai file kerja yang digunakan secara internal oleh Bazel, salah satunya adalah kunci yang melindungi dari mutasi serentak basis output 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, hal ini akan menentukan basis output yang perlu Anda gunakan. Jika Anda melakukan panggilan "hanya baca" ke Bazel (seperti bazel query), faktor penguncian akan lebih penting. Secara khusus, jika Anda perlu menjalankan beberapa instance skrip secara serentak, Anda harus memberikan basis output yang berbeda (atau acak) untuk setiap instance.

Jika menggunakan nilai dasar output default, Anda akan bersaing untuk mendapatkan kunci yang sama yang digunakan oleh perintah Bazel interaktif pengguna. Jika pengguna mengeluarkan perintah yang berjalan lama seperti build, skrip Anda harus menunggu 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 menggunakan server, atau, tentukan --max_idle_secs=5 agar server tidak ada aktivitas dengan segera.

Kode exit apa yang akan saya dapatkan?

Bazel mencoba membedakan kegagalan karena kode sumber yang sedang dipertimbangkan dari error eksternal yang mencegah Bazel dieksekusi dengan benar. Eksekusi Bazel dapat menghasilkan kode keluar berikut:

Kode Keluar yang umum untuk semua perintah:

  • 0 - Berhasil
  • 2 - Masalah Command Line, Flag atau kombinasi perintah Buruk atau Ilegal, atau Variabel Lingkungan Buruk. Baris perintah Anda harus diubah.
  • 8 - Build Terganggu, tetapi kami menghentikan dengan penonaktifan secara teratur.
  • 9 - Kunci server ditahan dan --noblock_for_lock diteruskan.
  • 32 - Kegagalan Lingkungan Eksternal tidak terjadi di komputer ini.

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

  • 34 - Direservasi untuk penggunaan internal Google.

  • 35 - Direservasi untuk penggunaan internal Google.

  • 36 - Masalah Lingkungan Lokal, diduga permanen.

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

  • 38 - Direservasi untuk penggunaan internal Google.

  • 41-44 - Direservasi untuk penggunaan internal Google.

  • 45 - Terjadi error saat memublikasikan hasil ke Layanan Peristiwa Build.

  • 47 - Direservasi untuk penggunaan internal Google.

Kode yang ditampilkan untuk perintah bazel build, bazel test:

  • 1 - Build gagal.
  • 3 - Build OK, 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, kode tersebut juga akan menjadi kode keluar dari perintah.

Untuk bazel query:

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

Versi Bazel mendatang dapat menambahkan kode keluar tambahan, yang menggantikan kode keluar kegagalan umum 1 dengan nilai non-nol yang berbeda dengan makna tertentu. Namun, semua nilai keluar yang bukan nol akan selalu dianggap sebagai error.

Membaca file .bazelrc

Secara default, Bazel membaca file .bazelrc dari direktori ruang kerja dasar atau direktori utama pengguna. Apakah hal ini diinginkan atau tidak adalah pilihan untuk skrip Anda; jika skrip Anda harus hermetis secara sempurna (seperti saat melakukan build rilis), Anda harus menonaktifkan pembacaan file .bazelrc menggunakan opsi --bazelrc=/dev/null. Jika Anda ingin melakukan build menggunakan setelan pilihan pengguna, perilaku default 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 aliran stdout dan stderr yang diselingi dari perintah Bazel terbaru. Perhatikan bahwa menjalankan bazel info akan menimpa konten file ini, karena file 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 diuraikan untuk banyak 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 up-to-date" akan dicetak atau tidak; pesan ini dapat diurai untuk mengetahui target mana yang berhasil dibuat, dan lokasi file output yang dibuatnya. Pastikan untuk menentukan nilai n yang sangat besar jika Anda mengandalkan pesan ini.

Memecahkan masalah performa dengan pembuatan profil

Lihat bagian Profiling Performa.