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

Sorun bildirin Kaynağı göster

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ın çözümlenmesi için gereken adımlar ana makinede gerçekleşir. Çalışma alanı kurallarınız, yürütme sırasında kullanılmak üzere ana makine hakkındaki bilgilere erişiyorsa derlemeniz ortamlar arasındaki uyumsuzluklar nedeniyle bozulabilir.

Bazel kurallarını uzaktan yürütme için uyarlama kapsamında, bu ç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ın nasıl bulunacağı açıklanmaktadır.

Hermetik olmayan kuralları bulma

Workspace kuralları, geliştiricinin harici çalışma alanlarına bağımlılık eklemesine olanak tanır ancak süreçte rastgele işlemenin gerçekleşmesine izin verecek kadar zengindirler. İlgili tüm komutlar yerel olarak gerçekleşir ve hermetik olmayan durumun potansiyel bir kaynağı olabilir. Genellikle hermetik olmayan davranış, ana makineyle etkileşime izin veren repository_ctx üzerinden ortaya çıkar.

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, yürütülen etkinlikleri yakalar. Önbelleğe alınan bazı adımlar günlükte görünmez. Bu nedenle, tam sonuç elde etmek için bazel clean --expunge öğesini çalıştırmayı unutmayın.

  • Bazen işlevler yeniden yürütülebilir. Bu durumda, ilgili etkinlikler günlükte birden çok kez görünür.

  • Çalışma alanı 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 ve önbelleğe alınmış depoları temizleyerek tüm başlatmanın yeniden çalıştırılmasını sağlar.

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

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

  3. Bazel kaynak kodunu indirin ve aşağıdaki komutu kullanarak Bazel klasörüne gidin. Çalışma alanı günlüğünü workspacelog ayrıştırıcı ile 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ından alınan çıkışları 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 potansiyel olarak hermetik olmayan belirli işlemleri özetleyen WorkspaceEvent mesajlarından oluşur.

Potansiyel olarak hermetik olmayan olarak vurgulanan işlemler şunlardır:

  • execute: Ana makine ortamında rastgele bir komut yürütür. Bunların ana makine ortamına herhangi bir bağımlılık yaratıp yaratmayacağını kontrol edin.

  • download, download_and_extract: Hermetik derlemeler için sha256 değerinin belirtildiğinden emin olun.

  • file, template: Bu kendi başına hermetik olmasa da ana makine ortamına bağımlılıkları depoya ekleyen bir mekanizma 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ında bağımlılıkları almanın kolay bir yoludur. Hermetik yapı genellikle bu adı taşımaz. Kullanımınızın hermetik olup olmadığını değerlendirirken bu işlemin çalışanlarda değil, ana makinede çalıştığını göz önünde bulundurun. Ana makineden ortamla ilgili ayrıntıları almak, uzaktan derlemeler için genellikle iyi bir fikir değildir.

  • symlink: Bu normalde güvenlidir ancak tehlike işaretleri olup olmadığına bakın. Deponun dışına veya mutlak bir yola yönlendiren herhangi bir sembolik bağlantılar, uzaktan çalışanda sorunlara neden olur. Sembolik bağlantı, ana makine özelliklerine göre oluşturulmuşsa bu da muhtemelen soruna neden 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.