Yerel olarak başarılı olan Bazel derlemeleri, yerel derlemeleri etkilemeyen kısıtlamalar ve gereklilikler nedeniyle uzaktan yürütüldüğünde başarısız olabilir. Bu tür hataların en yaygın nedenleri Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama bölümünde açıklanmıştır.
Bu sayfada, Docker korumalı alanı özelliği kullanılarak uzaktan yürütmede ortaya çıkan en yaygın sorunların nasıl tanımlanıp çözüleceği açıklanmaktadır. Bu özellik, derlemeye uzaktan yürütmeye eşit kısıtlamalar uygular. Bu sayede, uzaktan yürütme hizmetine ihtiyaç duymadan derlemenizle ilgili sorunları giderebilirsiniz.
Docker korumalı alan özelliği, uzaktan yürütme 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 container mimarisine alınmış uzaktan yürütmeyi destekleyen bir hizmet aracılığıyla yerel olarak ve uzaktan çalıştırmak için aynı araç zinciri container'larını kullanabilirsiniz.
Hiçbir harici veri, container sınırını geçmez. Yalnızca açıkça beyan edilen giriş ve çıkışlar, yalnızca ilişkili derleme işlemi başarıyla tamamlandıktan sonra container'a girip çıkar.
Her işlem yeni bir container'da yürütülür. Üretilen her derleme işlemi için yeni ve benzersiz bir container oluşturulur.
Bu sorunları aşağıdaki yöntemlerden birini kullanarak giderebilirsiniz:
Yerel olarak sorun 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 durum, uzaktan yürütmede sorunlara neden olur.
Docker container'ında sorun giderme. Bu yöntemle Bazel ve derleme işlemleri Docker container'ı içinde çalışır. Böylece yerel makineden derlemeye sızan araçları, durumları ve verileri tespit edebilir ve uzaktan yürütmeye eşdeğer 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, henüz 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.
- En son sürüm sürümüne sabitlenmiş bazel-toolchains deposunu derlemenizin
WORKSPACE
dosyasına burada açıklandığı şekilde ekleyin. - Özelliği etkinleştirmek için
.bazelrc
dosyanıza işaret ekleyin. Dosyayı Bazel projenizin kök dizininde (yoksa) oluşturun. Aşağıdaki işaretler referans 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 ek araçlar gerektiriyorsa 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ğrulamanın güvenilir bir yoludur.
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ütmede sorunlara neden olur. Bunları tespit etmek için yerel olarak sorun gidermeye ek olarak bir Docker container'ı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. Docker korumalı alan özelliği nedeniyle derleme, normalden dört kata kadar daha yavaş çalışır.
Aşağıdaki hatayla karşılaşabilirsiniz:
ERROR: 'docker' is an invalid value for docker spawn strategy.
Bunu yaparsanız --experimental_docker_verbose
işaretini kullanarak derlemeyi tekrar çalıştırın.
Bu işaret, ayrıntılı hata mesajları sağlar. Bu hata genellikle Docker kurulumunun hatalı olmasından veya projeyi geçerli kullanıcı hesabı altında yürütmek için gerekli izinlerin olmamasından kaynaklanır. Daha fazla bilgi için Docker belgelerine bakın. Sorun devam ederse Docker kapsayıcısında sorun giderme bölümüne geçin.
2. Adım: Algılanan sorunları çözün
Aşağıda, en sık karşılaşılan sorunlar ve bunların geçici çözümleri verilmiştir.
Bazel çalıştırma dosyaları ağacının başvuruda bulunduğu bir dosya, araç, ikili program veya kaynak eksik. Etkilenen hedeflerin tüm bağımlılıklarının açıkça bildirildiğinden emin olun. Daha fazla bilgi için Dolaylı bağımlılıkları yönetme bölümüne bakın.
Mutlak yol tarafından başvurulan bir dosya, araç, ikili program veya kaynak ya da
PATH
değişkeni 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ç zinciri kuralları aracılığıyla derleme araçlarını çağırma bölümüne bakın.İkili program yürütmesi başarısız olur. Derleme kurallarından biri, yürütme ortamıyla (Docker container'ı) uyumlu olmayan bir ikili programı referans alıyor. Daha fazla bilgi için Platforma bağlı ikili programları yönetme bölümüne bakın. Sorunu çözemezseniz yardım için bazel-discuss@google.com ile iletişime geçin.
@local-jdk
dosyasındaki bir dosya eksik veya hatalara neden oluyor. Yerel makinenizdeki Java ikili programları derlemeye sızmakta ve makineyle uyumsuzdur. Kurallarınızda ve hedeflerinizde@local_jdk
yerinejava_toolchain
kullanın. Daha fazla yardıma ihtiyacınız olursa bazel-discuss@google.com ile iletişime geçebilirsiniz.Diğer hatalar. Yardım için bazel-discuss@google.com ile iletişime geçin.
Docker container'ında sorun giderme
Bu yöntemle Bazel, ana makine Docker container'ının içinde çalışır. Bazel'in derleme işlemleri ise Docker korumalı alanı özelliği tarafından oluşturulan bağımsız araç zinciri container'larında yürütülür. Korumalı alan, her derleme işlemi için yepyeni bir araç zinciri kapsayıcısı oluşturur ve her araç zinciri container'ında yalnızca bir işlem yürütülür.
Bu yöntem, ana makine ortamında yüklü araçların daha ayrıntılı bir şekilde kontrol edilmesini sağlar. Derlemenin yürütülmesini derleme işlemlerinin yürütülmesinden ayırarak ve yüklü araçları minimumda tutarak derlemenizin yerel yürütme ortamına bağımlı olup olmadığını doğrulayabilirsiniz.
1. Adım: Kapsayıcıyı oluşturun
Docker container'ı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 container'ını başlatın. Komutta, derlemek istediğiniz ana makinenizdeki kaynak kodunun yolunu değiştirin.
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, container'ı kök olarak çalıştırır, Docker soketini eşler ve /tmp
dizinini ekler. 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 kodunuzu container'ın içindeki /src
adresinde bulabilirsiniz.
Komut, araç zinciri container'ı olarak kullanılan rbe-ubuntu16-04
container'ıyla uyumlu olmayan ikili programlar içeren bir debian:stretch
temel container'ından kasıtlı olarak başlar. Yerel ortamdaki ikili programlar araç zinciri container'ına sızdırılırsa derleme hatalarına neden olur.
3. Adım: Kapsayıcıyı test edin
Test etmek için Docker container'ını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: Algılanan 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, deneyseldir ve tahmin edilemeyen 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 çözümler için Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama bölümüne bakın.
Derleme başka bir nedenle başarısız olursa 2. Adım: Algılanan sorunları giderin bölümündeki sorun giderme adımlarına bakın.