WORKSPACE Kurallarında Hermetik Olmayan Davranış Bulma

Sorun bildirin Kaynağı göster

Aşağıdaki durumlarda ana makine, Bazel'ın ç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 uzak yürütme sistemine gönderilir. Ancak çalışma alanı kurallarını çözüme ulaştırmayla ilgili adımlar ana makinede gerçekleşir. Çalışma alanınız yürütme sırasında kullanılacak ana makine hakkındaki bilgilere erişirse derlemeniz, ortamlar arasındaki uyumsuzluklar nedeniyle bozulabilir.

Uzaktan yürütme için Bazel kurallarını 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 bulabileceğiniz açıklanmaktadır.

Hermetik olmayan kuralları bulma

Çalışma alanı kuralları, geliştiricinin harici çalışma alanlarına bağımlılık eklemesine izin verir ancak süreçte rastgele işlemeye izin verecek kadar zengindir. İlgili tüm komutlar yerel olarak gerçekleşir ve aktivist olmayan bir kaynak olabilir. Hermetik olmayan davranış, genellikle ana makine ile etkileşime izin veren repository_ctx ile başlar.

Bazel 0.18'den başlayarak, 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ğı bir dosya adıdır.

Dikkat edilmesi gereken noktalar:

  • Günlük, yürütme sırasında etkinlikleri yakalar. Önbelleğe alınan bazı adımlar günlüğe gösterilmez. Bu nedenle, tam bir sonuç elde etmek için bazel clean --expunge dosyasını ç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.

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

Çalışma alanı başlatılırken neyin yürütüldüğünü bulmak için:

  1. Çalıştır: bazel clean --expunge. Bu komut, yerel önbelleğiniz ile önbelleğe alınan veri havuzlarını 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, WorkspaceEvent türündeki 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 koduna 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 çı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çıp güvenli olmayan işlemleri kontrol edin.

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

Hermetik olmadığı belirtilen işlemler aşağıdaki gibidir:

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

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

  • file, template: Bu, kendi başına olmayan bir şey değildir ancak ana makine ortamına bağımlıları depoya ekleme mekanizması olabilir. Girişin nereden geldiğini ve ana makine ortamına bağlı olmadığından emin olun.

  • os: Bu her zaman kendi başına olmayan, ancak ana makine ortamında bağımlılıkları almanın kolay bir yoludur. Hermetik yapı genellikle buna çağrılmaz. Kullanımınızın sıra dışı olup olmadığını değerlendirirken, işçiler yerine ana makinede çalıştığını unutmayın. Ana makineden ortamla ilgili ayrıntılara sahip olmak, uzak derlemeler için genellikle iyi bir fikir değildir.

  • symlink: Bu normalde güvenlidir, ancak kırmızı işaretleri bulmaya çalışın. Deponun dışına veya mutlak yola giden herhangi bir sembolik bağlantı, uzak çalışanda sorunlara neden olur. Sembolik bağlantı ana makine makine özelliklerine göre oluşturulursa muhtemelen sorunlu da olacaktır.

  • which: Çalışanlar farklı yapılandırmalara sahip olabileceğinden, ana makinede yüklü programları kontrol etmek genellikle sorun oluşturur.