Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama

Sorun bildirin Kaynağı göster

Bu sayfa, uzaktan yürütme bağlamında Bazel kurallarının gereksinimlerini anlamak isteyen özel derleme ve test kuralları yazan Bazel kullanıcılarına yöneliktir.

Uzaktan yürütme, Bazel'ın işlemleri veri merkezi gibi ayrı bir platformda yürütmesine olanak tanır. Bazel, uzaktan yürütme için bir gTB protokolü kullanır. Dağıtılmış bir uzaktan yürütme platformu sağlamayı amaçlayan açık kaynaklı bir proje olan bazel-buildfarm ile uzaktan yürütmeyi deneyebilirsiniz.

Bu sayfa, farklı ortam türlerini veya platformları ifade ederken aşağıdaki terminolojiyi kullanır:

  • Ana makine platformu: Bazel'ın çalıştığı platform.
  • Yürütme platformu: Bazel işlemlerinin gerçekleştiği platform.
  • Hedef platform: Derleme çıkışlarının (ve bazı işlemlerin) çalıştığı yerdir.

Genel bakış

Bir Bazel derlemesini uzaktan yürütme için yapılandırırken, derlemenin uzaktan hatasız şekilde yürütülmesini sağlamak için bu sayfada açıklanan yönergeleri uygulamanız gerekir. Bunun nedeni, uzaktan yürütmenin yapısıdır. Yani:

  • ayrılmış derleme işlemleri. Derleme araçları durumu korumaz ve bağımlılıklar bunların arasına sızmaz.

  • Çeşitliliği olan yürütme ortamları. Yerel derleme yapılandırması uzaktan yürütme ortamları için her zaman uygun değildir.

Bu sayfada, uzaktan yürütme için özel Bazel derleme ve test kuralları uygulanırken ortaya çıkabilecek sorunlar ve bunlardan nasıl kaçınılacağı açıklanmaktadır. Ele alınacak konular şunlardır:

Araç zinciri kurallarıyla derleme araçları çağırma

Bazel araç zinciri kuralı, derleme kuralına derleyiciler ve bağlayıcılar gibi oluşturmanız gereken araçları ve kuralı oluşturan kullanıcı tarafından tanımlanan parametreleri kullanarak nasıl yapılandıracağınızı bildiren bir yapılandırma sağlayıcıdır. Araç zinciri kuralları, derleme ve test kurallarının derleme araçlarını uzaktan yürütmeyle uyumlu, tahmin edilebilir ve önceden yapılandırılmış bir şekilde çağırmasına olanak tanır. Örneğin derleme araçlarını PATH, JAVA_HOME veya uzaktan yürütme ortamında eşdeğer değerlere (veya hiç) ayarlanmamış olabilecek diğer yerel değişkenlere çağırmak yerine bir araç zinciri kuralı kullanın.

Bazel derleme kuralı ve test kuralları şu anda Scala, Rust ve Go'da kullanılabilir. Yeni zincir zincir kuralları bash gibi diğer diller ve araçlar için de uygulanmaktadır. Kuralınızın kullandığı araç için bir araç zinciri kuralı yoksa araç zinciri kuralı oluşturmayı düşünebilirsiniz.

Dolaylı bağımlılıkları yönetme

Bir derleme aracı, derleme işlemlerindeki bağımlılıklara erişebiliyorsa her bir uzak derleme işlemi birbirinden ayrı olarak yürütüldüğünde, bu işlemler uzaktan yürütüldüğünde başarısız olur. Bazı derleme araçları, açık bir şekilde araç çağrısına eklenmemiş olan derleme işlemleri ve erişim bağımlılıkları genelinde durumu korur. Bu da uzaktan yürütülen derleme işlemlerinin başarısız olmasına neden olur.

Örneğin, Bazel durum bilgili bir derleyiciye yerel olarak foo derlemesi talimatı verdiğinde, derleyici, foo dilinin derleme çıktılarına yapılan referansları korur. Ardından Bazel, derleyiciyi foo öğesine bağımlı olan bar öğesine derlemesi için derlediğinde, derleyici çağrısına dahil etmek için BUILD dosyasına olan bağımlılığın açık bir şekilde belirtilmemesi durumunda, aynı derleyici örneği her iki işlemde de (yerel yürütmede normal şekilde) çalıştığı sürece işlem başarıyla gerçekleştirilir. Ancak uzak yürütme senaryosunda her derleme işlemi ayrı bir derleyici örneği yürüttüğünden, derleyici durumu ve bar'ın foo üzerindeki dolaylı bağımlılığı kaybolur ve derleme başarısız olur.

Bazel 0.14.1, bu bağımlılık sorunlarını tespit edip ortadan kaldırmaya yardımcı olmak için uzaktan yürütmeyle aynı kısıtlamalara sahip yerel Docker korumalı alanını sunar. Korumalı alan kullanarak, bağımlılığa ilişkin derleme hatalarını belirleyip gidererek derlemenizi uzaktan yürütmeye hazırlayın. Daha fazla bilgi için Docker Sandbox ile Bazel Uzaktan Yürütme Sorunlarını Giderme sayfasına bakın.

Platforma bağımlı ikili programları yönetme

Genellikle ana makine platformunda oluşturulmuş bir ikili program, uyumsuz olabilecek bağımlılıklar nedeniyle rastgele bir uzak yürütme platformunda güvenli bir şekilde yürütülemez. Örneğin, Bazel ile birlikte verilen SingleJar ikili programı ana makine platformunu hedefler. Ancak uzak yürütme için SingleJar'ın kodunuzu uzaktan yürütme platformunu hedefleyecek şekilde oluşturma işleminin bir parçası olarak derlenmesi gerekir. (Hedef seçim mantığını inceleyin.)

