Di bagian berikut, mesin host adalah mesin tempat Bazel berjalan.
Saat menggunakan eksekusi jarak jauh, langkah-langkah build dan/atau pengujian sebenarnya tidak terjadi di mesin host, tetapi dikirim ke sistem eksekusi jarak jauh. Namun, langkah-langkah yang terlibat dalam menyelesaikan aturan ruang kerja terjadi di mesin host. Jika aturan ruang kerja Anda mengakses informasi tentang mesin host untuk digunakan selama eksekusi, build Anda kemungkinan akan rusak karena ketidakcocokan antara lingkungan.
Sebagai bagian dari penyesuaian aturan Bazel untuk eksekusi jarak jauh, Anda perlu menemukan aturan ruang kerja tersebut dan memperbaikinya. Halaman ini menjelaskan cara menemukan aturan ruang kerja yang berpotensi bermasalah menggunakan log ruang kerja.
Menemukan aturan non-hermetik
Aturan ruang kerja memungkinkan developer menambahkan dependensi ke
ruang kerja eksternal, tetapi aturan tersebut cukup kaya untuk memungkinkan pemrosesan arbitrer terjadi dalam proses tersebut. Semua perintah terkait terjadi secara lokal dan dapat menjadi sumber potensial non-hermetisitas. Biasanya perilaku non-hermetik diperkenalkan melalui
repository_ctx yang memungkinkan interaksi
dengan mesin host.
Mulai Bazel 0.18, Anda bisa mendapatkan log beberapa tindakan yang berpotensi non-hermetik dengan menambahkan flag --experimental_workspace_rules_log_file=[PATH] ke perintah Bazel. [PATH] di sini adalah nama file tempat log akan dibuat.
Hal-hal yang perlu diperhatikan:
log akan merekam peristiwa saat dieksekusi. Jika beberapa langkah di-cache, langkah tersebut tidak akan muncul di log. Jadi, untuk mendapatkan hasil lengkap, jangan lupa menjalankan
bazel clean --expungeterlebih dahulu.Terkadang fungsi dapat dieksekusi ulang, dan dalam hal ini, peristiwa terkait akan muncul di log beberapa kali.
Aturan ruang kerja saat ini hanya mencatat peristiwa Starlark.
Untuk menemukan apa yang dieksekusi selama inisialisasi ruang kerja:
Jalankan
bazel clean --expunge. Perintah ini akan membersihkan cache lokal dan repositori yang di-cache, sehingga memastikan semua inisialisasi akan dijalankan ulang.Tambahkan
--experimental_workspace_rules_log_file=/tmp/workspacelogke perintah Bazel dan jalankan build.Tindakan ini akan menghasilkan file proto biner yang mencantumkan pesan berjenis WorkspaceEvent
Download kode sumber Bazel dan buka folder Bazel menggunakan perintah di bawah. Anda memerlukan kode sumber agar dapat mengurai log ruang kerja dengan pengurai workspacelog.
git clone https://github.com/bazelbuild/bazel.gitcd bazelDi repo kode sumber Bazel, konversi seluruh log ruang kerja ke teks.
bazel build src/tools/workspacelog:parserbazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txtOutput mungkin cukup verbose dan menyertakan output dari aturan Bazel bawaan.
Untuk mengecualikan aturan tertentu dari output, gunakan opsi
--exclude_rule. Contoh:bazel build src/tools/workspacelog:parserbazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \ --exclude_rule "//external:local_config_cc" \ --exclude_rule "//external:dep" > /tmp/workspacelog.txtBuka
/tmp/workspacelog.txtdan periksa operasi yang tidak aman.
Log terdiri dari
WorkspaceEvent
pesan yang menguraikan tindakan tertentu yang berpotensi non-hermetik yang dilakukan pada
repository_ctx.
Tindakan yang telah ditandai sebagai berpotensi non-hermetik adalah sebagai berikut:
execute: menjalankan perintah arbitrer di lingkungan host. Periksa apakah perintah ini dapat memperkenalkan dependensi apa pun di lingkungan host.download,download_and_extract: untuk memastikan build hermetik, pastikan sha256 ditentukanfile,template: tindakan ini tidak non-hermetik dengan sendirinya, tetapi dapat menjadi mekanisme untuk memperkenalkan dependensi di lingkungan host ke dalam repositori. Pastikan Anda memahami asal input, dan input tersebut tidak bergantung pada lingkungan host.os: tindakan ini tidak non-hermetik dengan sendirinya, tetapi merupakan cara mudah untuk mendapatkan dependensi di lingkungan host. Build hermetik umumnya tidak akan memanggilnya. Saat mengevaluasi apakah penggunaan Anda hermetik, perlu diingat bahwa penggunaan ini berjalan di host, bukan di pekerja. Mendapatkan spesifikasi lingkungan dari host umumnya bukan ide yang baik untuk build jarak jauh.symlink: tindakan ini biasanya aman, tetapi cari tanda bahaya. Setiap symlink ke luar repositori atau ke jalur absolut akan menyebabkan masalah pada pekerja jarak jauh. Jika symlink dibuat berdasarkan properti mesin host, symlink tersebut mungkin juga akan bermasalah.which: memeriksa program yang diinstal di host biasanya bermasalah karena pekerja mungkin memiliki konfigurasi yang berbeda.