Bu sayfa, özel derleme ve test kuralları yazan Bazel kullanıcıları için hazırlanmıştır. Bu kullanıcılar, Bazel kurallarının uzaktan yürütme bağlamındaki gereksinimlerini anlamak istemektedir.
Uzak yürütme, Bazel'in işlemleri bir veri merkezi gibi ayrı bir platformda yürütmesine olanak tanır. Bazel, uzaktan yürütme için gRPC protokolünü 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ürlerine veya platformlara atıfta bulunulurken aşağıdaki terminoloji kullanılır:
- Barındırma platformu: Bazel'in çalıştığı yer.
- Yürütme platformu: Bazel işlemlerinin yürütüldüğü yer.
- Hedef platform: Derleme çıkışlarının (ve bazı işlemlerin) çalıştırıldığı yer.
Genel Bakış
Uzaktan yürütme için bir Bazel derlemesi yapılandırırken, derlemenin uzaktan hatasız bir şekilde yürütülmesini sağlamak için bu sayfada açıklanan yönergeleri uygulamanız gerekir. Bunun nedeni, uzaktan yürütmenin doğasıdır.
İzole derleme işlemleri. Derleme araçları durumu korumaz ve bağımlılıklar aralarında sızamaz.
Ç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, uzak yürütme için özel Bazel derleme ve test kuralları uygulanırken ortaya çıkabilecek sorunlar ve bu sorunlardan nasıl kaçınılacağı açıklanmaktadır. Bu makalede aşağıdaki konular ele alınmaktadır:
- Araç zinciri kuralları aracılığıyla derleme araçlarını çağırma
- Örtülü bağımlılıkları yönetme
- Platforma bağlı ikili dosyaları yönetme
- Yapılandırma tarzı WORKSPACE kurallarını yönetme
Araç zinciri kuralları aracılığıyla derleme araçlarını çağırma
Bazel araç zinciri kuralı, derleme kuralına hangi derleme araçlarının (ör. derleyiciler ve bağlayıcılar) kullanılacağını ve bunları kuralın oluşturucusu tarafından tanımlanan parametreleri kullanarak nasıl yapılandıracağını söyleyen bir yapılandırma sağlayıcıdır. Bir araç zinciri kuralı, derleme ve test kurallarının, uzaktan yürütmeyle uyumlu olan, önceden yapılandırılmış ve tahmin edilebilir bir şekilde derleme araçlarını çağıırmasına olanak tanır. Örneğin, PATH
, JAVA_HOME
veya diğer yerel değişkenler aracılığıyla derleme araçlarını çağırmak yerine bir araç zinciri kuralı kullanın. Bu değişkenler, uzak yürütme ortamında eşdeğer değerlere ayarlanmamış (veya hiç ayarlanmamış) olabilir.
Şu anda Scala, Rust ve Go için Bazel derleme ve test kuralları için araç zinciri kuralları mevcuttur. Bash gibi diğer diller ve araçlar için yeni araç zinciri kuralları geliştirilmektedir. Kuralınızın kullandığı araç için bir toolchain kuralı yoksa toolchain kuralı oluşturmayı deneyin.
Örtülü bağımlılıkları yönetme
Bir derleme aracı, derleme işlemleri genelindeki bağımlılıklara erişebiliyorsa bu işlemler uzaktan yürütüldüğünde başarısız olur. Bunun nedeni, her uzaktan derleme işleminin diğerlerinden ayrı olarak yürütülmesidir. Bazı derleme araçları, derleme işlemleri arasında durumu korur ve araç çağrısına açıkça dahil edilmemiş bağımlılıklara erişir. Bu durum, uzaktan yürütülen derleme işlemlerinin başarısız olmasına neden olur.
Örneğin, Bazel, durum bilgisi olan bir derleyiciye foo'yu yerel olarak oluşturmasını söylediğinde derleyici, foo'nun derleme çıkışlarına yapılan referansları korur. Ardından Bazel, derleyiciye foo öğesine bağlı olan bar öğesini oluşturmasını söylerken derleyici çağrısına dahil etmek için BUILD dosyasında bu bağımlılığı açıkça belirtmezse aynı derleyici örneği her iki işlem için de yürütüldüğü sürece (yerel yürütme için tipik olduğu gibi) işlem 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'ın foo'ya 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ı tespit edip ortadan kaldırmaya yardımcı olmak için uzak yürütmeyle aynı bağımlılık kısıtlamalarına sahip yerel Docker sanal alanı sunar. Bağımlılıkla ilgili derleme hatalarını belirleyip çözerek derlemenizi uzaktan yürütmeye hazırlamak için sanal ortamı kullanın. Daha fazla bilgi için Docker Sandbox ile Bazel Uzaktan Yürütme'de sorun giderme başlıklı makaleyi inceleyin.
Platforma bağımlı ikili dosyaları yönetme
Genellikle, ana makine platformunda oluşturulan bir ikili, olası uyuşmazlıklar nedeniyle rastgele bir uzaktan yürütme platformunda güvenli bir şekilde yürütülemez. Örneğin, Bazel ile birlikte verilen SingleJar ikilisi, barındırma platformunu hedefler. Ancak uzaktan yürütme için SingleJar'ın, kodunuzu oluşturma sürecinin bir parçası olarak derlenmesi gerekir. Böylece, uzaktan yürütme platformunu hedefleyebilir. (Hedef seçme mantığına bakın.)
Derlemenizin gerektirdiği derleme araçlarının ikili dosyalarını, yürütme platformunuzda güvenli bir şekilde çalışacaklarından emin olmadığınız sürece kaynak kodunuzla birlikte göndermeyin. Bunun yerine aşağıdakilerden birini yapın:
Aracın kaynak kodunu, uzaktan yürütme platformu için oluşturulabilmesi amacıyla gönderin veya harici olarak referans verin.
Yeterince kararlıysa aracı uzak yürütme ortamına (ör. 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 tarzı WORKSPACE kurallarını yönetme
Bazel'in WORKSPACE
kuralları, derleme için gereken araç ve kitaplıklar açısından ana makine platformunu incelemek için kullanılabilir. Yerel derlemeler için bu, Bazel'in yürütme platformudur. Derleme açıkça yerel derleme araçlarına ve yapay nesnelere bağlıysa uzak yürütme platformu, ana makine platformuyla aynı değilse uzak 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 dosyalar oluşturuluyor.
WORKSPACE
kurallarında derleme işlemlerinin yürütülmesi, ana makine platformundan farklıysa uzaktan yürütme platformuyla uyumsuz ikili dosyalarla sonuçlanır.pip
paketleri yükleniyor.WORKSPACE
aracılığıyla yüklenenpip
paketlerinin bağımlılıklarının, ana makine platformuna önceden yüklenmesi gerekir. Özellikle ana makine platformu için oluşturulan bu tür paketler, ana makine platformundan farklıysa uzaktan yürütme platformuyla uyumlu olmaz.Yerel araçlara veya yapılara sembolik bağlantı oluşturma.
WORKSPACE
kuralları aracılığıyla oluşturulan, ana makine platformuna yüklenen araçlara veya kitaplıklara yönelik sembolik bağlantılar, Bazel bu araçları veya kitaplıkları bulamayacağından derlemenin uzaktan yürütme platformunda başarısız olmasına neden olur. Bunun yerine, sembolik bağlantılı araçlara ve kitaplıklara Bazel'inrunfiles
ağacından erişilebilmesi için standart derleme işlemleri kullanarak sembolik bağlantılar oluşturun.repository_ctx.symlink
'ı, harici depo dizininin dışındaki hedef dosyaları sembolik olarak bağlamak için kullanmayın.Ana makine platformunu değiştirme. Bazel
runfiles
ağacının dışında dosya oluşturmaktan, ortam değişkenleri oluşturmaktan ve benzeri işlemlerden kaçının. Bu işlemler, uzaktan yürütme platformunda beklenmedik şekilde davranabilir.
Potansiyel olarak hermetik olmayan davranışları bulmak için Workspace kuralları günlüğünü kullanabilirsiniz.
Harici bir bağımlılık, ana makine platformuna bağlı belirli işlemleri yürütüyorsa bu işlemleri WORKSPACE
arasında bölmeli ve aşağıdaki gibi derleme kuralları oluşturmalısınız:
Platform incelemesi ve bağımlılık numaralandırması. Bu işlemler, hangi kitaplıkların yüklendiğini kontrol edebilen, oluşturulması gereken paketleri indirebilen ve derleme için gerekli yapıları hazırlayabilen
WORKSPACE
kuralları aracılığıyla yerel olarak güvenli bir şekilde yürütülebilir. Bu kurallar, uzaktan yürütme için normalde ana makine platformu incelemesi sırasında elde edilecek bilgileri sağlamak üzere önceden kontrol edilmiş yapıtların kullanımı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 ifadeler veya--override_repository
işaretini kullanın.Hedefe özel yapılar oluşturma veya derleme ve platform mutasyonu. Bu işlemler normal derleme kuralları aracılığı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.
Uzak yürütme için önceden işaretlenmiş yapıtları daha kolay oluşturmak üzere, oluşturulan dosyaları yayınlamak için
WORKSPACE
kurallarını kullanabilirsiniz. Bu kuralları her yeni yürütme ortamında (ör. her araç zinciri kapsayıcısının içinde) çalıştırabilir ve uzaktan yürütme derlemenizin çıktılarını kaynak deponuzda referans olarak kontrol edebilirsiniz.
Örneğin, Tensorflow'un cuda
ve python
kuralları için WORKSPACE
kuralları aşağıdaki BUILD files
değerlerini üretir.
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 hem de uzaktan çalıştırılabilen genrules
'ı bildirir ve daha önce repository_ctx.symlink
aracılığıyla yapılan gerekli işlemleri gerçekleştirir (burada gösterildiği gibi).