Halaman ini membahas hermeticity, manfaat menggunakan bangunan hermetic, dan strategi untuk mengidentifikasi perilaku non-hermetik di build Anda.
Ringkasan
Ketika diberikan kode sumber input dan konfigurasi produk yang sama, sistem build selalu menghasilkan output yang sama dengan mengisolasi build dari perubahan ke sistem {i>host<i}.
Untuk mengisolasi build, build hermetis tidak sensitif terhadap library dan software lain yang diinstal di komputer host lokal atau jarak jauh. Mereka bergantung pada versi tertentu dari alat build, seperti compiler, dan dependensi, seperti library. Hal ini membuat proses build mandiri karena tidak bergantung pada layanan eksternal untuk lingkungan build.
Dua aspek penting dari hermetikitas adalah:
- Isolasi: Sistem build hermetik memperlakukan alat sebagai kode sumber. Mereka download salinan alat dan kelola penyimpanan serta gunakan di dalam file terkelola pohon. Ini menciptakan isolasi antara mesin {i>host<i} dan pengguna lokal, termasuk versi bahasa yang terinstal.
- Identitas sumber: Sistem build Hermetic mencoba memastikan kesamaan input. Repositori kode, seperti Git, mengidentifikasi kumpulan mutasi kode dengan kode hash unik. Sistem build hermetis menggunakan hash ini untuk mengidentifikasi perubahan pada input build.
Manfaat
Manfaat utama build hermetic adalah:
- Speed: Output dari suatu tindakan dapat di-cache, dan tindakan tersebut tidak perlu di-cache jalankan lagi kecuali jika input berubah.
- Eksekusi paralel: Untuk input dan output tertentu, sistem build dapat buat grafik dari semua tindakan untuk menghitung kampanye efisien dan paralel dalam proses eksekusi. Sistem build memuat aturan dan menghitung grafik tindakan dan input hash untuk dicari di cache.
- Beberapa build: Anda dapat membuat beberapa build hermetic pada perangkat yang sama mesin, masing-masing membangun menggunakan alat dan versi yang berbeda.
- Reproduksi: Build hermetis bagus untuk pemecahan masalah karena Anda mengetahui kondisi persis yang menghasilkan build.
Mengidentifikasi non-hermetisitas
Jika Anda bersiap untuk beralih ke Bazel, migrasi akan lebih mudah jika Anda meningkatkan hermetisitas build yang ada terlebih dahulu. Beberapa sumber umum non-hermetisitas dalam build adalah:
- Pemrosesan arbitrer dalam
.mk
file - Tindakan atau alat yang membuat file secara non-deterministik, biasanya melibatkan ID build atau stempel waktu
- Biner sistem yang berbeda di semua host (seperti biner
/usr/bin
, compiler C++ sistem untuk konfigurasi otomatis aturan C++ native) - Menulis ke hierarki sumber selama build. Hal ini mencegah hierarki sumber yang sama digunakan untuk target lain. Build pertama akan menulis ke sumber yang baru, yang memperbaiki struktur pohon sumber untuk target A. Kemudian, mencoba membangun target B gagal.
Memecahkan masalah build non-hermetis
Mulai dari eksekusi lokal, masalah yang memengaruhi hit cache lokal akan mengungkapkan tindakan non-hermetis.
- Memastikan build berurutan null: Jika Anda menjalankan
make
dan mendapatkan build yang berhasil, menjalankan build lagi tidak akan mem-build ulang target apa pun. Jika Anda menjalankan setiap build langkah dua kali atau pada sistem yang berbeda, bandingkan {i>hash<i} dari isi file dan mendapatkan hasil yang berbeda, maka build tidak dapat direproduksi. - Jalankan langkah untuk men-debug hit cache lokal dari berbagai komputer klien potensial untuk memastikan bahwa Anda menangkap kasus lingkungan klien yang bocor ke dalam tindakan.
- Jalankan build dalam penampung docker yang hanya berisi hierarki sumber yang diambil dan daftar eksplisit alat host. Kerusakan build dan pesan error akan menangkap dependensi sistem implisit.
- Temukan dan perbaiki masalah hermetisitas menggunakan aturan eksekusi jarak jauh.
- Mengaktifkan sandbox yang ketat di level per tindakan, karena tindakan dalam build bisa stateful dan memengaruhi build atau output-nya.
- Aturan Workspace
memungkinkan developer menambahkan dependensi ke ruang kerja eksternal, tetapi
cukup lengkap untuk memungkinkan pemrosesan
arbitrer terjadi dalam proses. Anda dapat
mendapatkan log beberapa tindakan yang berpotensi non-hermetis dalam aturan ruang kerja Bazel dengan
menambahkan flag
--experimental_workspace_rules_log_file=PATH
ke perintah Bazel Anda.
Hermetisitas dengan Bazel
Untuk informasi lebih lanjut tentang bagaimana proyek lain telah berhasil menggunakan {i>hermetic<i} dibangun dengan Bazel, lihat pembicaraan BazelCon ini:
- Mem-build Sistem Real-time dengan Bazel (SpaceX)
- Eksekusi Jarak Jauh dan Penyimpanan dalam Cache Jarak Jauh Bazel (Uber dan TwoSigma)
- Build yang Lebih Cepat dengan Eksekusi dan Penyimpanan dalam Cache Jarak Jauh
- Menggabungkan Bazel: Build Inkremental yang Lebih Cepat
- Eksekusi Jarak Jauh vs. Eksekusi Lokal
- Meningkatkan Kegunaan Cache Jarak Jauh (IBM)
- Mem-build Mobil Otonom dengan Bazel (BMW)
- Membangun Mobil Mandiri dengan Bazel + Tanya Jawab (GM Cruise)