Hermetik

Laporkan masalah Lihat sumber Per malam · 7,2 · 7,1 · 7,0 · 6,5 · 6,4

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

Ringkasan

Ketika diberi 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 hermetic tidak sensitif terhadap library dan perangkat lunak lain yang diinstal pada mesin {i>host<i} lokal atau jarak jauh. Mereka bergantung pada versi tertentu dari alat build, seperti compiler, dan dependensi, seperti library. Hal ini membuat proses build menjadi mandiri karena tidak bergantung pada eksternal ke 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 Hermetic menggunakan {i>hash<i} 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 yang akan 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 yang 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 build yang ada' hermetisitas 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 sumber yang sama agar tidak 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-hermetik

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

  • Pastikan build berurutan null: Jika Anda menjalankan make dan mendapatkan build yang berhasil, menjalankan build kembali seharusnya tidak membangun kembali 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.
  • Menjalankan build dalam container Docker yang hanya berisi dan daftar eksplisit dari alat {i>host<i}. Membuat kerusakan dan pesan {i>error<i} akan menangkap dependensi sistem yang implisit.
  • Temukan dan perbaiki masalah hermetikitas 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 dari beberapa tindakan yang berpotensi non-hermetik dalam aturan ruang kerja Bazel dengan menambahkan tanda --experimental_workspace_rules_log_file=PATH hingga 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: