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

Sorun bildir Kaynağı görüntüleyin 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.

Bazel kurallarını uzaktan yürütme için uyarlama kapsamında bu tür Workspace kurallarını bulup düzeltmeniz gerekir. Bu sayfada, çalışma alanı günlüğünü kullanarak soruna neden olabilecek çalışma alanı kurallarını nasıl bulacağınız açıklanmaktadır.

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. İlgili tüm komutlar yerel olarak gerçekleşir ve hermetik olmayan bir kaynak olabilir. Genellikle, ana makineyle etkileşime izin veren repository_ctx aracılığıyla hermetik olmayan davranış tanıtılır.

Bazel 0.18'den itibaren, Bazel komutunuza --experimental_workspace_rules_log_file=[PATH] işaretini ekleyerek potansiyel olarak hermetik olmayan bazı işlemlerin günlüğünü alabilirsiniz. Burada [PATH], günlüğün oluşturulacağı dosya adıdır.

Ö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.

  • Bazen işlevler 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ın. Bu komut, yerel önbelleğinizi ve önbelleğe alınmış tüm depoları temizleyerek tüm başlatma işlemlerinin 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 aşağıdaki komutu kullanarak Bazel klasörüne gidin. 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 kod 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ından alınan çıkışları içerebilir.

    Belirli kuralları çıktıdan 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, repository_ctx üzerinde gerçekleştirilen ve hermetik olmayan olabilecek belirli işlemleri özetleyen WorkspaceEvent mesajlarından oluşur.

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

  • execute: Ana makine ortamında rastgele bir komut yürütür. Bunların, barındırma ortamında bağımlılık oluşturup oluşturmadığını kontrol edin.

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

  • file, template: Bu durum, kendi başına hermetik değildir ancak barındırma ortamına bağımlılık eklemek için bir mekanizma olabilir. Girişin nereden geldiğini ve barındırma ortamına bağlı olmadığını anladığınızdan emin olun.

  • os: Bu yöntem, hermetik değildir ancak barındırma ortamında bağımlılık elde etmenin kolay bir yoludur. Hermetik yapı genellikle bu adı taşımaz. Kullanımınızın hermetik olup olmadığını değerlendirirken bunun çalışanlarda değil, ana makinede çalıştığını unutmayın. Uzak derlemeler için genellikle barındırıcıdan ortamla ilgili ayrıntıları almak iyi bir fikir değildir.

  • symlink: Bu genellikle güvenlidir ancak dikkat edilmesi gereken noktalar olabilir. Deponun dışına veya mutlak bir yola yönlendiren herhangi bir sembolik bağlantılar, uzaktan çalışanda sorunlara neden olur. Simge bağlantısı, ana makine özelliklerine göre oluşturuluyorsa muhtemelen sorunlu olur.

  • which: Ana makinede yüklü programların kontrol edilmesi, çalışanların farklı yapılandırmalara sahip olabileceği için genellikle sorunlu olur.