Jika Anda memiliki pertanyaan atau memerlukan dukungan, lihat Mendapatkan Bantuan.
Apa itu Bazel?
Bazel adalah alat yang mengotomatiskan pembuatan dan pengujian software. Tugas build yang didukung termasuk menjalankan compiler dan penaut untuk menghasilkan program dan library yang dapat dieksekusi, serta menyusun 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 spesial dari Bazel?
Bazel dirancang agar sesuai dengan pengembangan software di Google. Fiturnya adalah sebagai berikut:
- Dukungan multibahasa: Bazel mendukung banyak bahasa, dan dapat diperluas untuk mendukung bahasa pemrograman arbitrer.
- Bahasa build tingkat tinggi: Project dijelaskan dalam bahasa
BUILD
, yaitu format teks ringkas yang mendeskripsikan project sebagai kumpulan library, biner, dan pengujian kecil yang saling terhubung. Sebaliknya, dengan alat seperti Make, Anda harus menjelaskan tiap file dan pemanggilan compiler. - Dukungan multi-platform: Alat yang sama dan file
BUILD
yang sama dapat digunakan untuk membangun software untuk berbagai arsitektur, dan bahkan platform yang berbeda. Di Google, kami menggunakan Bazel untuk membuat semuanya, mulai dari aplikasi server yang berjalan pada sistem di pusat data kami hingga aplikasi klien yang berjalan di ponsel. - Reproduksi: Dalam file
BUILD
, setiap library, pengujian, dan biner harus menentukan dependensi langsungnya sepenuhnya. 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 memberikan hasil yang sama. - Skalabel: Bazel dapat menangani build besar; di Google, biner server biasanya memiliki 100 ribu file sumber, dan build di mana tidak ada file yang diubah membutuhkan waktu sekitar ~200 md.
Mengapa Google tidak menggunakan...?
- Make, Ninja: Alat-alat ini memberikan kontrol yang sangat tepat atas perintah apa yang dipanggil untuk membuat file, namun pengguna dapat menulis aturan yang benar.
- Pengguna berinteraksi dengan Bazel di level yang lebih tinggi. Misalnya, Bazel memiliki aturan bawaan untuk "pengujian Java", "biner C++", dan gagasan seperti "platform target" dan "platform host". Aturan ini telah teruji sempurna.
- Ant dan Maven: Ant dan Maven terutama ditujukan untuk Java, sedangkan Bazel menangani beberapa bahasa. Bazel mendorong pembagian codebase ke dalam unit-unit kecil yang dapat digunakan kembali, dan hanya dapat membangun ulang codebase yang perlu dibangun ulang. Hal ini akan mempercepat pengembangan saat bekerja dengan codebase yang lebih besar.
- Gradle: File konfigurasi Bazel jauh lebih terstruktur daripada Gradle, sehingga Bazel dapat memahami dengan tepat apa yang dilakukan setiap tindakan. Hal ini memungkinkan lebih banyak paralelisme dan kemampuan reproduksi yang lebih baik.
- Pants, Buck: Kedua alat tersebut dibuat dan dikembangkan oleh mantan Googler di Twitter dan Foursquare, serta Facebook. Mereka dibuat berdasarkan model Bazel, tetapi set fiturnya berbeda, sehingga bukan alternatif yang cocok bagi kami.
Dari mana Bazel berasal?
Bazel adalah ragam alat yang digunakan Google untuk membangun perangkat lunak servernya secara internal. Situs ini telah berkembang untuk membuat software lainnya juga, 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 harinya.
Mengapa Google membuat Bazel?
Pada zaman itu, Google membuat software-nya menggunakan Makefile berukuran besar yang dibuat. Hal ini menyebabkan build yang lambat dan tidak dapat diandalkan, yang mulai mengganggu produktivitas developer kami dan ketangkasan perusahaan. Bazel adalah cara untuk menyelesaikan 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 dan penyimpanan cache dari jarak jauh serta cache jarak jauh untuk detail lebih lanjut.
Bagaimana cara kerja proses pengembangan Google?
Untuk code base server, kami menggunakan alur kerja pengembangan berikut:
- Semua kode server kami berada dalam satu sistem kontrol versi yang sangat besar.
- Semua orang membuat perangkat lunak mereka dengan Bazel.
- Tim yang berbeda memiliki bagian yang berbeda dari hierarki sumber, dan membuat komponennya tersedia sebagai target
BUILD
. - {i>Branching<i} terutama digunakan untuk mengelola rilis, sehingga semua orang mengembangkan perangkat lunak mereka pada saat revisi kepala.
Bazel merupakan landasan filosofi ini: karena Bazel mengharuskan semua dependensi ditentukan sepenuhnya, kami dapat memprediksi program dan pengujian mana yang terpengaruh oleh perubahan, dan memeriksanya sebelum pengiriman.
Latar belakang selengkapnya tentang proses pengembangan di Google dapat ditemukan di blog alat engineer.
Kenapa kamu membuka Bazel?
Membangun perangkat lunak harus menyenangkan dan mudah. Build yang lambat dan tidak dapat diprediksi menghilangkan kesenangan pemrograman.
Mengapa saya perlu menggunakan Bazel?
- Bazel dapat memberi Anda waktu build yang lebih cepat karena hanya dapat mengompilasi ulang file yang perlu dikompilasi ulang. Demikian pula, alat ini dapat melewati pengujian ulang yang diketahuinya tidak berubah.
- Bazel memberikan hasil yang determenistik. Hal ini menghilangkan distorsi antara build inkremental dan clean build, laptop dan sistem 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, membangun keduanya dengan alat yang sama, sehingga menuai semua manfaat Bazel yang disebutkan di atas.
Dapatkah saya melihat contoh?
Ya; lihat contoh sederhana atau baca kode sumber Bazel untuk contoh yang lebih kompleks.
Apa hidangan Bazel terbaik?
Bazel ahli 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 bisa menjalankan Bazel?
Bazel berjalan di Linux, macOS (OS X), dan Windows.
Porting ke platform UNIX lainnya seharusnya relatif mudah, selama JDK tersedia untuk platform tersebut.
Mengapa saya tidak boleh menggunakan Bazel?
- Bazel berusaha berhati-hati dalam menyimpan data ke cache. Artinya, 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 UM (Uji Mutu) di situs Anda.
- Langkah deployment yang mengubah konfigurasi cloud situs Anda.
- Jika build Anda terdiri dari beberapa langkah yang panjang dan berurutan, Bazel mungkin tidak dapat banyak membantu. Anda akan memperoleh kecepatan lebih tinggi dengan memecah langkah yang panjang menjadi target yang lebih kecil dan terpisah yang dapat dijalankan secara paralel oleh Bazel.
Seberapa stabil set fitur Bazel?
Fitur inti (aturan C++, Java, dan shell) memiliki penggunaan yang luas di dalam Google, sehingga fitur tersebut diuji secara menyeluruh dan memiliki sangat sedikit churn. 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 Just Work. Perubahan pada aturan non-eksperimental akan kompatibel dengan sistem lama. Daftar yang lebih mendetail terkait status dukungan fitur dapat ditemukan di dokumen dukungan kami.
Seberapa stabil Bazel sebagai biner?
Di dalam Google, kami memastikan bahwa error Bazel sangat jarang terjadi. Hal ini juga berlaku untuk codebase open source kita.
Bagaimana cara mulai menggunakan Bazel?
Lihat Memulai.
Tidakkah Docker memecahkan masalah reproduksi?
Dengan Docker, Anda dapat dengan mudah membuat {i>sandbox<i} dengan rilis OS tetap, misalnya, Ubuntu 12.04, Fedora 21. Ini memecahkan masalah kemampuan reproduksi untuk lingkungan sistem – yaitu, “versi /usr/bin/c++ mana yang saya perlukan?”
Docker tidak menangani reproduksi berdasarkan perubahan kode sumber. Menjalankan Make dengan Makefile yang ditulis tidak sempurna di dalam container Docker masih dapat memberikan hasil yang tidak dapat diprediksi.
Di dalam Google, kami memasukkan alat ke dalam kontrol sumber untuk kemampuan reproduksi. Dengan cara ini, kita bisa memeriksa perubahan pada alat ("mengupgrade GCC ke 4.6.1") dengan mekanisme yang sama seperti perubahan pada library dasar (“memperbaiki pemeriksaan batas di OpenSSL”).
Dapatkah saya membangun biner untuk deployment di Docker?
Dengan Bazel, Anda bisa membuat biner mandiri yang tertaut secara statis di C/C++, dan file jar mandiri untuk Java. Ini berjalan dengan sedikit dependensi pada sistem UNIX biasa, sehingga mudah diinstal di dalam container Docker.
Bazel memiliki konvensi untuk menyusun struktur program yang lebih kompleks, misalnya, program Java yang menggunakan seperangkat file data, atau menjalankan program lain sebagai subproses. Anda dapat mengemas lingkungan seperti arsip mandiri, sehingga dapat di-deploy di sistem yang berbeda, termasuk image Docker.
Bisakah saya membangun image Docker dengan Bazel?
Ya, Anda dapat menggunakan aturan Docker untuk membangun image Docker yang dapat direproduksi.
Apakah Bazel akan membuat build saya dapat direproduksi secara otomatis?
Ya, untuk biner Java dan C++, dengan asumsi Anda tidak mengubah toolchain. Jika Anda memiliki 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 dengan sandbox (–spawn_strategy=sandboxed, hanya di Linux) dapat membantu menemukan dependensi yang tidak dideklarasikan.
- Hindari menyimpan stempel waktu dan User-ID dalam file yang dihasilkan. File ZIP dan arsip lainnya sangat rentan terhadap hal ini.
- Hindari menghubungkan ke jaringan. Eksekusi sandbox juga dapat membantu di sini.
- Hindari proses yang menggunakan angka acak, khususnya, traversal kamus diacak dalam banyak bahasa pemrograman.
Apakah Anda memiliki rilis biner?
Ya, Anda dapat menemukan biner rilis terbaru dan meninjau kebijakan rilis kami
Saya menggunakan Eclipse/IntelliJ/XCode. Bagaimana cara 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 mengembalikan kode keluar bukan nol jika pemanggilan build atau pengujian gagal, dan ini sudah cukup untuk integrasi CI dasar. Karena Bazel tidak memerlukan clean build untuk ketepatan, sistem CI tidak boleh dikonfigurasi untuk membersihkan sebelum memulai build/pengujian.
Detail selengkapnya tentang kode keluar dapat ditemukan di Panduan Pengguna.
Apa saja fitur mendatang di Bazel?
Lihat Roadmap kami.
Dapatkah saya menggunakan Bazel untuk project INSERT LANGUAGE Here saya?
Bazel dapat diperluas. Siapa pun dapat menambahkan dukungan untuk bahasa baru. Banyak bahasa yang didukung: lihat build encyclopedia untuk daftar rekomendasi dan awesomebazel.com untuk daftar yang lebih lengkap.
Jika Anda ingin mengembangkan ekstensi atau mempelajari cara kerjanya, lihat dokumentasi untuk memperluas Bazel.
Dapatkah saya berkontribusi pada code base Bazel?
Lihat panduan kontribusi kami.
Mengapa tidak semua pengembangan dilakukan secara terbuka?
Kami masih harus sering memfaktorkan ulang antarmuka antara kode publik di Bazel dan ekstensi internal. Hal ini membuat sulit untuk melakukan banyak pengembangan di tempat terbuka.
Apakah Anda sudah selesai membuat Bazel sebagai {i>open source<i}?
Open source Bazel masih dalam proses. Secara khusus, kami masih berupaya menyediakan solusi open source:
- Banyak pengujian unit dan integrasi kami (yang akan mempermudah pemberian patch).
- Integrasi IDE penuh.
Di luar kode, kami nantinya ingin semua peninjauan kode, pelacakan bug, dan keputusan desain dilakukan secara publik, dengan melibatkan komunitas Bazel. Kami belum sampai di sana, jadi beberapa perubahan hanya akan muncul di repositori Bazel tanpa penjelasan yang jelas. Meskipun kurangnya transparansi, kami ingin mendukung developer eksternal dan berkolaborasi. Oleh karena itu, kami membuka kode, meskipun beberapa pengembangan masih terjadi secara internal untuk Google. Harap beri tahu kami jika ada yang tampak tidak jelas atau tidak dapat dibenarkan saat kami beralih ke model terbuka.
Adakah bagian dari Bazel yang tidak akan pernah menjadi {i>open source<i}?
Ya, beberapa code base dapat diintegrasikan dengan teknologi khusus Google atau kami telah mencari alasan untuk meniadakannya (atau merupakan kombinasi keduanya). Bagian-bagian dari code base ini tidak tersedia di GitHub dan mungkin tidak akan tersedia.
Bagaimana cara menghubungi tim?
Anda dapat menghubungi kami di bazel-discuss@googlegroups.com.
Di mana saya dapat melaporkan bug?
Buka masalah di GitHub.
Ada apa dengan kata “Blaze” di codebase?
Ini adalah nama internal untuk alat. Rujuk Bazel sebagai Bazel.
Mengapa project Google lainnya (Android, Chrome) menggunakan alat build lain?
Hingga rilis (Alfa) pertama, Bazel tidak tersedia secara eksternal, sehingga project open source seperti Chromium dan Android tidak dapat menggunakannya. Selain itu, kurangnya dukungan Windows awal merupakan masalah untuk membangun aplikasi Windows, seperti Chrome. Karena project ini telah matang dan menjadi lebih stabil, Project Open Source Android sedang dalam proses migrasi ke Bazel.
Bagaimana cara mengucapkan “Bazel”?
Sama seperti “basil” (ramuan) dalam bahasa Inggris AS: “BAY-zel”. Iramanya berirama “hazel”. IPA: /pj e l l/