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

7.3 · 7.2 · 7.1 · 7.0 · 6.5

Aşağıda, 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. 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

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, 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 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üldüğünde etkinlikleri 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ö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 ekleyin ve 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ı çı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 potansiyel olarak hermetik olmayan belirli işlemleri özetleyen WorkspaceEvent mesajlarından oluşur.

Potansiyel olarak hermetik olmayan 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ına herhangi bir bağımlılık yaratıp yaratmayacağını kontrol edin.

  • download, download_and_extract: Hermetik derlemeler sağlamak için sha256'ın 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 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 bu işlemin çalışanlarda değil, ana makinede çalıştığını göz önünde bulundurun. Uzak derlemeler için genellikle barındırıcıdan ortamla ilgili ayrıntıları almak iyi bir fikir değildir.

  • symlink: Bu normalde güvenlidir ancak tehlike işaretleri olup olmadığına bakın. 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şturulmuşsa bu da muhtemelen soruna neden olur.

  • which: İşleyicilerin farklı yapılandırmalara sahip olabileceğinden, ana makineye yüklenen programları kontrol etmek genellikle sorunludur.