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

7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

  • 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 kapsayıcıda yürütülür. Üretilen her derleme işlemi için yeni ve benzersiz bir container oluşturulur.

Aşağıdaki yöntemlerden birini kullanarak bu sorunları 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 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, daha önce 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ş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 son .bazelrc dosyasına bakın 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ükleyip görüntüyü yerel olarak derleyerek özel bir Docker kapsayıcısı oluşturun.

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

  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.

Bunu yaparsanız --experimental_docker_verbose işaretini kullanarak derlemeyi tekrar çalıştırın. Bu işaret, ayrıntılı hata mesajlarını etkinleştirir. Bu hata genellikle Docker kurulumunun hatalı olmasından veya işlemi 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.

  • Bazel çalıştırma dosyaları ağacının başvuruda bulunduğu 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 yol tarafından başvurulan bir dosya, araç, ikili program veya kaynak ya da PATH değişkeni 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ç seti kuralları aracılığıyla derleme araçlarını çağırma başlıklı makaleyi inceleyin.

  • İkili program yürütmesi başarısız olur. Derleme kurallarından biri, yürütme ortamıyla (Docker container'ı) uyumlu olmayan bir ikili programı referans alıyor. 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 ile iletişime geçin.

  • @local-jdk dosyasındaki bir dosya eksik veya hatalara neden oluyor. Yerel makinenizdeki Java ikili dosyaları, derlemeyle uyumlu olmasa da derlemeye sızıyor. Kurallarınızda ve hedeflerinizde @local_jdk yerine java_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 ile iletişime geçin.

Docker container'ında sorun giderme

Bu yöntemde Bazel, ana makine Docker container'ının içinde çalışır ve Bazel'in derleme işlemleri, Docker korumalı alan özelliği tarafından oluşturulan ayrı araç zinciri container'larında yürütülür. Korumalı alan, her derleme işlemi için yepyeni bir araç zinciri kapsayıcı 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ı 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 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
    
  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, 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, container'ı kök olarak çalıştırır, Docker soketini eşler ve /tmp dizinini ekler. 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, container'ın içindeki /src konumundadır.

Komut, 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 container'ından 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: Tespit edilen sorunları çözün

Derleme hatalarını aşağıdaki şekilde çözebilirsiniz:

  • Derleme "disk alanı dolu" hatasıyla başarısız olursa ana kapsayıcıyı --memory=XX işaretiyle başlatarak bu sınırı artırabilirsiniz. Burada XX, 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 çö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.