Jika Anda memiliki pertanyaan atau membutuhkan dukungan, lihat Mendapatkan Bantuan.
Apa itu Bazel?
Bazel adalah alat yang mengotomatiskan build dan pengujian software. Tugas build yang didukung mencakup menjalankan compiler dan linker untuk menghasilkan program dan library yang dapat dieksekusi, serta merakit paket yang dapat di-deploy untuk Android, iOS, dan lingkungan target lainnya. Bazel mirip dengan alat lain seperti Make, Ant, Gradle, Buck, Pants, dan Maven.
Apa yang istimewa dari Bazel?
Bazel dirancang agar sesuai dengan cara pengembangan software di Google. API ini memiliki fitur berikut:
- Dukungan multibahasa: Bazel mendukung banyak bahasa, dan dapat diperluas untuk mendukung bahasa pemrograman arbitrer.
- Bahasa build tingkat tinggi: Project dijelaskan dalam bahasa
BUILD
, format teks ringkas yang menjelaskan project sebagai kumpulan kecil library, biner, dan pengujian yang saling terhubung. Sebaliknya, dengan alat seperti Make, Anda harus menjelaskan setiap file dan pemanggilan compiler. - Dukungan multi-platform: Alat yang sama dan file
BUILD
yang sama dapat digunakan untuk membangun software untuk arsitektur yang berbeda, dan bahkan platform yang berbeda. Di Google, kami menggunakan Bazel untuk membangun semuanya, mulai dari aplikasi server yang berjalan di sistem di pusat data kami hingga aplikasi klien yang berjalan di ponsel. - Reproduksibilitas: Dalam file
BUILD
, setiap library, pengujian, dan biner harus menentukan dependensi langsungnya secara lengkap. Bazel menggunakan informasi dependensi ini untuk mengetahui apa yang harus dibangun ulang saat Anda membuat perubahan pada file sumber, dan tugas mana yang dapat berjalan secara paralel. Artinya, semua build bersifat inkremental dan akan selalu menghasilkan hasil yang sama. - Dapat diskalakan: Bazel dapat menangani build besar; di Google, biner server biasanya memiliki 100 ribu file sumber, dan build yang tidak mengubah file apa pun memerlukan waktu sekitar ~200 md.
Mengapa Google tidak menggunakan...?
- Make, Ninja: Alat ini memberikan kontrol yang sangat tepat atas perintah yang dipanggil untuk membuat file, tetapi pengguna harus menulis aturan yang benar.
- Pengguna berinteraksi dengan Bazel di tingkat yang lebih tinggi. Misalnya, Bazel memiliki aturan bawaan untuk “Java test”, “C++ binary”, dan konsep seperti “target platform” dan “host platform”. Aturan ini telah diuji secara ketat agar benar-benar andal.
- Ant dan Maven: Ant dan Maven terutama ditujukan untuk Java, sedangkan Bazel menangani beberapa bahasa. Bazel mendorong pembagian codebase menjadi unit-unit kecil yang dapat digunakan kembali, dan hanya dapat membangun ulang unit yang perlu dibangun ulang. Hal ini mempercepat pengembangan saat bekerja dengan codebase yang lebih besar.
- Gradle: File konfigurasi Bazel jauh lebih terstruktur daripada Gradle, sehingga Bazel dapat memahami dengan tepat fungsi setiap tindakan. Hal ini memungkinkan lebih banyak paralelisme dan reproduksibilitas yang lebih baik.
- Pants, Buck: Kedua alat ini dibuat dan dikembangkan oleh mantan karyawan Google di Twitter dan Foursquare, serta Facebook. Build tersebut dimodelkan setelah Bazel, tetapi set fiturnya berbeda, sehingga build tersebut bukan alternatif yang layak bagi kami.
Dari mana asal Bazel?
Bazel adalah versi alat yang digunakan Google untuk membangun software servernya secara internal. Selain itu, kami juga mengembangkan software lain, seperti aplikasi seluler (iOS, Android) yang terhubung ke server kami.
Apakah Anda menulis ulang alat internal Anda sebagai open source? Apakah itu garpu?
Bazel membagikan sebagian besar kodenya dengan alat internal dan aturannya digunakan untuk jutaan build setiap hari.
Mengapa Google membuat Bazel?
Dahulu kala, Google membangun software-nya menggunakan Makefile besar yang dihasilkan. Hal ini menyebabkan build yang lambat dan tidak andal, yang mulai mengganggu produktivitas developer kami dan kelincahan perusahaan. Bazel adalah cara untuk mengatasi masalah ini.
Apakah Bazel memerlukan cluster build?
Bazel menjalankan operasi build secara lokal secara default. Namun, Bazel juga dapat terhubung ke cluster build untuk build dan pengujian yang lebih cepat. Lihat dokumentasi kami tentang eksekusi jarak jauh dan caching serta caching jarak jauh untuk mengetahui detail selengkapnya.
Bagaimana cara kerja proses pengembangan Google?
Untuk basis kode server, kita menggunakan alur kerja pengembangan berikut:
- Semua kode server kami ada dalam satu sistem kontrol versi yang sangat besar.
- Semua orang membangun perangkat lunak mereka dengan Bazel.
- Tim yang berbeda memiliki bagian yang berbeda dari pohon sumber, dan membuat komponen mereka tersedia sebagai target
BUILD
. - Percabangan terutama digunakan untuk mengelola rilis, sehingga semua orang mengembangkan software mereka pada revisi head.
Bazel adalah fondasi filosofi ini: karena Bazel mewajibkan semua dependensi ditentukan sepenuhnya, kita dapat memprediksi program dan pengujian mana yang terpengaruh oleh perubahan, dan memeriksanya sebelum pengiriman.
Informasi latar belakang selengkapnya tentang proses pengembangan di Google dapat ditemukan di blog alat eng.
Mengapa Anda membuka Bazel?
Membangun software seharusnya menyenangkan dan mudah. Build yang lambat dan tidak dapat diprediksi membuat pemrograman menjadi tidak menyenangkan.
Mengapa saya ingin menggunakan Bazel?
- Bazel dapat memberikan waktu build yang lebih cepat karena hanya dapat mengompilasi ulang file yang perlu dikompilasi ulang. Demikian pula, alat ini dapat melewati pengujian yang tidak berubah.
- Bazel menghasilkan hasil yang deterministik. Hal ini menghilangkan perbedaan antara build inkremental dan bersih, sistem laptop dan CI, dll.
- Bazel dapat membangun aplikasi klien dan server yang berbeda dengan alat yang sama dari ruang kerja yang sama. Misalnya, Anda dapat mengubah protokol klien/server dalam satu commit, dan menguji apakah aplikasi seluler yang diupdate berfungsi dengan server yang diupdate, dengan membangun keduanya menggunakan alat yang sama, sehingga mendapatkan semua manfaat Bazel yang disebutkan di atas.
Bisakah saya melihat contohnya?
Ya; lihat contoh sederhana atau baca kode sumber Bazel untuk contoh yang lebih kompleks.
Apa keunggulan Bazel?
Bazel unggul dalam membangun dan menguji project dengan properti berikut:
- Project dengan codebase besar
- Project yang ditulis dalam (beberapa) bahasa yang dikompilasi
- Project yang di-deploy di beberapa platform
- Project yang memiliki pengujian ekstensif
Di mana saya dapat menjalankan Bazel?
Bazel berjalan di Linux, macOS (OS X), dan Windows.
Melakukan porting ke platform UNIX lain relatif mudah, asalkan JDK tersedia untuk platform tersebut.
Untuk apa saya tidak boleh menggunakan Bazel?
- Bazel mencoba melakukan caching dengan cerdas. Artinya, direktori ini tidak cocok untuk menjalankan operasi build yang outputnya tidak boleh di-cache. Misalnya, langkah-langkah berikut tidak boleh dijalankan dari Bazel:
- Langkah kompilasi yang mengambil data dari internet.
- Langkah pengujian yang terhubung ke instance QA situs Anda.
- Langkah deployment yang mengubah konfigurasi cloud situs Anda.
- Jika build Anda terdiri dari beberapa langkah berurutan yang panjang, Bazel mungkin tidak dapat banyak membantu. Anda akan mendapatkan kecepatan yang lebih tinggi dengan memecah langkah-langkah panjang menjadi target yang lebih kecil dan terpisah yang dapat dijalankan Bazel secara paralel.
Seberapa stabil set fitur Bazel?
Fitur inti (aturan C++, Java, dan shell) banyak digunakan di dalam Google, sehingga diuji secara menyeluruh dan memiliki churn yang sangat kecil. Demikian pula, kami menguji versi baru Bazel di ratusan ribu target setiap hari untuk menemukan regresi, dan kami merilis versi baru beberapa kali setiap bulan.
Singkatnya, kecuali untuk fitur yang ditandai sebagai eksperimental, Bazel seharusnya Berfungsi dengan Baik. Perubahan pada aturan non-eksperimental akan kompatibel dengan sistem lama. Daftar status dukungan fitur yang lebih mendetail dapat ditemukan di dokumen dukungan kami.
Seberapa stabil Bazel sebagai biner?
Di Google, kami memastikan bahwa error Bazel sangat jarang terjadi. Hal ini juga berlaku untuk codebase open source kami.
Bagaimana cara mulai menggunakan Bazel?
Lihat Memulai.
Bukankah Docker menyelesaikan masalah reproduksibilitas?
Dengan Docker, Anda dapat dengan mudah membuat sandbox dengan rilis OS tetap, misalnya, Ubuntu 12.04, Fedora 21. Hal ini memecahkan masalah reproduksibilitas untuk lingkungan sistem – yaitu, “versi /usr/bin/c++ mana yang saya butuhkan?”
Docker tidak menangani reproduksibilitas terkait perubahan pada kode sumber. Menjalankan Make dengan Makefile yang ditulis secara tidak sempurna di dalam container Docker masih dapat menghasilkan hasil yang tidak terduga.
Di Google, kami memeriksa alat ke dalam kontrol sumber untuk memastikan reproduksibilitas. Dengan cara ini, kita dapat memeriksa perubahan pada alat (“upgrade GCC ke 4.6.1”) dengan mekanisme yang sama seperti perubahan pada library dasar (“perbaiki pemeriksaan batas di OpenSSL”).
Dapatkah saya membuat biner untuk deployment di Docker?
Dengan Bazel, Anda dapat membuat biner yang ditautkan secara statis dan mandiri di C/C++, serta file jar mandiri untuk Java. Ini berjalan dengan sedikit dependensi pada sistem UNIX normal, dan oleh karena itu harus mudah diinstal di dalam container Docker.
Bazel memiliki konvensi untuk menyusun program yang lebih kompleks, misalnya, program Java yang menggunakan sekumpulan file data, atau menjalankan program lain sebagai subproses. Lingkungan tersebut dapat dikemas sebagai arsip mandiri, sehingga dapat di-deploy di sistem yang berbeda, termasuk image Docker.
Dapatkah saya membangun image Docker dengan Bazel?
Ya, Anda dapat menggunakan aturan Docker kami untuk membangun image Docker yang dapat direproduksi.
Apakah Bazel akan membuat build saya dapat direproduksi secara otomatis?
Untuk biner Java dan C++, ya, dengan asumsi Anda tidak mengubah toolchain. Jika Anda memiliki langkah-langkah build yang melibatkan resep kustom (misalnya, mengeksekusi biner melalui skrip shell di dalam aturan), Anda harus lebih berhati-hati:
- Jangan gunakan dependensi yang tidak dideklarasikan. Eksekusi dalam sandbox (–spawn_strategy=sandboxed, hanya di Linux) dapat membantu menemukan dependensi yang tidak dideklarasikan.
- Hindari menyimpan stempel waktu dan ID pengguna dalam file yang dihasilkan. File ZIP dan arsip lainnya sangat rentan terhadap hal ini.
- Hindari terhubung ke jaringan. Eksekusi dalam sandbox juga dapat membantu di sini.
- Hindari proses yang menggunakan angka acak, khususnya, penelusuran kamus diacak dalam banyak bahasa pemrograman.
Apakah Anda memiliki rilis biner?
Ya, Anda dapat menemukan binari rilis terbaru dan meninjau kebijakan rilis kami
Saya menggunakan Eclipse/IntelliJ/XCode. Bagaimana Bazel beroperasi dengan IDE?
Untuk IntelliJ, lihat plugin IntelliJ dengan Bazel.
Untuk XCode, lihat Tulsi.
Untuk Eclipse, lihat plugin E4B.
Untuk IDE lainnya, lihat postingan blog tentang cara kerja plugin ini.
Saya menggunakan Jenkins/CircleCI/TravisCI. Bagaimana Bazel beroperasi dengan sistem CI?
Bazel menampilkan kode keluar non-nol jika pemanggilan build atau pengujian gagal, dan ini sudah cukup untuk integrasi CI dasar. Karena Bazel tidak memerlukan build bersih untuk kebenaran, sistem CI tidak boleh dikonfigurasi untuk membersihkan sebelum memulai build/pengujian.
Detail lebih lanjut tentang kode keluar ada di Panduan Pengguna.
Fitur apa yang akan tersedia di Bazel pada masa mendatang?
Lihat Roadmap kami.
Dapatkah saya menggunakan Bazel untuk project INSERT LANGUAGE HERE?
Bazel dapat diperluas. Siapa pun dapat menambahkan dukungan untuk bahasa baru. Banyak bahasa yang didukung: lihat build ensiklopedia untuk mengetahui daftar rekomendasi dan awesomebazel.com untuk mengetahui daftar yang lebih komprehensif.
Jika Anda ingin mengembangkan ekstensi atau mempelajari cara kerjanya, lihat dokumentasi untuk memperluas Bazel.
Dapatkah saya berkontribusi pada basis kode Bazel?
Lihat pedoman kontribusi kami.
Mengapa tidak semua pengembangan dilakukan secara terbuka?
Kami masih harus sering memfaktorkan ulang antarmuka antara kode publik di Bazel dan ekstensi internal kami. Hal ini menyulitkan untuk melakukan banyak pengembangan secara terbuka.
Apakah Anda sudah selesai melakukan open source Bazel?
Membuka kode sumber Bazel masih dalam proses. Khususnya, kami masih berupaya untuk menyediakan kode sumber:
- Banyak pengujian unit dan integrasi kami (yang akan mempermudah kontribusi patch).
- Integrasi IDE penuh.
Selain kode, kami ingin semua peninjauan kode, pelacakan bug, dan keputusan desain dilakukan secara publik, dengan melibatkan komunitas Bazel. Kita belum sampai di sana, jadi beberapa perubahan hanya akan muncul di repositori Bazel tanpa penjelasan yang jelas. Meskipun tidak ada transparansi ini, kami ingin mendukung developer eksternal dan berkolaborasi. Oleh karena itu, kami membuka kode tersebut, meskipun beberapa pengembangan masih terjadi secara internal di Google. Harap beri tahu kami jika ada hal yang tampak tidak jelas atau tidak dapat dibenarkan saat kami beralih ke model terbuka.
Apakah ada bagian Bazel yang tidak akan pernah bersifat open source?
Ya, beberapa basis kode terintegrasi dengan teknologi khusus Google atau kami telah mencari alasan untuk menghapusnya (atau merupakan kombinasi keduanya). Bagian code base ini tidak tersedia di GitHub dan mungkin tidak akan pernah tersedia.
Bagaimana cara menghubungi tim?
Anda dapat menghubungi kami di bazel-discuss@googlegroups.com.
Di mana saya dapat melaporkan bug?
Buka masalah di GitHub.
Apa yang terjadi dengan kata “Blaze” dalam codebase?
Ini adalah nama internal untuk alat. Harap sebut Blaze sebagai Bazel.
Mengapa project Google lainnya (Android, Chrome) menggunakan alat build lain?
Hingga rilis pertama (Alfa), Bazel tidak tersedia secara eksternal, sehingga project open source seperti Chromium dan Android tidak dapat menggunakannya. Selain itu, kurangnya dukungan Windows pada awalnya menjadi masalah untuk membangun aplikasi Windows, seperti Chrome. Karena project ini telah matang dan menjadi lebih stabil, Android Open Source Project sedang dalam proses migrasi ke Bazel.
Bagaimana cara mengucapkan “Bazel”?
Sama seperti “basil” (herba) dalam bahasa Inggris Amerika Serikat: “BAY-zel”. Berima dengan “hazel”. IPA: /ˈbeɪzˌəl/