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

Bu sayfa, uzaktan yürütme bağlamında Bazel kurallarının gereksinimlerini anlamak isteyen ve özel derleme ve test kuralları yazan Bazel kullanıcıları için hazırlanmıştır.

Uzaktan yürütme, Bazel'ın veri merkezi gibi ayrı bir platformda işlem yürütmesine imkan tanır. Bazel, uzaktan yürütme işlemi için bir gRPC protokolü kullanıyor. 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 sayfada, farklı ortam türlerinden veya platformlarından bahsederken aşağıdaki terimler kullanılmaktadır:

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

Genel bakış

Bir Bazel derlemesini uzaktan yürütme için yapılandırırken, derlemenin uzaktan hatasız bir şekilde yürütüldüğünden emin olmak için bu sayfada açıklanan yönergelere uymanız gerekir. Bunun nedeni, uzaktan yürütmenin yapısıdır. Örneğin:

  • Yalıtılmış derleme işlemleri. Derleme araçları durumu korumaz ve bağımlılıklar aralarında sızıntı yapamaz.

  • Çeşitli 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 oluşturma ve test etme kuralları uygulanırken ortaya çıkabilecek sorunlar ve bunlardan nasıl kaçınılacağı açıklanmaktadır. Ele alınması gereken konular şunlardır:

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

Bazel araç zinciri kuralı, derleme kuralına derleyiciler ve bağlayıcılar gibi hangi oluşturma araçlarının kullanılacağını ve kuralı oluşturan kişi tarafından tanımlanan parametreler kullanılarak bunların nasıl yapılandırılacağını söyleyen bir yapılandırma sağlayıcısıdır. Araç zinciri kuralı, derleme araçlarını uzaktan yürütmeyle uyumlu, öngörülebilir ve önceden yapılandırılmış bir şekilde çağırmaya olanak tanıyan derleme ve test kuralları sağlar. Örneğin, derleme araçlarını PATH, JAVA_HOME veya uzak yürütme ortamında eşdeğer değerlere (ya da hiç) ayarlanmamış diğer yerel değişkenler aracılığıyla çağırmak yerine bir araç zinciri kuralı kullanın.

Şu anda Scala, Rust ve Go için Bazel derleme ve test kuralları için araç zinciri kuralları mevcuttur. Diğer diller ve bash gibi araçlar için de yeni araç zinciri kuralları uygulanmaya devam ediyor. Kuralınızın kullandığı araç için bir araç zinciri kuralı yoksa araç zinciri kuralı oluşturmayı düşünebilirsiniz.

Örtülü bağımlılıkları yönetme

Bir derleme aracı, derleme işlemlerindeki bağımlılıklara erişebiliyorsa her uzaktan derleme işlemi diğerlerinden ayrı olarak yürütüldüğü için uzaktan yürütülen bu işlemler başarısız olur. Bazı derleme araçları, araç çağrısına açıkça dahil edilmeyen derleme işlemleri ve erişim bağımlılıklarında durumu korur. Bu durum, uzaktan gerçekleştirilen derleme işlemlerinin başarısız olmasına neden olur.

Örneğin, Bazel yerel olarak foo derlemesi için durum bilgili bir derleyiciye talimat verdiğinde derleyici, foo'nun derleme çıkışlarına yapılan referansları korur. Bazel daha sonra derleyiciye foo'ya bağlı olan bar'ı oluşturması talimatını verdiğinde (yerel yürütmede olduğu gibi), aynı derleyici örneğinin her iki eylemde de yürüttüğü sürece, işlem, DERLEME dosyasındaki derleyici çağrısına olan bağımlılığı açıkça belirtmeden başarıyla yürütülür. Ancak uzaktan yürütme senaryosunda her derleme işlemi ayrı bir derleyici örneği yürüttüğünden, derleyici durumu ve bar öğesinin foo üzerindeki örtülü bağımlılığı kaybedilir ve derleme başarısız olur.

Bu bağımlılık sorunlarının tespit edilip ortadan kaldırılmasına yardımcı olmak için Bazel 0.14.1, bağımlılıklar için uzaktan yürütmeyle aynı kısıtlamalara sahip olan yerel Docker korumalı alanını sunar. Bağımlılıkla ilgili derleme hatalarını tanımlayıp çözerek derlemenizi uzaktan yürütülmeye hazırlamak için korumalı alanı kullanın. Daha fazla bilgi için Docker Sandbox ile Bazel Uzaktan Yürütme Sorunlarını Giderme sayfasına bakın.

Platforma bağlı ikili programları yönetme

Genellikle ana makine platformunda oluşturulan bir ikili program, uyumsuz olma olasılığı bulunan bağımlılıklar nedeniyle rastgele bir uzaktan yürütme platformunda güvenli şekilde yürütülemez. Örneğin, Bazel ile sağlanan SingleJar ikili programı ana makine platformunu hedefler. Ancak uzaktan yürütme için SingleJar, uzaktan yürütme platformunu hedefleyecek şekilde kodunuzu oluşturma işleminin bir parçası olarak derlenmelidir. (Hedef seçimi mantığına bakın.)

Derlemenizin gerektirdiği derleme araçlarının ikili programlarını, yürütme platformunuzda güvenli bir şekilde çalışacaklarından emin değilseniz kaynak kodunuzla göndermeyin. Bunun yerine aşağıdakilerden birini yapın:

  • Aracın uzaktan yürütme platformu için oluşturulabilmesi amacıyla aracın kaynak kodunu gönderin veya bu koda harici olarak referans verin.

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

Yapılandırma tarzında WORKSPACE kurallarını yönetme

Bazel'in WORKSPACE kuralları, derleme için gereken araçlar ve kitaplıklar için ana makine platformunu araştırmak amacıyla kullanılabilir. Yerel derlemeler için aynı zamanda Bazel'in yürütme platformu da budur. Derleme, açık bir şekilde yerel derleme araçlarına ve yapılara bağlıysa uzaktan 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şlemlerinin gerçekleştirilmesi, ana makine platformundan farklıysa uzaktan yürütme platformuyla uyumlu olmayan ikili programlarla sonuçlanır.

  • 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. Özel olarak ana makine platformu için oluşturulan bu paketler, ana makine platformundan farklıysa uzaktan yürütme platformuyla uyumsuz olur.

  • Yerel araçlara veya yapılara sembolik bağlantı oluşturma. Ana makine platformuna yüklenmiş, WORKSPACE kurallarıyla oluşturulmuş araçların veya kitaplıkların sembolik bağlantıları, Bazel'in bunları bulamayacağı derlemenin uzaktan yürütme platformunda başarısız olmasına neden olur. Bunun yerine, sembolik araçların ve kitaplıkların Bazel'in runfiles ağacından erişilebilir olması için standart derleme işlemlerini kullanarak sembolik bağlantılar oluşturun. Harici depo dizini dışındaki dosyaları sembolik olarak hedeflemek için repository_ctx.symlink kullanmayın.

  • Ana makine platformunu kapatma. Bazel runfiles ağacının dışında dosya oluşturmaktan, ortam değişkenleri oluşturmaktan ve benzer işlemler yapmaktan kaçının. Bunlar uzaktan yürütme platformunda beklenmedik şekilde davranabilir.

Hermetik olmayan olası davranışları bulmanıza yardımcı olması için Çalışma alanı kuralları günlüğünü kullanabilirsiniz.

Bir harici bağımlılık, ana makine platformuna bağlı belirli işlemler yürütürse bu işlemleri WORKSPACE ve derleme kuralları arasında aşağıdaki gibi bölmeniz gerekir:

  • Platform denetimi ve bağımlılık sıralaması. Bu işlemler, hangi kitaplıkların yüklü olduğunu kontrol edebilen, derlenmesi gereken paketleri indirebilen ve gerekli yapıları derleme için hazırlayabilen WORKSPACE kurallarıyla yerel olarak yürütülebilir. Uzaktan yürütme için bu kurallar, ana makine platformu denetimi sırasında normalde elde edilecek bilgileri sağlamak için önceden kontrol edilmiş yapıların kullanılmasını da desteklemelidir. Ön kontrolden geçmiş yapılar, Bazel'in bağımlılıkları yerel gibi tanımlayabilmesini sağlar. Bunun için koşullu ifadeleri veya --override_repository işaretini kullanın.

  • Hedefe özgü yapılar ve platform mutasyonunu oluşturma ya da derleme. Bu işlemler, normal derleme kuralları aracılığıyla yürütülmelidir. Dış bağımlılıklar için hedefe özgü yapılar oluşturan işlemler, derleme sırasında yürütülmelidir.

Uzaktan yürütme için önceden kontrol edilmiş yapıları daha kolay oluşturmak için WORKSPACE kurallarını kullanarak oluşturulan dosyaları yayınlayabilirsiniz. Bu kuralları her bir araç zinciri kapsayıcısının içinde olmak üzere her yeni yürütme ortamında çalıştırabilir ve referans olması için kaynak deponuza uzaktan yürütme derlemenizin çıkışlarını kontrol edebilirsiniz.

Örneğin, Tensorflow'un cuda ve python için kurallarında WORKSPACE kuralları aşağıdaki BUILD files kurallarını 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 bir ortam değişkenindeki koşullu ifade, kuralın depoya kaydedilen dosyaları kullanmasına olanak tanır.

BUILD dosyaları, hem yerel olarak hem de uzaktan çalışabilen ve burada gösterildiği gibi daha önce repository_ctx.symlink aracılığıyla yapılan gerekli işlemi gerçekleştirebilen genrules olduğunu belirtiyor.