Hermetik

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 hermetik akan selalu menampilkan output yang sama dengan mengisolasi build dari perubahan pada sistem host.

Untuk mengisolasi build, build hermetik 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 ke lingkungan build.

Dua aspek penting hermetisitas adalah:

  • Isolasi: Sistem build hermetik memperlakukan alat sebagai kode sumber. Mereka mendownload salinan alat dan mengelola penyimpanan serta penggunaannya di dalam hierarki file terkelola. Hal ini menciptakan isolasi antara mesin host dan pengguna lokal, termasuk versi bahasa yang diinstal.
  • Identitas sumber: Sistem build hermetik mencoba memastikan kesamaan input. Repositori kode, seperti Git, mengidentifikasi kumpulan mutasi kode dengan kode hash unik. Sistem build hermetik menggunakan hash ini untuk mengidentifikasi perubahan pada input build.

Manfaat

Manfaat utama build hermetik 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 membuat beberapa build hermetik di mesin yang sama, dengan setiap build menggunakan alat dan versi yang berbeda.
  • Reproduksibilitas: Build hermetis bagus untuk memecahkan 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 sebelumnya. 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 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 pohon sumber yang sama digunakan untuk target lain. Build pertama menulis ke pohon sumber, memperbaiki pohon sumber untuk target A. Kemudian, mencoba membangun target B dapat gagal.

Memecahkan masalah build non-hermetik

Dimulai dengan eksekusi lokal, masalah yang memengaruhi hit cache lokal mengungkapkan tindakan non-hermetik.

  • Memastikan build berurutan null: Jika Anda menjalankan make dan mendapatkan build yang berhasil, menjalankan build lagi tidak akan membangun ulang target apa pun. Jika Anda menjalankan setiap langkah build dua kali atau di sistem yang berbeda, membandingkan hash konten file, dan mendapatkan hasil yang berbeda, build tidak dapat direproduksi.
  • Jalankan langkah-langkah untuk men-debug hit cache lokal dari berbagai potensi komputer klien untuk memastikan Anda menangkap kasus lingkungan klien yang bocor ke dalam tindakan.
  • Jalankan build dalam container docker yang hanya berisi pohon sumber yang di-checkout 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 sandbox ketat di tingkat per tindakan, karena tindakan dalam build dapat bersifat stateful dan memengaruhi build atau output.
  • Aturan Workspace memungkinkan developer menambahkan dependensi ke ruang kerja eksternal, tetapi cukup kaya untuk memungkinkan pemrosesan arbitrer terjadi dalam proses. Anda dapat mendapatkan log beberapa tindakan yang berpotensi tidak hermetik dalam aturan ruang kerja Bazel dengan menambahkan tanda --experimental_workspace_rules_log_file=PATH ke perintah Bazel Anda.

Hermetisitas dengan Bazel

Untuk mengetahui informasi selengkapnya tentang keberhasilan project lain menggunakan build tertutup dengan Bazel, lihat video BazelCon berikut: