Hermetik

Laporkan masalah Lihat sumber

Halaman ini mencakup hermetik, 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 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. Library tersebut bergantung pada versi alat build tertentu, seperti compiler, dan dependensi, seperti library. Hal ini membuat proses build mandiri karena tidak bergantung pada layanan di luar lingkungan build.

Dua aspek penting hermetik adalah

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

Keunggulan

Manfaat utama build hermetic 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 dari semua tindakan untuk menghitung eksekusi yang efisien dan paralel. Sistem build memuat aturan dan menghitung grafik tindakan dan input hash untuk mencari di cache.
  • Beberapa build: Anda dapat mem-build beberapa build hermetik di mesin yang sama, masing-masing build menggunakan alat dan versi yang berbeda.
  • Produktivitas: Build hermetic berguna untuk memecahkan masalah karena Anda mengetahui kondisi persis yang menghasilkan build.

Mengidentifikasi non-hermeticity

Jika Anda bersiap untuk beralih ke Bazel, migrasi akan lebih mudah jika Anda meningkatkan Hermeticity build yang ada sebelumnya. Beberapa sumber umum non-hermeticity dalam build adalah:

  • Pemrosesan arbitrer dalam .mk file
  • Tindakan atau alat yang membuat file secara tidak 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 struktur sumber selama proses build. Hal ini mencegah pohon sumber yang sama digunakan untuk target lain. Build pertama menulis ke hierarki sumber, yang memperbaiki struktur sumber untuk target A. Selanjutnya, upaya untuk mem-build target B mungkin gagal.

Memecahkan masalah build non-hermetic

Mulai dari eksekusi lokal, masalah yang memengaruhi hit cache lokal akan menunjukkan tindakan non-hermetic.

  • Pastikan 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 pada sistem yang berbeda, bandingkan hash konten file dan dapatkan 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 mendeteksi kasus lingkungan klien yang bocor ke dalam tindakan.
  • Jalankan build dalam container docker yang tidak berisi apa pun selain hierarki sumber yang diperiksa dan daftar eksplisit alat host. Pesan error dan kerusakan build akan menangkap dependensi sistem implisit.
  • Menemukan dan memperbaiki masalah hermeticity menggunakan aturan eksekusi jarak jauh.
  • Mengaktifkan sandbox yang 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 aturan tersebut menyediakan izin yang cukup untuk memungkinkan pemrosesan arbitrer terjadi dalam proses. Anda bisa mendapatkan log dari beberapa tindakan yang kemungkinan non-hermetik di aturan ruang kerja Bazel dengan menambahkan flag --experimental_workspace_rules_log_file=PATH ke perintah Bazel Anda.

Hermetik dengan Bazel

Untuk mengetahui informasi selengkapnya tentang cara project lain menggunakan build hermetic dengan Bazel, lihat pembahasan BazelCon ini: