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

Sorun bildirin Kaynağı göster

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

Uzaktan yürütme, Bazel'in işlemleri veri merkezi gibi ayrı bir platformda yürütmesine olanak tanır. Bazel, uzaktan yürütme işlemi için gRPC 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 sayfada farklı ortam türleri veya platformlardan bahsedilirken aşağıdaki terminoloji kullanılmaktadır:

  • Ana makine platformu: Bazel'in çalıştığı platform.
  • Yürütme platformu - Bazel işlemlerinin çalıştırıldığı yer.
  • 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 şekilde yürütülmesini sağlamak üzere bu sayfada açıklanan yönergeleri uygulamanız gerekir. Bunun nedeni uzaktan yürütmenin doğası gereğidir:

  • yalıtılmış derleme işlemleri. Derleme araçları durumu korumaz ve bağımlılıklar arasında sızdırılamaz.

  • Ç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 derleme ve test kuralları uygulanırken ortaya çıkabilecek sorunlar ve bunların nasıl önlenebileceği açıklanmaktadır. Şu konuları kapsar:

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

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

Şu anda Scala, Rust ve Go için Bazel derleme ve test kurallarına yönelik araç zinciri kuralları mevcuttur. Ayrıca, bash gibi diğer dil ve araçlar için de yeni araç zinciri kuralları 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

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üldüğünde 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 da uzaktan gerçekleştirilen 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'un derleme çıkışlarına yapılan referansları korur. Daha sonra Bazel, derleyici çağrısına dahil edilmesi için BUILD dosyasındaki bağımlılığın foo'a bağlı olduğunu açıkça belirtmeden, derleyiciye derleyiciye bar öğesini derleme talimatı verdiğinde, aynı derleyici örneği her iki işlem için de yürütüldüğü sürece (yerel yürütmede olduğu gibi) işlem başarıyla yürütülür. Bununla birlikte, uzaktan yürütme senaryosunda her derleme işlemi ayrı bir derleyici örneği yürütür. Bu nedenle derleyici durumu ve bar'ın foo'a olan örtülü bağımlılığı kaybolur ve derleme başarısız olur.

Bazel 0.14.1, bu bağımlılık sorunlarının tespit edilip ortadan kaldırılmasına yardımcı olmak için, 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 düzelterek derlemenizi uzaktan yürütmeye hazırlamak için korumalı alanı kullanın. Daha fazla bilgi için Docker Korumalı Alanı ile Bazel Uzaktan Yürütme Sorunlarını Giderme başlıklı makaleyi inceleyin.

Platforma bağlı ikili programları yönetme

Genellikle, ana makine platformunda derlenen bir ikili program, potansiyel olarak uyumsuz bağımlılıklar nedeniyle rastgele bir uzaktan yürütme platformunda güvenli bir ş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'ın, kodunuzu oluşturma sürecinin bir parçası olarak uzaktan yürütme platformunu hedefleyecek şekilde derlenmesi gerekir. (Hedef seçim mantığına bakın.)

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

  • Aracın uzaktan yürütme platformuna uygun olması için kaynak kodunu gönderin veya bu koda harici olarak başvuruda bulunun.

  • 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ı kullanın.

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

Bazel'ın WORKSPACE kuralları, derlemenin gerektirdiği araçlar ve kitaplıklar için ana makine platformunu araştırmada kullanılabilir. Bu araçlar ve kitaplıklar, yerel derlemelerde Bazel'in yürütme platformudur. Derleme açık bir şekilde yerel derleme araçlarına ve eserlerine 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. Derleme işlemlerinin WORKSPACE kurallarında yürütülmesi, ana makine platformundan farklıysa uzaktan yürütme platformuyla uyumlu olmayan ikili programlara neden olur.

  • pip paket yükleniyor. WORKSPACE kuralları aracılığıyla yüklenen pip paketleri, bağımlılıklarının ana makine platformunda önceden yüklü olmasını 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 olmayacaktır.

  • Yerel araçlara veya yapılara sembolik bağlantı. WORKSPACE kuralları aracılığıyla oluşturulan ana makine platformunda yüklü olan araç veya kitaplıkların sembolik bağlantıları, Bazel bunları bulamayacağından 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. Hedef dosyaları harici depo dizininin dışında sembolize etmek için repository_ctx.symlink kullanmayın.

  • Ana makine platformu değiştiriliyor. Uzaktan yürütme platformunda beklenmedik şekilde davranabileceğinden, Bazel runfiles ağacının dışında dosya, ortam değişkenleri ve benzer işlemler oluşturmaktan kaçının.

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

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

  • Platform denetimi ve bağımlılık numaralandırma. Bu işlemlerin, hangi kitaplıkların yüklü olduğunu kontrol edebilen, derlenmesi gereken paketleri indirebilen ve gerekli yapıları derleme için hazırlayan WORKSPACE kuralları aracılığıyla yerel olarak yürütülmesi güvenlidir. Bu kurallar, uzaktan yürütme için normalde ana makine platformu denetimi sırasında edinilecek bilgileri sağlamak için önceden kontrol edilmiş yapıların kullanılmasını da desteklemelidir. Önceden kontrol edilmiş yapılar, Bazel'in bağımlılıkları yerelmiş gibi tanımlamasına olanak tanır. Bunun için koşullu ifadeleri veya --override_repository işaretini kullanın.

  • Hedefe özel yapılar ve platform değişimi oluşturma veya 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 eylemler, derleme sırasında yürütülmelidir.

Uzaktan yürütmeye yönelik önceden kontrol edilmiş yapıları daha kolay bir şekilde oluşturmak için WORKSPACE kurallarını kullanarak oluşturulan dosyaları yayınlayabilirsiniz. Bu kuralları, her araç zinciri container'ının içinde olduğu gibi yeni yürütme ortamlarında çalıştırabilir ve kaynak deponuzda uzaktan yürütme derlemenizin çıkışlarını referans olarak kontrol edebilirsiniz.

Örneğin, Tensorflow'un cuda ve python kuralları için WORKSPACE kuralları şu BUILD files değerini 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şkeni üzerindeki koşullu ifade, kuralın depoya kaydedilen dosyaları kullanmasına imkan tanır.

BUILD dosyalarında 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şlemleri gerçekleştirebilen genrules bildiriliyor.