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

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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 gerçekleşmez, bunun yerine uzaktan yürütme sistemine gönderilir. Ancak, çalışma alanı kurallarını çözme adımları ana makinede gerçekleşir. Çalışma alanınız, yürütme sırasında kullanılmak üzere ana makineyle ilgili erişim bilgilerini kısıtlıyorsa ortamlar arasındaki uyumsuzluklar nedeniyle derlemeniz bozulabilir.

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

Hermetik olmayan kuralları bulma

Workspace kuralları, geliştiricinin harici çalışma alanlarına bağımlılıklar eklemesine olanak tanır ancak bu süreçte rastgele işleme yapılabilmesi için yeterince kapsamlıdır. İlgili tüm komutlar yerel olarak gerçekleşir ve hermetik olmayan bir kaynağın olası nedeni olabilir. Genellikle hermetik olmayan davranış, ana makineyle etkileşime izin veren repository_ctx aracılığıyla tanıtılır.

Bazel 0.18'den itibaren, Bazel komutunuza --experimental_workspace_rules_log_file=[PATH] işaretini ekleyerek 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üldükleri sırada yakalar. Bazı adımlar önbelleğe alınmışsa günlükte gösterilmez. Bu nedenle, tam sonuç almak için önceden bazel clean --expunge komutunu ç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ı başlatılırken yürütülenleri bulmak için:

  1. Koşu bazel clean --expunge. 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 koduna ihtiyacınız vardır.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
  4. Bazel kaynak kodu deposunda, çalışma alanı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 çıkış 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 uygulamasını açın ve güvenli olmayan işlemleri kontrol edin.

Günlük, repository_ctx üzerinde gerçekleştirilen, hermetik olmayan belirli işlemleri özetleyen WorkspaceEvent mesajlarından oluşur.

Potansiyel olarak hermetik olmayan işlemler aşağıda vurgulanmıştır:

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

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

  • file, template: Bu, kendi başına hermetik olmayan bir durumdur ancak ana makine ortamındaki bağımlılıkları depoya dahil etme mekanizması olabilir. Girişin nereden geldiğini ve ana makine ortamına bağlı olmadığını anladığınızdan emin olun.

  • os: Bu, kendi başına hermetik olmasa da ana makine ortamındaki bağımlılıkları elde etmenin kolay bir yoludur. Hermetik bir derleme genellikle bunu çağırmaz. Kullanımınızın hermetik olup olmadığını değerlendirirken bu işlemin çalışanlar üzerinde değil, ana makinede çalıştığını unutmayın. Ortama özgü bilgileri ana makineden almak genellikle uzak derlemeler için iyi bir fikir değildir.

  • symlink: Bu genellikle güvenlidir ancak tehlike işaretlerine dikkat edin. Deponun dışındaki veya mutlak bir yola yönelik tüm sembolik bağlantılar, uzak çalışanda sorunlara neden olur. Sembolik bağlantı, ana makine özelliklerine göre oluşturulursa bu durum da muhtemelen sorunlu olacaktır.

  • which: Çalışanların farklı yapılandırmaları olabileceğinden, ana makineye yüklenen programları kontrol etmek genellikle sorunludur.