Yerel olarak başarılı olan Bazel derlemeleri, yerel derlemeleri etkilemeyen kısıtlamalar ve gereksinimler nedeniyle uzaktan yürütüldüğünde başarısız olabilir. Bu tür hataların en yaygın nedenleri Adapting Bazel Rules for Remote Execution (Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama) başlıklı makalede açıklanmıştır.
Bu sayfada, Docker sanal alanı özelliği kullanılarak uzaktan yürütmeyle ilgili en yaygın sorunların nasıl belirleneceği ve çözüleceği açıklanmaktadır. Bu özellik, derleme üzerinde uzaktan yürütmeyle aynı kısıtlamaları uygular. Bu sayede, uzaktan yürütme hizmetine gerek kalmadan derlemenizle ilgili sorunları 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 container'larında yürütülür. Derlemenizi yerel olarak ve kapsayıcılı uzaktan yürütmeyi destekleyen bir hizmet aracılığıyla uzaktan çalıştırmak için aynı araç zinciri kapsayıcılarını kullanabilirsiniz.
Kapsayıcı sınırını aşan gereksiz veri yok. Kapsayıcıya yalnızca açıkça beyan edilen girişler ve çıkışlar girip çı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. Her oluşturulan derleme işlemi için yeni ve benzersiz bir kapsayıcı 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 doğal olarak çalışır. Docker sandbox özelliği, derleme üzerinde uzak yürütme ile aynı kısıtlamaları uygular. Ancak bu yöntem, derlemenize sızan yerel araçları, durumları ve verileri algılamaz. Bu durum, uzaktan yürütmeyle ilgili sorunlara neden olur.
Docker container'da sorun giderme Bu yöntemle Bazel ve derleme işlemleri bir Docker container'da çalışır. Bu sayede, yerel makineden derlemeye sızan araçları, durumları ve verileri tespit edebilir, ayrıca uzak yürütme ile aynı kısıtlamaları uygulayabilirsiniz. Bu yöntem, derlemenin bazı kısımları başarısız olsa bile derlemeniz hakkında bilgi sağlar. Bu yöntem deneyseldir ve resmi olarak desteklenmez.
Ön koşullar
Sorun giderme işlemine başlamadan önce aşağıdakileri yapmadıysanız yapın:
- Docker'ı yükleyin ve çalıştırmak için gereken izinleri yapılandırın.
- Bazel 0.14.1 veya sonraki sürümlerini yükleyin. Önceki sürümler, Docker sanal alanı özelliğini desteklemez.
- En son yayın sürümüne sabitlenmiş bazel-toolchains
reposunu,
WORKSPACE
dosyanıza burada açıklandığı şekilde ekleyin. - Özelliği etkinleştirmek için
.bazelrc
dosyanıza işaretler ekleyin. Dosya yoksa Bazel projenizin kök dizininde oluşturun. Aşağıdaki işaretler örnek referans olarak verilmiştir. Lütfen bazel-toolchains deposundaki en son.bazelrc
dosyasını inceleyin ve orada tanımlanan işaretlerin değerlerinidocker-sandbox
yapılandırması için 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ükleyip görüntüyü yerel olarak oluşturarak özel bir Docker container'ı oluşturun.
Yukarıdaki
--experimental_docker_image
işaretinin değerini özel kapsayıcı resminizin adıyla değiştirin.
Yerel olarak sorun giderme
Bu yöntem, Bazel'ı ve tüm derleme işlemlerini doğrudan yerel makinede yürütür. Bu yöntem, derlemenizin uzaktan yürütüldüğünde başarılı olup olmayacağını onaylamanın güvenilir bir yoludur.
Ancak bu yöntemde, özellikle configure tarzı WORKSPACE kuralları kullanılıyorsa yerel olarak yüklenen araçlar, ikili dosyalar ve veriler derlemenize sızabilir. Bu tür sızıntılar, uzaktan yürütmeyle ilgili sorunlara neden olur. Bunları 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. Docker sandbox özelliği nedeniyle derleme, 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 Docker'ı çalıştırmak için gerekli izinlerin olmamasından kaynaklanır. Daha fazla bilgi için Docker belgelerini inceleyin. Sorun devam ederse Docker kapsayıcısında sorun giderme bölümüne geçin.
2. adım: Tespit edilen sorunları çözün
En sık karşılaşılan sorunlar ve geçici çözümleri aşağıda verilmiştir.
Bazel runfiles ağacı tarafından referans verilen bir dosya, araç, ikili program veya kaynak eksik. Etkilenen hedeflerin tüm bağımlılıklarının açıkça beyan edildiğini onaylayın. Daha fazla bilgi için Örtülü bağımlılıkları yönetme başlıklı makaleyi inceleyin.
Mutlak bir yolla veya
PATH
değişkeniyle referans verilen bir dosya, araç, ikili dosya ya da kaynak eksik. Gerekli tüm araçların araç zinciri kapsayıcısına yüklendiğini onaylayın ve eksik kaynağı işaret eden bağımlılıkları düzgün şekilde bildirmek için araç zinciri kurallarını kullanın. Daha fazla bilgi için Invoking build tools through toolchain rules (Araç zinciri kuralları aracılığıyla derleme araçlarını çağırma) başlıklı makaleye bakın.İ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ğlı ikili dosyaları yönetme başlıklı makaleyi inceleyin. Sorunu çözemiyorsanız yardım için bazel-discuss@google.com adresiyle iletişime geçin.
@local-jdk
kaynağından bir dosya eksik veya hatalara neden oluyor. Yerel makinenizdeki Java ikilileri, derlemeyle uyumlu olmamasına rağmen derlemeye sızıyor. Kurallarınızda ve hedeflerinizde@local_jdk
yerinejava_toolchain
kullanın. Daha fazla yardıma ihtiyacınız varsa 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 container'da sorun giderme
Bu yöntemde Bazel, bir ana makine Docker container'ının içinde çalışır ve Bazel'in derleme işlemleri, Docker sandbox özelliği tarafından oluşturulan ayrı ayrı araç zinciri container'larında yürütülür. Sandbox, her derleme işlemi için yepyeni bir araç zinciri kapsayıcısı 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ı minimum düzeyde 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'ı oluşturan ve Bazel'i minimum derleme araçları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, ana makinenizde oluşturmak istediğiniz kaynak kodunun 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ı kök olarak çalıştırır, Docker soketini eşler ve /tmp
dizinini bağlar. Bu sayede Bazel, diğer Docker kapsayıcılarını oluşturabilir ve bu kapsayıcılarla dosya paylaşmak için /tmp
altındaki dizinleri kullanabilir. Kaynak kodunuz, kapsayıcının içindeki /src
konumunda bulunur.
Komut, kasıtlı olarak bir araç zinciri kapsayıcısı olarak kullanılan rbe-ubuntu16-04
kapsayıcısıyla uyumsuz ikili dosyalar içeren bir debian:stretch
temel kapsayıcıdan başlatılır. Yerel ortamdaki ikili dosyalar araç zinciri kapsayıcısına sızarsa derleme hatalarına neden olurlar.
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ı, Bazel'in çalıştığı ana makine container'ının içinden, Bazel'in derleme işlemlerinin çalıştığı Docker sandbox ö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 gelmesi için kök kullanıcıdır.
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 işlemi "disk alanı yetersiz" hatasıyla başarısız olursa ana makine kapsayıcısını
--memory=XX
işaretiyle başlatarak bu limiti artırabilirsiniz. BuradaXX
, gigabayt cinsinden ayrılan disk alanıdır. Bu özellik deneyseldir ve öngörülemeyen davranışlara neden olabilir.Derleme, analiz veya yükleme aşamalarında başarısız olursa WORKSPACE dosyasında belirtilen derleme kurallarınızdan en az biri uzak yürütmeyle uyumlu değildir. Olası nedenler ve geçici çözümler için Adapting Bazel Rules for Remote Execution (Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama) başlıklı makaleye bakın.
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.