Halaman ini membahas hermetisitas, manfaat penggunaan build hermetis, dan strategi untuk mengidentifikasi perilaku non-hermetis dalam build Anda.
Ringkasan
Jika diberi kode sumber input dan konfigurasi produk yang sama, sistem build hermetis selalu menampilkan output yang sama dengan mengisolasi build dari perubahan pada sistem host.
Untuk mengisolasi build, build hermetis tidak sensitif terhadap library dan software lain yang diinstal di komputer host lokal atau jarak jauh. Alat ini bergantung pada versi alat build tertentu, 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 hermetisitas adalah:
- Isolasi: Sistem build hermetis memperlakukan alat sebagai kode sumber. Alat ini mendownload salinan alat dan mengelola penyimpanan serta penggunaannya di dalam hierarki file yang dikelola. Hal ini menciptakan isolasi antara mesin host dan pengguna lokal, termasuk versi bahasa yang diinstal.
- Identitas sumber: Sistem build hermetis 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 hermetis adalah:
- Kecepatan: Output tindakan dapat di-cache, dan tindakan tidak perlu dijalankan lagi kecuali jika input berubah.
- Eksekusi paralel: Untuk input dan output tertentu, sistem build dapat membuat grafik semua tindakan untuk menghitung eksekusi yang efisien dan paralel. Sistem build memuat aturan dan menghitung grafik tindakan dan input hash untuk dicari di cache.
- Beberapa build: Anda dapat mem-build beberapa build hermetis di mesin yang sama, setiap build 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 file
.mk
- Tindakan atau alat yang membuat file secara non-deterministik, biasanya melibatkan ID build atau stempel waktu
- Biner sistem yang berbeda di seluruh host (seperti biner
/usr/bin
, jalur absolut, 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 menulis ke hierarki sumber, memperbaiki hierarki sumber untuk target A. Kemudian, mencoba mem-build target B mungkin 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 langkah build dua kali atau di sistem yang berbeda, bandingkan hash konten file dan mendapatkan hasil yang berbeda, build tidak dapat direproduksi. - Jalankan langkah-langkah untuk men-debug hit cache lokal dari berbagai mesin klien potensial untuk memastikan bahwa Anda menangkap kasus kebocoran lingkungan klien 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.
- Aktifkan sandboxing ketat di tingkat per tindakan, karena tindakan dalam build dapat bersifat stateful dan memengaruhi build atau output.
- Aturan ruang kerja
memungkinkan developer menambahkan dependensi ke ruang kerja eksternal, tetapi aturan tersebut
cukup kaya 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 selengkapnya tentang cara project lain berhasil menggunakan build hermetis dengan Bazel, lihat presentasi 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 Penyimpanan dalam Cache Jarak Jauh (IBM)
- Mem-build Mobil Otonom dengan Bazel (BMW)
- Mem-build Mobil Otonom dengan Bazel + Tanya Jawab (GM Cruise)