WORKSPACE Kurallarında Hermetik Olmayan Davranışları Bulma

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7,2 · 7,1 · 7,0 · 6,5

Aşağıdaki örnekte ana makine, Bazel'in çalıştığı makinedir.

Uzaktan yürütme kullanılırken gerçek derleme ve/veya test adımları ana makinede değil, uzak yürütme sistemine gönderilir. Ancak Workspace kurallarını çözmeyle ilgili adımlar ana makinede gerçekleşir. Workspace kurallarınız, yürütme sırasında kullanmak üzere ana makineyle ilgili bilgilere erişiyorsa derlemeniz, ortamlar arasındaki uyumsuzluklardan dolayı bozulabilir.

Uzaktan kumanda için Bazel kurallarını uyarlamanın bir parçası olarak yürütme aşamasındayken, bu çalışma alanı kurallarını ve düzeltebilirsiniz. Bu sayfada, sorunlu olabilecek çalışma alanını nasıl bulacağınız açıklanmaktadır. kurallarını uygulayabilirsiniz.

Hermetik olmayan kuralları bulma

Çalışma alanı kuralları, geliştiricinin harici çalışma alanlarına bağımlılık eklemesine olanak tanır ancak işlem sırasında keyfi işleme yapılmasına izin verecek kadar zengindir. Tüm ilgili komutlar yerel olarak gerçekleşir ve bir hermetik olmayan duruma yol açabilir. Genellikle, ana makineyle etkileşime izin veren repository_ctx aracılığıyla hermetik olmayan davranış tanıtılır.

Bazel 0.18'den başlayarak, hermetik olmayan potansiyel --experimental_workspace_rules_log_file=[PATH] işaretini ekleyerek, kullanmanız gerekir. Burada [PATH], günlüğün yer alacağı dosya adıdır. oluşturuldu.

Önemli noktalar:

  • Günlük, etkinlikleri yürütülürken yakalar. Önbelleğe alınan adımlar günlükte görünmez. Bu nedenle, tam sonuç almak için önce bazel clean --expunge'yi çalıştırmayı unutmayın.

  • İşlevler bazen yeniden yürütülebilir. Bu durumda, ilgili etkinlikler günlükte birden çok kez gösterilir.

  • Workspace kuralları şu anda yalnızca Starlark etkinliklerini günlüğe kaydeder.

Çalışma alanı ilk kullanıma hazırlanırken nelerin yürütüldüğünü bulmak için:

  1. bazel clean --expunge çalıştır. Bu komut, yerel önbelleğinizi temizler ve tüm başlatmanın yeniden çalıştırılmasını sağlar.

  2. Bazel komutunuza --experimental_workspace_rules_log_file=/tmp/workspacelog ekleyin ve derlemeyi çalıştırın.

    Bu işlem, WorkspaceEvent türündeki mesajları listeleyen bir ikili proto dosyası oluşturur.

  3. Bazel kaynak kodunu indirin ve şunu kullanarak Bazel klasörüne gidin: aşağıdaki komutu kullanın. workspacelog ayrıştırıcısı ile Workspace günlüğünü ayrıştırabilmek için kaynak koda ihtiyacınız vardır.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  4. Bazel kaynak kodu deposunda, çalışma alanı günlüğünün tamamını metne dönüştürün.

    bazel build src/tools/workspacelog:parser
    bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
    
  5. Çıkış oldukça ayrıntılı olabilir ve yerleşik Bazel kurallarının çıkışını içerebilir.

    Belirli kuralları çıkıştan hariç tutmak için --exclude_rule seçeneğini kullanın. Örneğin:

    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. /tmp/workspacelog.txt'ü açın ve güvenli olmayan işlemleri kontrol edin.

Günlük şunları içerir: WorkspaceEvent bir cihazda gerçekleştirilen potansiyel hermetik olmayan bazı işlemleri repository_ctx.

Hermetik olmayan olarak vurgulanan işlemler şunlardır:

  • execute: Ana makine ortamında rastgele bir komut yürütür. Şunları kontrol edin: bunlar ana makine ortamına herhangi bir bağımlılık yaratabilir.

  • download, download_and_extract: Hermetik derlemeler için sha256'ın belirtildiğinden emin olun

  • file, template: Bu kendi başına hermetik değildir ancak bir mekanizma olabilir depoya ana makine ortamına bağımlılıklar eklemek için kullanılır. Girişin nereden geldiğini ve gelmediğini anladığınızdan neler olduğuna bağlıdır.

  • os: Bu kendi başına hermetik olmasa da bağımlılıkları anlamanın kolay bir yoludur. emin olmanız gerekir. Hermetik yapı genellikle bu adı taşımaz. Kullanımınızın hermetik olup olmadığını değerlendirirken, bunun hermetik ana makinede çalışıyor olması gerekir. Ortamla ilgili ayrıntıları ana makineden almak, uzak derlemeler için genellikle iyi bir fikir değildir.

  • symlink: Bu normalde güvenlidir ancak tehlike işaretleri olup olmadığına bakın. ile sembolik bağlantılar veya mutlak bir yola göre değiştirmek ele alacağız. Sembolik bağlantı, ana makine özelliklerine göre oluşturuluyorsa bu da büyük olasılıkla sorun teşkil eder.

  • which: İşleyicilerin farklı yapılandırmalara sahip olabileceğinden, ana makineye yüklenen programları kontrol etmek genellikle sorunludur.