Menemukan Perilaku Non-Hermetik di Aturan WORKSPACE

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Laporkan masalah Lihat sumber

Berikut ini, mesin host adalah mesin tempat Bazel berjalan.

Saat menggunakan eksekusi jarak jauh, langkah-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 menyelesaikan aturan ruang kerja terjadi di mesin host. Jika aturan ruang kerja Anda mengakses informasi tentang mesin host yang akan digunakan selama eksekusi, build Anda kemungkinan akan rusak karena ketidakcocokan antarlingkungan.

Sebagai bagian dari adaptasi 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 Workspace memungkinkan developer menambahkan dependensi ke ruang kerja eksternal, tetapi aturan tersebut cukup kaya untuk memungkinkan pemrosesan arbitrer terjadi dalam prosesnya. Semua perintah terkait terjadi secara lokal dan dapat menjadi sumber potensi non-hermetic. Biasanya perilaku non-hermetic diperkenalkan melalui repository_ctx yang memungkinkan interaksi dengan mesin host.

Mulai Bazel 0.18, Anda bisa mendapatkan log yang berisi beberapa tindakan yang mungkin tidak bersifat hermetik dengan menambahkan flag --experimental_workspace_rules_log_file=[PATH] ke perintah Bazel. Di sini, [PATH] adalah nama file tempat log akan dibuat.

Hal-hal yang perlu diperhatikan:

  • log menangkap peristiwa saat dieksekusi. Jika beberapa langkah disimpan dalam cache, langkah tersebut tidak akan muncul di log. Jadi, untuk mendapatkan hasil lengkap, jangan lupa untuk menjalankan bazel clean --expunge terlebih dahulu.

  • Terkadang fungsi dapat dieksekusi ulang, sehingga peristiwa terkait akan muncul di log beberapa kali.

  • Aturan Workspace saat ini hanya mencatat peristiwa Starlark.

Untuk menemukan apa yang dieksekusi selama inisialisasi ruang kerja:

  1. Jalankan bazel clean --expunge. Perintah ini akan membersihkan cache lokal Anda dan repositori yang di-cache, sehingga memastikan bahwa semua inisialisasi akan dijalankan kembali.

  2. Tambahkan --experimental_workspace_rules_log_file=/tmp/workspacelog ke perintah Bazel, lalu jalankan build.

    Tindakan ini akan menghasilkan file proto biner yang mencantumkan pesan jenis WorkspaceEvent

  3. Download kode sumber Bazel dan buka folder Bazel menggunakan perintah di bawah ini. Anda memerlukan kode sumber agar dapat menguraikan log ruang kerja dengan parse log Workspace.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  4. 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
    
  5. Outputnya 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
    
  6. Buka /tmp/workspacelog.txt dan periksa apakah ada operasi yang tidak aman.

Log ini terdiri dari pesan WorkspaceEvent yang menguraikan tindakan tertentu yang mungkin tidak bersifat hermetik yang dilakukan pada repository_ctx.

Tindakan yang telah ditandai sebagai berpotensi non-hermetic adalah sebagai berikut:

  • execute: menjalankan perintah arbitrer di lingkungan host. Periksa apakah hal ini dapat menimbulkan dependensi apa pun pada lingkungan host.

  • download, download_and_extract: untuk memastikan build hermetic, pastikan sha256 ditentukan

  • file, template: ini sendiri bukan merupakan hermetic, tetapi dapat menjadi mekanisme untuk memperkenalkan dependensi pada lingkungan host ke repositori. Pastikan Anda memahami asal input dan tidak bergantung pada lingkungan host.

  • os: ini tidak bersifat hermetik, tetapi cara mudah untuk mendapatkan dependensi pada lingkungan host. Build hermetik umumnya tidak akan memanggilnya. Saat mengevaluasi apakah penggunaan Anda bersifat hermetic, ingatlah bahwa penggunaan ini berjalan pada host, bukan pada pekerja. Mendapatkan spesifikasi lingkungan dari host umumnya bukan ide yang bagus untuk build jarak jauh.

  • symlink: ini biasanya aman, tetapi cari tanda berwarna merah. Setiap symlink ke di luar repositori atau ke jalur absolut akan menyebabkan masalah pada pekerja jarak jauh. Jika symlink dibuat berdasarkan properti mesin host, mungkin link ini juga akan bermasalah.

  • which: memeriksa program yang diinstal di host biasanya bermasalah karena pekerja mungkin memiliki konfigurasi yang berbeda.