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

Sorun bildir Kaynağı göster

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 Uzak 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 meydana gelen en yaygın sorunların nasıl tanımlanacağı ve çözümleneceği açıklanmaktadır. Bu durum, derlemeye uzaktan yürütmedekine eşit kısıtlamalar uygular. Böylece 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 şekilde taklit eder:

  • Derleme işlemleri araç zinciri container'larında yürütülür. Derlemenizi, container mimarisine alınmış uzaktan yürütmeyi destekleyen bir hizmet aracılığıyla yerel ve uzaktan çalıştırmak için aynı araç zinciri container'larını kullanabilirsiniz.

  • Hiçbir dış veri, kapsayıcı sınırından geçmez. Yalnızca açıkça belirtilen giriş ve çıkışlar, kapsayıcıya girip burada kalır ve ancak ilgili derleme işlemi başarıyla tamamlandıktan sonra olur.

  • 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 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, derlemeyi uzaktan yürütmeyle eşit şekilde sınırlar. Ancak bu yöntem yerel araçları, durumları ve derlemenize sızan verileri algılamaz. Bu da uzaktan yürütmede sorunlara neden olur.

  • Docker container'larında sorun giderme. Bu yöntemle, Bazel ve derleme işlemleri Docker container'ı içinde çalıştırılır. Bu sayede, yerel makineden derlemeye sızan araçları, durumları ve verileri tespit edebilirsiniz. Ayrıca, uzaktan yürütmede olduğu gibi kısıtlamalar da uygulayabilirsiniz. Bu yöntem, derlemenin bazı bölümleri başarısız olsa bile yapınızla ilgili analiz sağlar. Bu yöntem deneyseldir ve resmi olarak desteklenmez.

Ön koşullar

Sorun giderme işlemine başlamadan önce, henüz yapmadıysanız aşağıdakileri yapın:

  • Docker'ı yükleyip çalıştırmak için gereken izinleri yapılandırın.
  • Bazel 0.14.1 veya sonraki bir sürümünü yükleyin. Önceki sürümler Docker korumalı alanı özelliğini desteklemez.
  • En son sürüm sürümüne sabitlenmiş olan bazel-araç zincirleri deposunu derlemenizin WORKSPACE dosyasına burada açıklandığı gibi ekleyin.
  • Özelliği etkinleştirmek için .bazelrc dosyanıza işaret ekleyin. Dosyayı Bazel projenizin kök dizininde (mevcut değilse) oluşturun. Aşağıdaki bayraklar bir referans örneğidir. Lütfen Bazel-toolchains deposundaki en son .bazelrc dosyasına bakın ve docker-sandbox yapılandırması için burada tanımlanan işaret 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 için ek araçlar gerekiyorsa aşağıdakileri yapın:

  1. Dockerfile kullanarak araçlar yükleyerek ve görüntüyü yerel olarak oluşturarak özel bir Docker kapsayıcısı 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'ı 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, yerel olarak yüklenmiş araçlar, ikili programlar ve veriler, özellikle yapılandırma stilinde WORKSPACE kuralları kullanıyorsa derlemenize sızabilir. Bu tür sızıntılar, uzaktan çalıştırma açısından sorunlara neden olur. Bunları tespit etmek için yerel olarak sorun gidermenin yanı sıra 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. 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 kurulumundan veya mevcut kullanıcı hesabı altında uygulamayı çalıştırmak için gerekli izinlerin olmamasından kaynaklanır. Daha fazla bilgi için Docker belgelerine bakın. Sorunlar devam ederse Docker container'ı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 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 tanımlandığını onaylayın. Daha fazla bilgi için Dolaylı bağımlılıkları yönetme bölümüne bakın.

  • Mutlak bir yol veya PATH değişkeni tarafından başvurulan bir dosya, araç, ikili program ya da 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ıyla derleme araçlarını çağırma bölümüne bakın.

  • İkili program yürütme başarısız oluyor. Derleme kurallarından biri, yürütme ortamıyla uyumlu olmayan bir ikili programa (Docker container'ı) referans vermektir. 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 adresine e-posta gönderin.

  • @local-jdk alanındaki bir dosya eksik veya hatalara neden oluyor. Yerel makinenizdeki Java ikili programları derlemeye sızıyor ve yapıyla uyumsuz. Kurallarınızda ve hedeflerinizde @local_jdk yerine java_toolchain kullanın. Daha fazla yardıma ihtiyacınız olursa bazel-discuss@google.com adresine e-posta gönderebilirsiniz.

  • Diğer hatalar. Yardım için bazel-discuss@google.com adresine e-posta gönderin.

Docker container'larında sorun giderme

Bu yöntemle, Bazel bir ana makine Docker kapsayıcısında çalışır ve Bazel'in derleme işlemleri Docker korumalı alanı özelliği tarafından oluşturulan bağımsız araç zinciri kapsayıcı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 bir araç zinciri kapsayıcısı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 denetlenmesini sağlar. Derlemenin yürütülmesini derleme işlemlerinden ayrı tutarak ve yüklü araçları minimum düzeyde tutarak derlemenizin yerel yürütme ortamına bağımlılığı olup olmadığını doğrulayabilirsiniz.

1. Adım: Kapsayıcıyı oluşturun

  1. Docker container'ını oluşturan ve minimum derleme araçları setiyle Bazel'i 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, ana makinenizdeki kaynak kodun yolunu, oluşturmak istediğiniz şekilde 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, Bazel'ın diğer Docker kapsayıcıları oluşturmasına ve /tmp altındaki dizinleri kullanarak bu container'larla dosya paylaşmasına olanak tanır. Kaynak kodunuza kapsayıcının içinde /src adresinden ulaşabilirsiniz.

Komut kasıtlı olarak, araç zinciri kapsayıcısı olarak kullanılan rbe-ubuntu16-04 kapsayıcısıyla uyumlu olmayan ikili programlar içeren bir debian:stretch temel kapsayıcısından başlar. Yerel ortamdaki ikili programlar araç zinciri kapsayıcısına sızdırılıyorsa derleme hatalarına neden olurlar.

3. Adım: Kapsayıcıyı test edin

Docker container'ını test etmek için 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ı köktür. Bu nedenle, Bazel'in çalıştığı ana makine kapsayıcısının içinden, Bazel'ın derleme işlemlerinin çalıştırıldığı Docker korumalı alan özelliği tarafından oluşturulan araç zinciri container'larından ve ana makine ile işlem kapsayıcılarının çalıştığı yerel makineden aynı mutlak yol ile 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ı yetersiz" hatasıyla başarısız olursa ana makine kapsayıcısı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 öngörülemeyen davranışlara yol açabilir.

  • Derleme, analiz veya yükleme aşamaları sırasında başarısız olursa WORKSPACE dosyasında tanımlanan derleme kurallarından biri 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ı çözme bölümündeki sorun giderme adımlarına bakın.