Yürütme platformunuzda güvenli bir şekilde çalışacaklarından emin olmadığınız sürece derlemeniz için gereken ikili derleme araçlarını kaynak kodunuzla göndermeyin. Bunun yerine aşağıdakilerden birini yapın:

  • Aracın kaynak kodunu, uzak yürütme platformu için oluşturulabilmesi amacıyla gönderin veya harici olarak belirtin.

  • Yeterince kararlıysa aracı uzaktan yürütme ortamına (örneğin, bir araç zinciri kapsayıcısı) önceden yükleyin ve derlemenizde çalıştırmak için araç zinciri kurallarını kullanın.

Yapılandırma stili WORKSPACE kurallarını yönetme

Bazel'ın WORKSPACE kuralları, derleme platformunun ihtiyaç duyduğu araçlar ve kitaplıklar için ana makine platformunu araştırmak amacıyla kullanılabilir. Bu, yerel derlemeler için de Bazel'ın yürütme platformudur. Derleme açıkça yerel derleme araçlarına ve yapılarına bağlıysa uzak yürütme platformu ana makine platformuyla aynı değilse uzaktan yürütme sırasında başarısız olur.

WORKSPACE kuralları tarafından gerçekleştirilen aşağıdaki işlemler uzaktan yürütmeyle uyumlu değildir:

  • İkili programlar oluşturma. WORKSPACE kurallarında derleme işlemleri yapıldığında ana makine platformundan farklıysa uzaktan yürütme platformuyla uyumsuz olan ikili programlar oluşur.

  • pip paket yükleniyor. WORKSPACE kuralları aracılığıyla yüklenen pip paketleri, bağımlılıklarının ana makine platformuna önceden yüklenmesini gerektirir. Ana makine platformu için özel olarak oluşturulan bu tür paketler, ana makine platformundan farklıysa uzaktan yürütme platformuyla uyumlu olmaz.

  • Yerel araçlar veya yapılarla ilgili simge oluşturma. WORKSPACE kurallarıyla oluşturulan ana makine platformuna yüklenen araç veya kitaplıkların sembolik bağlantıları, Bazel bunları bulamayacağından derlemenin uzak yürütme platformunda başarısız olmasına neden olacak. Bunun yerine, simgesel araçlara ve kitaplıklara Bazel'in runfiles ağacından erişilebilmesi için standart derleme işlemlerini kullanarak sembolik bağlantılar oluşturun. Harici depo dizininin dışındaki dosyaların hedeflenmesi için repository_ctx.symlink kullanmayın.

  • Ana makine platformunun kapatılması. Uzaktan yürütme platformunda beklenmedik şekilde davranabileceği için Bazelrunfiles ağacı dışında dosya oluşturmaktan, ortam değişkeni oluşturmaktan ve benzer işlemler yapmaktan kaçının.

Potansiyel hermetik olmayan davranışı bulmanıza yardımcı olması için Workspace kuralları günlüğü kullanabilirsiniz.

Harici bir bağımlı, ana makine platformuna bağlı belirli işlemleri yürütüyorsa bu işlemleri WORKSPACE arasında bölmeniz ve kuralları şu şekilde oluşturmanız gerekir:

  • Platform denetleme ve bağımlı numaralandırma. Bu işlemler WORKSPACE kurallarıyla yerel olarak yürütülebilir. Bu kurallar hangi kitaplıkların yüklendiğini kontrol edebilir, derlenmesi gereken paketleri indirebilir ve gerekli yapıları derleme için hazırlayabilir. Bu kuralların, uzaktan yürütme için ana makine platform incelemesi sırasında normalde elde edilecek bilgileri sağlamak amacıyla önceden işaretlenmiş yapıları kullanmayı da desteklemesi gerekir. Önceden işaretlenmiş yapılar, Bazel'ın bağımlılıkları yerelymiş gibi açıklamasına olanak tanır. Bunun için koşullu ifadeler veya --override_repository işaretini kullanın.

  • Hedefe özel yapılar ve platform mutasyonu oluşturma veya derleme. Bu işlemler normal derleme kurallarıyla yürütülmelidir. Harici bağımlılıklar için hedefe özel yapılar oluşturan işlemler, derleme sırasında yürütülmelidir.

Uzaktan yürütme amacıyla önceden işaretlenmiş yapıları daha kolay şekilde oluşturmak için WORKSPACE kurallarını kullanarak oluşturulan dosyaları yayınlayabilirsiniz. Bu kuralları her bir aracı yürütme kapsayıcısının içinde olduğu gibi her yeni yürütme ortamında çalıştırabilir ve kaynak yürütme sisteminizde oluşturulan uzak yürütme çıktılarını referans alabilirsiniz.

Örneğin, Tensorflow'un cuda ve python kuralları için WORKSPACE kuralları aşağıdaki BUILD files'ni oluşturur. Yerel yürütme için ana makine ortamı kontrol edilerek oluşturulan dosyalar kullanılır. Uzaktan yürütme için ortam değişkenindeki koşullu ifade, kuralın depoya kaydedilen dosyaları kullanmasına olanak tanır.

BUILD dosyalarında, hem yerel olarak hem de uzaktan çalışabilecek genrules beyanında bulunulur ve daha önce burada gösterildiği gibi repository_ctx.symlink aracılığıyla yapılan gerekli işlemler gerçekleştirilir.