Yerel olarak başarılı olan Bazel derlemeleri, aşağıdaki nedenlerden dolayı uzaktan yürütüldüğünde başarısız olabilir: yerel derlemeleri etkilemeyen kısıtlamalar ve gereksinimler vardır. En yaygın bu tür hataların nedenleri Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama bölümünde açıklanmıştır.
Bu sayfada, Google'ın karşılaştığı en yaygın sorunların nasıl tanımlanacağı ve bu kontrollerin devreye girdiği Docker korumalı alan özelliği aracılığıyla uzaktan yürütmeyle ilgili kısıtlamalara eşittir. Bu sayede uzaktan yürütme hizmetine ihtiyaç duymadan derlemenizle ilgili sorunları giderin.
Docker korumalı alan özelliği, uzaktan yürütme kısıtlamalarını şöyle olur:
Derleme işlemleri araç zinciri kapsayıcılarında yürütülür. Aynı derlemenizi bir hizmet aracılığıyla yerel olarak ve uzaktan çalıştırmak için araç zinciri container'ları container mimarisine alınmış uzaktan yürütmeyi destekler.
Hiçbir harici veri, container sınırını geçmez. Yalnızca açıkça bildirilen giriş ve çıkışlar, yalnızca container'a girip çıktıktan sonra ilişkili derleme işlemi başarıyla tamamlanır.
Her işlem yeni bir container'da yürütülür. Yeni ve benzersiz bir kapsayıcı, otomatik olarak 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 kumandanınkine eşit kısıtlamalar uygular birkaç adım var. Ancak bu yöntem yerel araçları, eyaletleri ve verilerin derlemenize sızdırılmasına neden olur. Bu durum, uzaktan yürütmede sorunlara neden olur.
Docker container'ında sorun giderme. Bu yöntemle Bazel ve derleme işlemleri Docker container'ın içinde çalışır. Böylece, yerel kaynaklarınızdan araçları, durumları ve veri sızıntılarını ek olarak derlemeye uzaktan yürütmeye eşittir. Bu yöntem, çalışmaya devam etmesini sağlar. Bu yöntem deneyseldir 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'ı desteklemez korumalı alan özelliği.
- bazel-toolchains'i ekleyin
depo, derlemenizin
WORKSPACE
dosyasına en son sürüm sürümüne sabitlenmiş burada açıklandığı gibidir. - Özelliği etkinleştirmek için
.bazelrc
dosyanıza işaret ekleyin. Dosyayı şurada oluşturun: Bazel projenizin kök dizinini değil, dizini oluşturmanız gerekir. Aşağıdaki bayraklar referans örneklemdir. Lütfen son gelişmeleri inceleyin.bazelrc
dosyasını seçin ve tanımlanan flag'lerin değerlerini kopyalayındocker-sandbox
yapılandırması için burada.
# 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 özel bir Docker container'ı oluşturun. ve bina bir resim yükleyin.
Yukarıdaki
--experimental_docker_image
işaretinin değerini özel container görüntünüzün adını girin.
Yerel olarak sorun giderme
Bu yöntem, Bazel'i ve tüm derleme işlemlerini doğrudan yerel Bu, derlemenizin yeni bir çözüm geliştirildiğinde derlemenizin uzaktan yürütülür.
Ancak bu yöntemle yerel olarak yüklenmiş araçlar, ikili programlar ve veriler sızdırabilir özellikle de yapılandırma stili WORKSPACE kuralları kullanıyorsa derlemenize ekleyin. Bu tür sızıntılar uzaktan yürütmede sorunlara neden olur; Docker kapsayıcısıyla ilgili sorunları giderin ve yerel olarak sorun giderme adımlarına göz atın.
1. Adım: Derlemeyi çalıştırın
Yürütülen Bazel komutuna
--config=docker-sandbox
işaretini ekleyin kullanabilirsiniz. Örneğin:bazel --bazelrc=.bazelrc build --config=docker-sandbox target
Derlemeyi çalıştırın ve tamamlanmasını bekleyin. Derleme en fazla dört tane olacak şekilde kat daha yavaş olduğunu gösterir.
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
ve
mevcut kullanıcı hesabı. Docker belgelerine bakın
konulu videomuzu izleyin. 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ında referans verilen dosya, araç, ikili program veya kaynak yok. Etkilenen hedeflerin tüm bağımlılıklarının açıkça belirtin. Görüntüleyin Dolaylı bağımlılıkları yönetme konulu videomuzu izleyin.
Mutlak bir yol ya da
PATH
değişkeni eksik. Gerekli tüm araçların düzgün şekilde gerçekleştirmek için araç zinciri kapsayıcısını ve araç zinciri kurallarını eksik kaynağa işaret eden bağımlılıkları tanımlamalısınız. Görüntüleyin Araç zinciri kurallarıyla derleme araçlarını çağırma konulu videomuzu izleyin.İkili program yürütmesi başarısız olur. Derleme kurallarından biri, yürütme ortamıyla (Docker container'ı) uyumlu değildir. Görüntüleyin Platforma bağlı ikili programları yönetme konulu videomuzu izleyin. Sorunu çözemezseniz bazel-discuss@google.com adresiyle iletişime geçin. bakın.
@local-jdk
dosyasındaki bir dosya eksik veya hatalara neden oluyor. Java ikili programları somut olarak ortaya koyar.java_toolchain
kullanın kurallarınızda ve hedeflerinizde@local_jdk
yerine. 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 ve Bazel'ın derlemesi Docker'ın oluşturduğu bağımsız araç zinciri container'larında işlemler yürütülür korumalı alan özelliği. Korumalı alan, her cihaz için yepyeni bir araç zinciri kapsayıcısı oluşturur. derleme işlemi olduğundan ve her araç zinciri container'ında yalnızca bir işlem yürütülür.
Bu yöntem, ana makinede yüklü araçlar üzerinde daha ayrıntılı kontrol sağlar. bahsedeceğim. Yapının yürütülmesinin yürütülmesinden ayrılarak gerekli olan birçok kontrole sahip olduğunu doğrulamak için, derlemenizin yerel yürütme ortamına bağımlı olup olmadığını kontrol edin.
1. Adım: Kapsayıcıyı oluşturun
Docker container'ını oluşturan ve Bazel'i yükleyen bir
Dockerfile
oluşturun ile aşağıdaki işlemleri yapmanızı sağlar: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, yerine, derlemek istediğiniz ana makinenizdeki kaynak kodunun yolunu kullanın.
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
dizini. Bu, Bazel'in başka Docker container'ları oluşturmasına ve
Bu kapsayıcılarla dosya paylaşmak için /tmp
altındaki dizinleri kullanın. Kaynağınız
kodu, kapsayıcının içindeki /src
adresinde bulunabilir.
Bu komut, kasıtlı olarak şu özelliklere sahip bir debian:stretch
temel container'dan başlar:
olarak kullanılan rbe-ubuntu16-04
kapsayıcısıyla uyumlu olmayan ikili programları içerir
araç zinciri kapsayıcısını açın. Yerel ortamdaki ikili programlar
araç zinciri container'ı kaldı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ök olarak ayarlanır ve bu nedenle ana makinenin içinden aynı mutlak yolla erişilebilen bir dizin Docker'ın oluşturduğu araç zinciri container'larından Bazel'in çalıştığı container korumalı alan özelliğini kullanabilir. Bu özellikte, Bazel'in derleme işlemlerinin çalıştığı yerel alan adından ve çalıştığı ana makine ve işlem container'larıdır.
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ı yetersiz" olarak başarısız oluyorsa bu sayıyı artırabilirsiniz. sınırı, ana makine kapsayıcısını
--memory=XX
işaretiyle başlatın;XX
burada gigabayt cinsinden ayrılan disk alanıdır. Bu deneme amaçlıdır ve öngörülemeyen davranışlara yol açabilir.Derleme, analiz veya yükleme aşamalarında başarısız olursa WORKSPACE dosyasında tanımlanan derleme kurallarınız ile uyumlu değil ele alacağız. Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama bölümünü inceleyin. başlıklı bölüme 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.