Berikut ini, 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 menyesuaikan 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 menimbulkan masalah menggunakan log ruang kerja.
Menemukan aturan non-hermetik
Aturan ruang kerja memungkinkan developer menambahkan dependensi ke
ruang kerja eksternal, tetapi cukup kaya untuk memungkinkan pemrosesan arbitrer
terjadi dalam proses. 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 dari Bazel 0.18, Anda bisa mendapatkan log beberapa tindakan yang berpotensi tidak hermetik
dengan menambahkan tanda --experimental_workspace_rules_log_file=[PATH]
ke
perintah Bazel Anda. Di sini, [PATH]
adalah nama file yang akan digunakan untuk membuat log.
Hal-hal yang perlu diperhatikan:
Log mencatat peristiwa saat dijalankan. Jika beberapa langkah di-cache, langkah tersebut tidak akan muncul di log, jadi untuk mendapatkan hasil lengkap, jangan lupa jalankan
bazel clean --expunge
terlebih dahulu.Terkadang fungsi dapat dijalankan kembali, sehingga peristiwa terkait akan muncul beberapa kali di log.
Aturan Workspace saat ini hanya mencatat peristiwa Starlark.
Untuk menemukan apa yang dijalankan selama inisialisasi ruang kerja:
Jalankan
bazel clean --expunge
. Perintah ini akan menghapus cache lokal dan semua repositori yang di-cache, sehingga memastikan semua inisialisasi akan dijalankan ulang.Tambahkan
--experimental_workspace_rules_log_file=/tmp/workspacelog
ke perintah Bazel Anda dan jalankan build.Tindakan ini akan menghasilkan file proto biner yang mencantumkan pesan jenis WorkspaceEvent
Download kode sumber Bazel dan buka folder Bazel menggunakan perintah di bawah. Anda memerlukan kode sumber untuk dapat mengurai log Workspace dengan pengurai log workspace.
git clone https://github.com/bazelbuild/bazel.git
cd bazel
Di repo kode sumber Bazel, konversi seluruh log ruang kerja menjadi teks.
bazel build src/tools/workspacelog:parser
bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
Output mungkin cukup panjang dan mencakup output dari aturan Bazel bawaan.
Untuk mengecualikan aturan tertentu dari output, gunakan opsi
--exclude_rule
. Contoh:bazel build src/tools/workspacelog:parser
bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \ --exclude_rule "//external:local_config_cc" \ --exclude_rule "//external:dep" > /tmp/workspacelog.txt
Buka
/tmp/workspacelog.txt
dan periksa operasi yang tidak aman.
Log terdiri dari pesan WorkspaceEvent yang menguraikan tindakan tertentu yang berpotensi tidak hermetik yang dilakukan pada repository_ctx
.
Tindakan yang telah ditandai sebagai berpotensi non-hermetic adalah sebagai berikut:
execute
: mengeksekusi perintah arbitrer di lingkungan host. Periksa apakah hal ini dapat menimbulkan dependensi pada lingkungan host.download
,download_and_extract
: untuk memastikan build hermetik, pastikan sha256 ditentukanfile
,template
: ini sendiri tidak bersifat non-hermetik, tetapi mungkin merupakan mekanisme untuk memperkenalkan dependensi pada lingkungan host ke dalam repositori. Pastikan Anda memahami dari mana input berasal, dan input tersebut tidak bergantung pada lingkungan host.os
: ini sendiri tidak bersifat non-hermetik, tetapi merupakan cara mudah untuk mendapatkan dependensi di lingkungan host. Build hermetis umumnya tidak akan memanggil ini. Saat mengevaluasi apakah penggunaan Anda bersifat hermetik, perlu diingat bahwa hal ini berjalan di host, bukan di pekerja. Mendapatkan spesifikasi lingkungan dari host umumnya bukan ide yang baik untuk build jarak jauh.symlink
: biasanya aman, tetapi perhatikan 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, hal ini juga akan menimbulkan masalah.which
: memeriksa program yang diinstal di host biasanya bermasalah karena pekerja mungkin memiliki konfigurasi yang berbeda.