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

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

Uzaktan yürütme kullanıldığında, gerçek derleme ve/veya test adımları ana makinede gerçekleşmez, bunun yerine uzaktan yürütme sistemine gönderilir. Bununla birlikte, çalışma alanı kurallarını çözmeyle ilgili adımlar ana makinede gerçekleşir. Çalışma alanı kurallarınız, yürütme sırasında kullanmak üzere ana makineyle ilgili bilgilere erişirse derlemeniz büyük olasılıkla ortamlar arasındaki uyumsuzluklar nedeniyle bozulabilir.

Uzaktan yürütme için Bazel kurallarını uyarlamanın bir parçası olarak, bu tür çalışma alanı kurallarını bulmanız ve düzeltmeniz gerekir. Bu sayfada, Workspace günlüğünü kullanarak sorunlu olabilecek çalışma alanı kurallarının nasıl bulunacağı 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ç sırasında rastgele işlemlerin gerçekleşmesine imkan tanıyacak kadar zengindir. İlgili tüm komutlar yerel olarak gerçekleşir ve hermetik olmama potansiyel bir kaynağı olabilir. Genellikle hermetik olmayan davranış, ana makineyle etkileşime izin veren repository_ctx üzerinden sağlanır.

Bazel 0.18'den itibaren Bazel komutunuza --experimental_workspace_rules_log_file=[PATH] işaretini ekleyerek hermetik olmayabilecek 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ükçe yakalar. Önbelleğe alınan bazı adımlar günlükte görünmez. Dolayısıyla, tam bir sonuç almak için bazel clean --expunge işlemini önceden ç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 kaydediyor.

Çalışma alanı başlatma sırasında yürütülenleri bulmak için:

  1. bazel clean --expunge komutunu çalıştırın. Bu komut, yerel önbelleğinizi ve önbelleğe alınan 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 ekleyip derlemeyi çalıştırın.

    Bu işlem, 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. Workspace 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. Çıktı oldukça ayrıntılı olabilir ve yerleşik Bazel kurallarından alınan çıktı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, bir repository_ctx üzerinde gerçekleştirilen hermetik olmayan bazı işlemleri özetleyen WorkspaceEvent mesajlarından oluşur.

Hermetik olmayabilecek olarak vurgulanan işlemler aşağıda belirtilmiştir:

  • execute: Ana makine ortamında rastgele bir komut yürütür. Bunların ana makine ortamında herhangi bir bağımlılık teşkil edip etmediğini kontrol edin.

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

  • file, template: Bu kendi başına hermetik değildir ama ana makine ortamına bağımlılıkları depoya sokmak için kullanılan 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 değildir ancak ana makine ortamına bağımlılıkları almanın kolay bir yoludur. Hermetik bir yapıda buna genellikle bir ad verilmez. Kullanımınızın hermetik olup olmadığını değerlendirirken, bunun çalışanlarda değil ana makinede çalıştığını unutmayın. Ana makineden ortam özelliklerini almak, uzaktan derlemeler için genellikle iyi bir fikir değildir.

  • symlink: Bu yöntem normalde güvenlidir ancak tehlike işaretlerine dikkat edin. Deponun dışına veya mutlak bir yola yönlendiren sembolik bağlantılar uzaktan çalışanda sorunlara neden olur. Sembolik bağlantı, ana makinenin özelliklerine göre oluşturulursa bu da büyük olasılıkla sorunlu olacaktır.

  • which: Çalışanlar farklı yapılandırmalara sahip olabileceğinden, ana makinede yüklü programların kontrol edilmesi genellikle sorun yaratır.