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, derleme işlemine uzaktan yürütme işlemiyle aynı 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, 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.
- 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 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ükleyip görüntüyü yerel olarak derleyerek özel bir Docker kapsayıcısı 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'i ve tüm derleme işlemlerini doğrudan yerel makinede yürütür. 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, yerel olarak yüklenen araçlar, ikili dosyalar ve veriler, özellikle yapılandırma stilinde WORKSPACE kuralları kullanılıyorsa 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 belgelerine bakın. Sorunlar 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ış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 bildirildiğinden emin olun. 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 kapsayıcısına yüklendiğini onaylayın ve eksik kaynağa işaret eden bağımlılıkları doğru şekilde beyan etmek 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 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 ile iletişime geçin.
@local-jdk
kaynağı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 adresiyle iletişime geçin.
Docker kapsayıcısı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ı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 container'ı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, 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ı 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ı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ı root olduğundan Bazel'in çalıştığı ana makine kapsayıcısının içinden, Bazel'in derleme işlemlerinin çalıştığı Docker korumalı alanı özelliği tarafından oluşturulan araç zinciri kapsayıcılarından ve ana makine ile işlem kapsayıcılarının çalıştığı yerel makineden aynı mutlak yola 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 ö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.