Yerel olarak başarılı olan Bazel derlemeleri, yerel derlemeleri etkilemeyen kısıtlamalar ve koşullar nedeniyle uzaktan çalıştırıldığında başarısız olabilir. Bu tür hatalara en sık neden olan durumlar Uzaktan Çalıştırma için Bazel Kurallarını Uyarlama başlıklı makalede açıklanmıştır.
Bu sayfada, Docker korumalı alanı özelliği kullanılarak uzaktan yürütmeyle ilgili ortaya çıkan en yaygın sorunların nasıl tanımlanacağı ve çözüleceği açıklanmaktadır. Bu özellik, derleme işlemine uzaktan yürütmeyle aynı kısıtlamaları uygular. Bu sayede, uzaktan yürütme hizmetine ihtiyaç duymadan derlemenizde sorun giderebilirsiniz.
Docker korumalı alan özelliği, uzaktan yürütmenin kısıtlamalarını aşağıdaki gibi taklit eder:
Derleme işlemleri, araç zinciri kapsayıcılarında yürütülür. Derlemenizi, kapsayıcıya alınmış uzaktan yürütmeyi destekleyen bir hizmet aracılığıyla yerelde ve uzaktan çalıştırmak için aynı araç zinciri kapsayıcılarını kullanabilirsiniz.
Kapsayıcı sınırını aşmayan ek veriler Yalnızca açıkça tanımlanmış girişler ve çıkışlar kapsayıcıya girip kapsayıcıdan çıkar ve bu işlem yalnızca ilişkili derleme işlemi başarıyla tamamlandıktan sonra gerçekleşir.
Her işlem yeni bir kapsayıcıda yürütülür. Oluşturulan her derleme işlemi için yeni ve benzersiz bir kapsayıcı oluşturulur.
Aşağıdaki yöntemlerden birini kullanarak bu sorunları giderebilirsiniz:
Sorunları doğal olarak giderme. Bu yöntemle, Bazel ve derleme işlemleri yerel makinenizde yerel olarak çalışır. Docker korumalı alanı özelliği, derlemeye uzaktan yürütmeye eşit kısıtlamalar uygular. Ancak bu yöntem, derlemenize sızan yerel araçları, durumları ve verileri algılamaz. Bu da uzaktan yürütmeyle ilgili sorunlara neden olur.
Docker kapsayıcısında sorun giderme. Bu yöntemde Bazel ve derleme işlemleri bir Docker kapsayıcısında çalıştırılır. Bu sayede, yerel makineden derlemeye sızan araçları, durumları ve verileri tespit edebilir, uzaktan yürütmeyle aynı kısıtlamaları uygulayabilirsiniz. Bu yöntem, derlemenin bazı bölümleri başarısız olsa bile derlemeniz hakkında bilgi sağlar. Bu yöntem deneyseldir ve resmi olarak desteklenmemektedir.
Ön koşullar
Sorun giderme işlemine başlamadan önce, daha önce yapmadıysanız aşağıdakileri yapın:
- Docker'ı yükleyin ve çalıştırmak için gereken izinleri yapılandırın.
- Bazel 0.14.1 veya sonraki bir sürümü yükleyin. Önceki sürümler Docker korumalı alan özelliğini desteklemez.
- bazel-toolchains repo'sunu, en son sürüm sürümüne sabitlenmiş olarak burada açıklandığı şekilde derlemenizin
WORKSPACE
dosyasına ekleyin. - Özelliği etkinleştirmek için
.bazelrc
dosyanıza işaretler ekleyin. Dosyayı, Bazel projenizin kök dizininde oluşturun (mevcut değilse). Aşağıdaki işaretler referans amaçlı bir örnektir. Lütfen bazel-toolchains deposundaki en yeni.bazelrc
dosyasını inceleyin vedocker-sandbox
yapılandırması için burada tanımlanan işaretlerin değerlerini kopyalayın.
# Docker Sandbox Mode
build:docker-sandbox --host_javabase=<...>
build:docker-sandbox --javabase=<...>
build:docker-sandbox --crosstool_top=<...>
build:docker-sandbox --experimental_docker_image=<...>
build:docker-sandbox --spawn_strategy=docker --strategy=Javac=docker --genrule_strategy=docker
build:docker-sandbox --define=EXECUTOR=remote
build:docker-sandbox --experimental_docker_verbose
build:docker-sandbox --experimental_enable_docker_sandbox
Kurallarınız için ek araçlar gerekiyorsa aşağıdakileri yapın:
Dockerfile kullanarak araçlar yükleyerek ve görüntüyü yerel olarak oluşturarak özel bir Docker container'ı oluşturun.
Yukarıdaki
--experimental_docker_image
işaretinin değerini, özel container görüntünüzün adıyla değiştirin.
Yerel olarak sorun giderme
Bu yöntem, Bazel'i ve tüm derleme işlemlerini doğrudan yerel makinede yürütür ve derlemenizin uzaktan çalıştırıldığında başarılı olup olmayacağını doğrulamak için güvenilir bir yöntemdir.
Ancak bu yöntemle, özellikle yapılandırma stili WORKSPACE kuralları kullanılıyorsa yerel olarak yüklenmiş araçlar, ikili programlar ve veriler derlemenize sızabilir. Bu tür sızıntılar, uzaktan yürütmeyle ilgili sorunlara neden olur. Bu sorunları tespit etmek için yerel olarak sorun gidermenin yanı sıra Docker kapsayıcısında sorun giderin.
1. adım: Derlemeyi çalıştırın
Derlemenizi yürüten Bazel komutuna
--config=docker-sandbox
işaretini ekleyin. Örneğin:bazel --bazelrc=.bazelrc build --config=docker-sandbox target
Derlemeyi çalıştırın ve tamamlanmasını bekleyin. Derleme, Docker korumalı alanı özelliği nedeniyle normalden dört kat daha yavaş çalışır.
Aşağıdaki hatayla karşılaşabilirsiniz:
ERROR: 'docker' is an invalid value for docker spawn strategy.
Bu durumda derlemeyi --experimental_docker_verbose
işaretiyle tekrar çalıştırın.
Bu işaret, ayrıntılı hata mesajlarını etkinleştirir. Bu hata genellikle hatalı bir Docker yüklemesinden veya mevcut kullanıcı hesabı altında çalıştırma izinlerinin eksik olmasından kaynaklanır. Daha fazla bilgi için Docker belgelerini inceleyin. Sorunlar devam ederse Docker kapsayıcısında sorun giderme bölümüne geçin.
2. Adım: Tespit edilen sorunları çözme
En sık karşılaşılan sorunlar ve bunların geçici çözümleri aşağıda açıklanmıştır.
Bazel çalışma dosyası ağacının referans verdiği bir dosya, araç, ikili program veya kaynak eksik. Etkilenen hedeflerin tüm bağımlılıklarının açıkça tanımlandığını onaylayın. Daha fazla bilgi için Dolayısız bağımlılıkları yönetme başlıklı makaleyi inceleyin.
Mutlak bir yol veya
PATH
değişkeni tarafından referans verilen bir dosya, araç, ikili dosya veya kaynak eksik. Gerekli tüm araçların araç zinciri container'ına yüklendiğini onaylayın ve eksik kaynağa işaret eden bağımlılıkları doğru şekilde tanımlamak için araç zinciri kurallarını kullanın. Daha fazla bilgi için Araç seti kuralları aracılığıyla derleme araçlarını çağırma başlıklı makaleyi inceleyin.İkili yürütme başarısız olur. Derleme kurallarından biri, yürütme ortamıyla (Docker kapsayıcısı) uyumlu olmayan bir ikili dosyaya referans veriyor. Daha fazla bilgi için Platforma bağımlı ikili dosyaları yönetme başlıklı makaleyi inceleyin. Sorunu çözemezseniz yardım için bazel-discuss@google.com adresiyle iletişime geçin.
@local-jdk
dosyasındaki bir dosya eksik veya hatalara neden oluyor. Yerel makinenizdeki Java ikili dosyaları, derlemeyle uyumlu olmasa da derlemeye sızıyor. Kurallarınızda ve hedeflerinizde@local_jdk
yerinejava_toolchain
kullanın. Daha fazla yardıma ihtiyacınız olursa bazel-discuss@google.com adresiyle iletişime geçin.Diğer hatalar. Yardım için bazel-discuss@google.com adresiyle iletişime geçin.
Docker kapsayıcısında sorun giderme
Bu yöntemde Bazel, ana makine Docker container'ının içinde çalışır ve Bazel'in derleme işlemleri, Docker korumalı alan özelliği tarafından oluşturulan ayrı araç zinciri container'larında yürütülür. Korumalı alan, her derleme işlemi için yepyeni bir araç zinciri kapsayıcı oluşturur ve her araç zinciri kapsayıcısında yalnızca bir işlem yürütülür.
Bu yöntem, ana makine ortamına yüklenen araçlar üzerinde daha ayrıntılı kontrol sağlar. Derlemenin yürütülmesini, derleme işlemlerinin yürütülmesinden ayırarak ve yüklü araçları en aza indirerek derlemenizin yerel yürütme ortamıyla herhangi bir bağımlılık içerip içermediğini doğrulayabilirsiniz.
1. Adım: Kapsayıcıyı oluşturun
Docker kapsayıcısını oluşturan ve Bazel'i minimum sayıda derleme aracıyla yükleyen bir
Dockerfile
oluşturun:FROM debian:stretch RUN apt-get update && apt-get install -y apt-transport-https curl software-properties-common git gcc gnupg2 g++ openjdk-8-jdk-headless python-dev zip wget vim RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" RUN apt-get update && apt-get install -y docker-ce RUN wget https://releases.bazel.build/<latest Bazel version>/release/bazel-<latest Bazel version>-installer-linux-x86_64.sh -O ./bazel-installer.sh && chmod 755 ./bazel-installer.sh RUN ./bazel-installer.sh
Kapsayıcıyı
bazel_container
olarak oluşturun:docker build -t bazel_container - < Dockerfile
2. Adım: Kapsayıcıyı başlatın
Aşağıda gösterilen komutu kullanarak Docker kapsayıcısını başlatın. Komutta, barındırma sunucunuzda derlemek istediğiniz kaynak kodun yolunu girin.
docker run -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp:/tmp \
-v your source code directory:/src \
-w /src \
bazel_container \
/bin/bash
Bu komut, kapsayıcıyı root olarak çalıştırır, docker soketini eşler ve /tmp
dizinini bağlar. Bu sayede Bazel, başka Docker container'ları oluşturabilir ve bu kapsayıcılarla dosya paylaşmak için /tmp
altındaki dizinleri kullanabilir. Kaynak kodunuz, kapsayıcı içindeki /src
adresinde bulunur.
Komut, araç zinciri kapsayıcısı olarak kullanılan rbe-ubuntu16-04
kapsayıcısıyla uyumlu olmayan ikili dosyaları içeren debian:stretch
temel bir kapsayıcıdan kasıtlı olarak başlar. Yerel ortamdaki ikili dosyalar araç seti kapsayıcısına sızıyorsa derleme hatalarına neden olur.
3. Adım: Kapsayıcıyı test edin
Test etmek için Docker container'ın içinden aşağıdaki komutları çalıştırın:
docker ps
bazel version
4. Adım: Derlemeyi çalıştırın
Derlemeyi aşağıda gösterildiği gibi çalıştırın. Çıkış kullanıcısı köktür. Bu şekilde Bazel'in çalıştığı ana makine container'ının içinden, Bazel'in derleme işlemlerinin çalıştığı Docker korumalı alan özelliğinin oluşturduğu araç zinciri container'larından ve ana makine ile işlem container'larının çalıştığı yerel makineden aynı mutlak yolla erişilebilen bir dizine karşılık gelir.
bazel --output_user_root=/tmp/bazel_docker_root --bazelrc=.bazelrc \ build --config=docker-sandbox target
5. Adım: Tespit edilen sorunları çözün
Derleme hatalarını aşağıdaki şekilde çözebilirsiniz:
Derleme "disk alanı bitti" hatasıyla başarısız olursa ana makine container'ını
--memory=XX
işaretiyle başlatarak bu sınırı artırabilirsiniz. BuradaXX
, gigabayt cinsinden ayrılan disk alanıdır. Bu özellik deneyseldir ve beklenmedik davranışlara neden olabilir.Derleme analiz veya yükleme aşamaları sırasında başarısız olursa WORKSPACE dosyasında tanımlanan derleme kurallarınızdan bir veya daha fazlası uzaktan yürütmeyle uyumlu değildir. Olası nedenler ve geçici çözümler için Bazel Kurallarını Uzaktan Çalıştırmaya Uyarlama başlıklı makaleyi inceleyin.
Derleme başka bir nedenle başarısız olursa 2. Adım: Tespit edilen sorunları çözme bölümündeki sorun giderme adımlarına bakın.