Hermetik

Laporkan masalah Lihat sumber Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

Ringkasan

Ketika diberikan 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 hermetis 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 untuk 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 hermetis menggunakan hash 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 untuk 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 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 .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 hierarki sumber yang sama 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-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 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.
  • 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.
  • 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 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 lebih lanjut tentang bagaimana proyek lain telah berhasil menggunakan {i>hermetic<i} dibangun dengan Bazel, lihat pembicaraan BazelCon ini: