Menemukan Perilaku Non-Hermetis dalam Aturan WORKSPACE

Laporkan masalah Lihat sumber Per malam · 7,2 · 7,1 · 7,0 · 6,5 · 6,4

Dalam contoh berikut, mesin host adalah mesin tempat Bazel berjalan.

Saat menggunakan eksekusi jarak jauh, langkah pembangunan dan/atau pengujian yang sebenarnya tidak terjadi di mesin {i>host<i}, tetapi dialihkan ke eksekusi jarak jauh sistem file. Namun, langkah-langkah yang diperlukan untuk menyelesaikan aturan ruang kerja sedang terjadi pada mesin {i>host<i}. Jika aturan ruang kerja Anda mengakses informasi tentang mesin host lain untuk digunakan selama eksekusi, build Anda kemungkinan akan rusak karena ketidakcocokan antara lingkungan.

Sebagai bagian dari penyesuaian aturan Bazel untuk kontrol jarak jauh eksekusi, Anda perlu menemukan aturan ruang kerja tersebut lalu memperbaikinya. Halaman ini menjelaskan cara menemukan ruang kerja yang berpotensi menimbulkan masalah menggunakan log Workspace.

Menemukan aturan non-hermetik

Aturan Workspace memungkinkan developer untuk menambahkan dependensi ke ruang kerja eksternal, tetapi cukup lengkap untuk memungkinkan pemrosesan arbitrer untuk terjadi dalam proses. Semua perintah terkait terjadi secara lokal dan dapat berupa sumber potensial non-hermetisitas. Biasanya perilaku non-hermetik diperkenalkan melalui repository_ctx yang memungkinkan interaksi dengan mesin {i>host<i}.

Dimulai dengan Bazel 0.18, Anda bisa mendapatkan log beberapa dengan menambahkan flag --experimental_workspace_rules_log_file=[PATH] ke perintah Bazel Anda. Di sini [PATH] adalah nama file yang akan digunakan untuk dibuat.

Hal-hal yang perlu diperhatikan:

  • log mencatat kejadian saat dieksekusi. Jika beberapa langkah di-cache, mereka tidak akan muncul di log, jadi untuk mendapatkan hasil penuh, jangan lupa menjalankan bazel clean --expunge terlebih dahulu.

  • Terkadang fungsi dapat dieksekusi kembali, dalam hal ini yang terkait yang berbeda akan muncul di log beberapa kali.

  • Aturan Workspace saat ini hanya mencatat peristiwa Starlark ke dalam log.

Untuk menemukan apa yang dieksekusi selama inisialisasi ruang kerja:

  1. Jalankan bazel clean --expunge. Perintah ini akan membersihkan {i> cache<i} lokal Anda dan repositori yang di-cache, memastikan bahwa semua inisialisasi akan dijalankan ulang.

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

    Ini menghasilkan file proto biner yang mencantumkan jenis pesan WorkspaceEvent

  3. Unduh kode sumber Bazel dan navigasikan ke folder Bazel dengan menggunakan perintah di bawah ini. Anda perlu kode sumber agar dapat mengurai Workspace dengan ID Parser workspacelog.

    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 menyertakan output dari Bazel bawaan aturan.

    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.

Catatan tersebut terdiri dari WorkspaceEvent pesan yang menguraikan tindakan non-hermetik tertentu yang berpotensi dilakukan pada repository_ctx

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

  • execute: menjalankan perintah arbitrer di lingkungan host. Periksa apakah ini dapat menimbulkan ketergantungan pada lingkungan {i>host<i}.

  • download, download_and_extract: untuk memastikan build Hermetic, pastikan bahwa sha256 ditentukan

  • file, template: ini tidak bersifat non-hermetik, tetapi mungkin merupakan mekanisme untuk memasukkan dependensi pada lingkungan {i>host<i} ke dalam repositori. Pastikan Anda memahami dari mana input itu berasal, dan bahwa input tersebut tidak tergantung pada lingkungan {i>host<i}.

  • os: ini tidak bersifat non-hermetik, tetapi cara mudah untuk mendapatkan dependensi di lingkungan {i>host<i}. Bangunan hermetik umumnya tidak akan memanggilnya. Saat mengevaluasi apakah penggunaan Anda bersifat hermetik, perlu diingat bahwa ini berjalan di {i>host<i} dan bukan pada pekerja. Mendapatkan spesifikasi lingkungan dari {i>host<i} umumnya bukan ide yang baik untuk membangun dari jarak jauh.

  • symlink: hal ini biasanya aman, tetapi perhatikan apakah ada masalah. {i>symlink<i} apa pun ke di luar repositori atau ke jalur absolut akan menyebabkan masalah pada pekerja jarak jauh. Jika symlink dibuat berdasarkan properti mesin host mungkin itu juga akan menimbulkan masalah.

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