Hermetik

Bu sayfada hermetik yapı, hermetik yapı kullanmanın faydaları ve yapılarınızdaki hermetik olmayan davranışları tanımlama stratejileri ele alınmaktadır.

Genel bakış

Aynı giriş kaynağı kodu ve ürün yapılandırması verildiğinde hermetik derleme sistemi, derlemeyi ana makine sisteminde yapılan değişikliklerden ayırarak her zaman aynı çıktıyı döndürür.

Hermetik derlemeler, derlemeyi izole etmek için kitaplıklara ve yerel veya uzak ana makinede yüklü diğer yazılımlara karşı duyarsızdır. Derleme araçlarının derleyiciler gibi belirli sürümlerine ve kitaplıklar gibi bağımlılıklara bağlıdır. Bu, derleme ortamı dışındaki hizmetlere bağlı olmadığından derleme işlemini bağımsız hale getirir.

Hermetikliğin iki önemli yönü şunlardır:

  • İzolasyon: Hermetik derleme sistemleri, araçları kaynak kodu olarak ele alır. Araçların kopyalarını indirir, depolama alanlarını yönetirler ve yönetilen dosya ağaçlarında kullanırlar. Bu işlem, ana makine ile yerel kullanıcı arasında, dillerin yüklü sürümleri de dahil olmak üzere izolasyon oluşturur.
  • Kaynak kimliği: Hermetik derleme sistemleri, girişlerin aynılığını sağlamaya çalışır. Git gibi kod depoları, benzersiz bir karma kodla kod mutasyon kümelerini tanımlar. Hermetik derleme sistemleri, derlemenin girişindeki değişiklikleri belirlemek için bu karmayı kullanır.

Avantajları

Hermetik yapıların başlıca faydaları şunlardır:

  • Hız: Bir işlemin çıkışı önbelleğe alınabilir ve girişler değişmediği sürece işlemin tekrar çalıştırılmasına gerek yoktur.
  • Paralel yürütme: Derleme sistemi, belirtilen giriş ve çıkış için verimli ve paralel yürütmeyi hesaplamak amacıyla tüm işlemlerin bir grafiğini oluşturabilir. Derleme sistemi, kuralları yükler ve önbellekte aramak için bir işlem grafiği ile karma girişleri hesaplar.
  • Birden çok derleme: Aynı makinede her biri farklı araçlar ve sürümler kullanarak birden fazla hermetik yapı oluşturabilirsiniz.
  • Çoğaltılabilirlik: Hermetik derlemeler, derlemeyi oluşturan koşulları tam olarak bildiğinizden sorun giderme için idealdir.

Hermetik olmamayı belirleme

Bazel'e geçiş yapmaya hazırlanıyorsanız mevcut derlemelerinizin hermetikliğini önceden iyileştirirseniz taşıma işlemi daha kolay hale gelir. Derlemelerde hermetik olmayan yaygın bazı kaynaklar şunlardır:

  • .mk dosyada rastgele işleme
  • Genellikle oluşturma kimlikleri veya zaman damgaları içeren belirsiz olmayan bir şekilde dosyalar oluşturan işlemler veya araçlar
  • Ana makineler arasında farklılık gösteren sistem ikili programları (ör. /usr/bin ikili programları, mutlak yollar, yerel C++ kurallarının otomatik yapılandırması için sistem C++ derleyicileri)
  • Derleme sırasında kaynak ağacına yazma. Bu, aynı kaynak ağacın başka bir hedef için kullanılmasını engeller. İlk derleme kaynak ağaca yazar ve A hedefi için kaynak ağacı düzeltir. Bu durumda B hedefini oluşturmaya çalışmak başarısız olabilir.

Hermetik olmayan derlemelerle ilgili sorunları giderme

Yerel yürütmeden başlayarak, yerel önbellek isabetlerini etkileyen sorunlar hermetik olmayan işlemleri ortaya çıkarır.

  • Boş sıralı derlemelerden emin olun: make komutunu çalıştırır ve başarılı bir derleme elde ederseniz derlemeyi tekrar çalıştırmak hedefleri yeniden oluşturmamalıdır. Her derleme adımını iki kez veya farklı sistemlerde çalıştırır, dosya içeriklerinin karmasını karşılaştırır ve farklı sonuçlar elde ederseniz derleme yeniden oluşturulamaz.
  • İşlemlere sızan istemci ortamı durumlarını yakaladığınızdan emin olmak için çeşitli potansiyel istemci makinelerinde bulunan yerel önbellek isabetlerinde hata ayıklama adımlarını çalıştırın.
  • Seçilen kaynak ağacı ve açık ana makine araçları listesinden başka hiçbir şey içermeyen bir docker container'ında derleme yürütün. Kesintiler ve hata mesajları, dolaylı sistem bağımlılıklarını yakalar.
  • Uzaktan yürütme kurallarını kullanarak hermetik problemleri keşfedip düzeltin.
  • Derlemedeki işlemler durum bilgili olabileceği ve derlemeyi veya çıkışı etkileyebileceği için işlem başına düzeyde katı korumalı alan oluşturma özelliğini etkinleştirin.
  • Çalışma alanı kuralları, geliştiricilerin harici çalışma alanlarına bağımlılık eklemesine izin verir ancak işlem sırasında rastgele işlemlerin gerçekleşmesine izin verecek kadar zengindir. Bazel komutunuza --experimental_workspace_rules_log_file=PATH işaretini ekleyerek Bazel çalışma alanı kurallarında hermetik olmayabilecek bazı işlemlerin günlüğünü alabilirsiniz.

Bazel ile Hermeticity

Diğer projelerin Bazel ile hermetik yapıları kullanarak nasıl başarılı olduğuyla ilgili daha fazla bilgi için şu BazelCon konuşmalarına bakın: