Berikut ini, mesin host adalah mesin tempat Bazel berjalan.
Saat menggunakan eksekusi jarak jauh, langkah build dan/atau pengujian yang sebenarnya tidak terjadi di mesin host, tetapi dikirim ke sistem eksekusi jarak jauh. Namun, langkah-langkah yang terlibat dalam me-resolve 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 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-hermetis
diperkenalkan melalui
repository_ctx
yang memungkinkan interaksi
dengan mesin host.
Mulai dari Bazel 0.18, Anda bisa mendapatkan log beberapa tindakan yang berpotensi tidak hermetis
dengan menambahkan flag --experimental_workspace_rules_log_file=[PATH]
ke
perintah Bazel Anda. Di sini, [PATH]
adalah nama file tempat log akan
dibuat.
Hal-hal yang perlu diperhatikan:
log akan merekam peristiwa saat dieksekusi. Jika beberapa langkah disimpan dalam cache, langkah tersebut tidak akan muncul dalam log. Jadi, untuk mendapatkan hasil lengkap, jangan lupa untuk menjalankan
bazel clean --expunge
terlebih dahulu.Terkadang fungsi mungkin dijalankan kembali, dalam hal ini peristiwa terkait akan muncul dalam log beberapa kali.
Aturan Workspace saat ini hanya mencatat peristiwa Starlark ke dalam log.
Untuk menemukan apa yang dieksekusi selama inisialisasi ruang kerja:
Jalankan
bazel clean --expunge
. Perintah ini akan membersihkan cache lokal dan repositori yang di-cache, memastikan bahwa 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 dengan menggunakan perintah di bawah ini. Anda memerlukan kode sumber agar dapat mengurai log ruang kerja dengan Parser workspacelog.
git clone https://github.com/bazelbuild/bazel.git
cd bazel
Di repo kode sumber Bazel, konversikan 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
Outputnya mungkin cukup panjang dan menyertakan 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 ini terdiri dari
pesan WorkspaceEvent
yang menguraikan tindakan tertentu yang berpotensi non-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 ini dapat menyebabkan dependensi pada lingkungan host.download
,download_and_extract
: untuk memastikan build hermetis, pastikan sha256 ditentukanfile
,template
: hal ini bukan non-hermetis, tetapi mungkin merupakan mekanisme untuk memasukkan dependensi pada lingkungan host ke dalam repositori. Pastikan Anda memahami asal input dan tidak bergantung pada lingkungan host.os
: ini bukan non-hermetis, tetapi cara mudah untuk mendapatkan dependensi di lingkungan host. Build hermetis biasanya tidak akan memanggil ini. Saat mengevaluasi apakah penggunaan Anda bersifat hermetis, perlu diingat bahwa penggunaan ini berjalan di host, bukan di pekerja. Mendapatkan detail lingkungan dari host umumnya bukan ide yang baik untuk build jarak jauh.symlink
: hal ini biasanya aman, tetapi periksa apakah ada masalah. Symlink apa pun yang berada di luar repositori atau ke jalur absolut akan menyebabkan masalah pada pekerja jarak jauh. Jika symlink dibuat berdasarkan properti mesin host, symlink mungkin juga akan menimbulkan masalah.which
: memeriksa program yang diinstal di host biasanya bermasalah karena pekerja mungkin memiliki konfigurasi yang berbeda.