Docker Sandbox ile Bazel Uzaktan Yürütme Sorunlarını Giderme

Sorun bildirin Kaynağı göster

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 ve docker-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:

  1. Dockerfile kullanarak araçlar yükleyerek ve görüntüyü yerel olarak oluşturarak özel bir Docker container'ı oluşturun.

  2. 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

  1. Derlemenizi yürüten Bazel komutuna --config=docker-sandbox işaretini ekleyin. Örneğin:

    bazel --bazelrc=.bazelrc build --config=docker-sandbox target
    
  2. 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.

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

  1. 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
    
  2. 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. Burada XX, 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.