Hermetik

Laporkan masalah Lihat sumber

Halaman ini membahas hermeticity, manfaat menggunakan build hermetic, dan strategi untuk mengidentifikasi perilaku non-hermetic di build Anda.

Ringkasan

Jika diberi kode sumber input dan konfigurasi produk yang sama, sistem build hermetic akan selalu menampilkan output yang sama dengan mengisolasi build dari perubahan pada sistem host.

Untuk mengisolasi build, build hermetic tidak sensitif terhadap library dan software lain yang diinstal pada mesin host lokal atau jarak jauh. Metrik ini bergantung pada versi alat build tertentu, seperti compiler, dan dependensi, seperti library. Hal ini membuat proses build menjadi 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 mendownload salinan alat, mengelola penyimpanannya, dan menggunakannya di dalam hierarki file terkelola. Tindakan ini menciptakan isolasi antara mesin host dan pengguna lokal, termasuk versi bahasa yang diinstal.
  • Identitas sumber: Sistem build Hermetic mencoba memastikan kesamaan input. Repositori kode, seperti Git, mengidentifikasi kumpulan mutasi kode dengan kode hash unik. Sistem build hermetic menggunakan hash ini untuk mengidentifikasi perubahan pada input build.

Manfaat

Manfaat utama build hermetic adalah:

  • Speed: Output dari sebuah tindakan dapat di-cache, dan tindakan tidak perlu dijalankan lagi kecuali jika inputnya 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 serta input hash untuk dicari di cache.
  • Beberapa build: Anda dapat membuat beberapa build hermetic di mesin yang sama, masing-masing build menggunakan alat dan versi yang berbeda.
  • Reproduksi: Build hermetik cocok 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 non-hermetisitas pada 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 berbagai 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 penggunaan hierarki sumber yang sama untuk target lain. Build pertama akan menulis ke hierarki sumber, yang memperbaiki hierarki sumber untuk target A. Kemudian, mencoba membangun target B mungkin akan gagal.

Memecahkan masalah build non-hermetik

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

  • Pastikan build berurutan null: Jika Anda menjalankan make dan mendapatkan build yang berhasil, menjalankan kembali build tidak boleh mem-build 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 tersebut tidak dapat direproduksi.
  • Jalankan langkah-langkah untuk men-debug hit cache lokal dari berbagai mesin klien potensial untuk memastikan Anda mendeteksi kasus lingkungan klien yang bocor ke dalam tindakan tersebut.
  • Jalankan build dalam container Docker yang hanya berisi hierarki sumber yang telah diperiksa 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 yang ketat pada 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 lengkap untuk memungkinkan pemrosesan arbitrer terjadi dalam proses. Anda bisa mendapatkan log dari beberapa tindakan yang berpotensi non-hermetik dalam aturan ruang kerja Bazel dengan menambahkan flag --experimental_workspace_rules_log_file=PATH ke perintah Bazel Anda.

Hermetisitas dengan Bazel

Untuk mengetahui informasi selengkapnya tentang cara project lain meraih sukses menggunakan build hermetic dengan Bazel, lihat diskusi BazelCon berikut: