Menemukan Perilaku Non-Hermetis dalam Aturan WORKSPACE

Di contoh berikut, mesin {i>host<i} adalah komputer tempat Bazel dijalankan.

Saat menggunakan eksekusi jarak jauh, langkah build dan/atau pengujian yang sebenarnya tidak terjadi pada mesin host, tetapi akan dikirim ke sistem eksekusi jarak jauh. Namun, langkah-langkah yang terlibat dalam penyelesaian aturan ruang kerja terjadi di mesin host. Jika aturan ruang kerja Anda mengakses informasi tentang mesin host untuk digunakan selama eksekusi, build Anda mungkin rusak karena ketidaksesuaian antar-lingkungan.

Sebagai bagian dari menyesuaikan aturan Bazel untuk eksekusi jarak jauh, Anda harus 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 lengkap untuk memungkinkan pemrosesan arbitrer terjadi dalam prosesnya. 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-hermetic dengan menambahkan flag --experimental_workspace_rules_log_file=[PATH] ke perintah Bazel. Di sini, [PATH] adalah nama file yang digunakan untuk membuat log.

Hal-hal yang perlu diperhatikan:

  • log menangkap kejadian saat dijalankan. Jika beberapa langkah di-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 dijalankan kembali, sehingga peristiwa terkait akan muncul di log beberapa kali.

  • Aturan Workspace saat ini hanya mencatat peristiwa Starlark.

Untuk menemukan apa yang dijalankan selama inisialisasi ruang kerja:

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

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

    Tindakan ini 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 mengurai log ruang kerja dengan parselog workspace.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  4. Di repositori kode sumber Bazel, konversikan seluruh log Workspace 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 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
    
  6. Buka /tmp/workspacelog.txt dan periksa operasi yang tidak aman.

Log ini terdiri dari pesan WorkspaceEvent yang menguraikan tindakan tertentu yang berpotensi non-hermetic yang dilakukan di repository_ctx.

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

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

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

  • file, template: variabel ini tidak non-hermetic, tetapi dapat berupa mekanisme untuk memasukkan dependensi pada lingkungan host ke dalam repositori. Pastikan Anda memahami asal input, dan tidak bergantung pada lingkungan host.

  • os: library ini bukanlah non-hermetic, tetapi cara mudah untuk mendapatkan dependensi pada lingkungan host. Build yang hermetis umumnya tidak akan menyebutnya. Saat mengevaluasi apakah penggunaan Anda bersifat hermetis, perlu diingat bahwa proses ini berjalan di host, bukan di pekerja. Mendapatkan spesifikasi lingkungan dari host umumnya bukan ide yang bagus untuk build jarak jauh.

  • symlink: ini biasanya aman, tetapi cari tanda merah. Setiap symlink ke luar repositori atau ke jalur absolut akan menyebabkan masalah pada pekerja jarak jauh. Jika symlink dibuat berdasarkan properti mesin {i>host<i}, mungkin hal itu juga akan bermasalah.

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