Uzaktan Önbelleğe Alma

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bu sayfada uzaktan önbelleğe alma, önbelleği barındıracak sunucu ayarlama ve derlemeleri otomatik olarak oluşturur.

Uzak önbellek, bir geliştirici ekibi ve/veya sürekli entegrasyon tarafından kullanılır. (CI) sistemi tarafından oluşturulur. Derlemeniz yeniden oluşturulabiliyorsa bir makineden alınan çıkışlar başka bir makinede güvenli bir şekilde yeniden kullanılabilir. Böylece, çok daha hızlı oluşturuyor.

Genel Bakış

Bazel, bir yapıyı işlem adı verilen ayrı adımlara böler. Her işlem girişler, çıkış adları, komut satırı ve ortam değişkenleri bulunur. Zorunluluk girişler ve beklenen çıkışlar her işlem için açık bir şekilde bildirilir.

Bir sunucuyu derleme çıkışları için uzak önbellek olacak şekilde ayarlayabilirsiniz. Bunlar: ve işlem çıkışları gibi öğeler içerebilir. Bu çıkışlar, çıkış dosyası adlarının bir listesinden ve karmalarını oluşturun. Uzak bir önbellek sayesinde derleme çıkışlarını yeniden kullanabilirsiniz yerel olarak derlemek yerine başka bir kullanıcının derlemesini kullanabilirsiniz.

Uzaktan önbelleğe alma özelliğini kullanmak için:

  • Sunucuyu önbelleğin arka ucu olarak ayarlama
  • Bazel derlemesini uzak önbelleği kullanacak şekilde yapılandırma
  • Bazel 0.10.0 veya sonraki bir sürümü kullanın

Uzak önbellek iki tür veri depolar:

  • İşlem karmalarının işlem sonucu meta verilerine yönelik bir haritası olan işlem önbelleği.
  • Çıkış dosyalarının içeriğiyle ilgili adreslenebilir bir depo (CAS).

Uzak önbelleğin her öğe için ek olarak stdout ve stderr depoladığını unutmayın. eyleme dökülebilir. Bu nedenle, Bazel'in stdout/stderr'ini incelemek aşağıdakiler için iyi bir sinyal değildir: önbellek isabetlerini tahmin etme.

Bir derleme uzaktan önbelleğe almayı nasıl kullanır?

Bir sunucu uzak önbellek olarak ayarlandıktan sonra önbelleği birden fazla yöntemler:

  • Uzak önbelleğe okuma ve yazma
  • Belirli hedefler hariç uzak önbelleğe okuma ve/veya yazma
  • Yalnızca uzak önbellekten oku
  • Uzak önbelleği hiç kullanma

Uzak önbelleği okuyabilen ve ona yazabilen bir Bazel derlemesi çalıştırdığınızda derleme şu adımları izler:

  1. Bazel, oluşturulması gereken hedeflerin grafiğini oluşturur ve ardından gerekli işlemlerin listesidir. Bu işlemlerin her birinde tanımlanmış girişler var ve çıkış dosya adları kullanır.
  2. Bazel, yerel makinenizi mevcut derleme çıkışları için kontrol eder ve mevcut derleme çıktılarını bir çözüm bulur.
  3. Bazel, mevcut derleme çıkışları için önbelleği kontrol eder. Çıkış bulunursa Bazel, çıkışı alır. Bu bir önbellek isabetidir.
  4. Çıkışların bulunamadığı gerekli işlemler için Bazel, eylemleri yerel olarak yapar ve gerekli derleme çıkışlarını oluşturur.
  5. Yeni derleme çıkışları, uzak önbelleğe yüklenir.

Önbelleğin arka ucu olarak sunucu ayarlama

Önbelleğin arka ucu olarak işlev görecek bir sunucu kurmanız gerekir. HTTP/1.1 sunucu Bazel'ın verilerini opak bayt olarak ve birçok mevcut sunucuyu uzaktan önbelleğe alma arka ucu olarak kullanılabilir. Bazel'in HTTP Önbelleğe Alma Protokolü, uzaktan kumandayı destekler. önbelleğe alma.

Arka ucu seçmek, ayarlamak ve bakımını yapmaktan siz sorumlusunuz yeni bir sunucu oluşturabilirsiniz. Sunucu seçerken şunları göz önünde bulundurun:

  • Ağ hızı. Örneğin ekibiniz aynı ofisteyse kendi yerel sunucunuzu çalıştırmak isteyebilirsiniz.
  • Güvenlik. Uzak önbellekte ikili dosyalarınız bulunur ve bu nedenle güvenli olmaları gerekir.
  • Yönetim kolaylığı. Örneğin, Google Cloud Storage tümüyle yönetilen bir hizmettir.

Uzak önbellek için kullanılabilecek birçok arka uç vardır. Bazı seçenekler şunlardır:

nginx

nginx, açık kaynak bir web sunucusudur. [WebDAV modülüyle], olarak kullanılır. Debian ve Ubuntu'da nginx-extras paketi. macOS'te nginx, Homebrew üzerinden kullanılabilir:

brew tap denji/nginx
brew install nginx-full --with-webdav

Aşağıda, nginx için örnek bir yapılandırma verilmiştir. Şunu yapmanız gerektiğini unutmayın: /path/to/cache/dir öğesini, nginx'in izni olduğu geçerli bir dizinle değiştirin okumayı öğretiyor. client_max_body_size seçeneğini daha büyük çıkış dosyalarınız varsa daha büyük bir değer elde edebilirsiniz. Sunucu için yapılandırma gibi.

nginx.conf içindeki server bölümü için örnek yapılandırma:

location /cache/ {
  # The path to the directory where nginx should store the cache contents.
  root /path/to/cache/dir;
  # Allow PUT
  dav_methods PUT;
  # Allow nginx to create the /ac and /cas subdirectories.
  create_full_put_path on;
  # The maximum size of a single file.
  client_max_body_size 1G;
  allow all;
}

bazel-uzaktan

bazel-remote, üzerinde kullanabileceğiniz açık kaynaklı bir uzak derleme önbelleğidir güçlü bir yoludur. Şu şirkette üretimde başarıyla kullanıldı: çeşitli şirketlerde başarılı bir proje yöneticisi oldu. Bazel projesinin bazel-remote teknik destek sağlamıyor.

Bu önbellek, içerikleri diskte depolar ve ayrıca atık toplama sağlar depolama alanını artırın ve kullanılmayan yapıları temizleyin. Önbellek [docker görüntüsü] olarak mevcut ve kodu GitHub'a gidin. Hem REST hem de gRPC uzak önbellek API'leri desteklenir.

GitHub'a bakın sayfasına bakın.

Google Cloud Storage

[Google Cloud Storage], sağladığı eksiksiz yönetilen bir nesne deposudur ve Bazel'in uzaktan önbelleğe alma protokolüyle uyumlu olan HTTP API. Bunun için Faturalandırmanın etkin olduğu bir Google Cloud hesabınız olduğundan emin olun.

Cloud Storage'ı önbellek olarak kullanmak için:

  1. Depolama paketi oluşturun. Ağ bant genişliği olarak size en yakın paket konumunu seçtiğinizden emin olun. için önemlidir.

  2. Cloud Storage'da kimlik doğrulaması yapmak üzere Bazel için bir hizmet hesabı oluşturun. Görüntüleyin Hizmet hesabı oluşturma.

  3. Gizli bir JSON anahtarı oluşturun ve kimlik doğrulaması için bunu Bazel'a iletin. Mağaza Anahtara sahip olan herkes rastgele verileri okuyup yazabileceğinden, anahtarı güvenli bir şekilde kullanma ile GCS paketinizden gönderebilirsiniz.

  4. Bazel komutunuza aşağıdaki işaretleri ekleyerek Cloud Storage'a bağlanın:

    • İşareti kullanarak aşağıdaki URL'yi Bazel'e iletin: --remote_cache=https://storage.googleapis.com/bucket-name, burada bucket-name, depolama paketinizin adıdır.
    • Kimlik doğrulama anahtarını şu işareti kullanarak geçirin: --google_credentials=/path/to/your/secret-key.json veya Uygulama Kimlik Doğrulaması'nı kullanmak için --google_default_credentials.
  5. Cloud Storage'ı eski dosyaları otomatik olarak silecek şekilde yapılandırabilirsiniz. Bunu yapmak için bkz. Nesne Yaşam Döngülerini Yönetme.

Diğer sunucular

PUT ve GET'yi önbellek için destekleyen herhangi bir HTTP/1.1 sunucusunu arka uçta olması gerekir. Kullanıcılar, Hazelcast gibi önbelleğe alma arka uçlarının başarılı olduğunu bildirdi. Apache httpd ve AWS S3.

Kimlik doğrulama

0.11.0 sürümünden itibaren Bazel'e HTTP Temel Kimlik Doğrulaması için destek eklendi. Uzak önbellek URL'si aracılığıyla Bazel'a bir kullanıcı adı ve şifre aktarabilirsiniz. İlgili içeriği oluşturmak için kullanılan söz dizimi https://username:password@hostname.com:port/path şeklindedir. Lütfen HTTP Temel Kimlik Doğrulaması, kullanıcı adını ve şifreyi ağıdır ve bu nedenle HTTPS ile kullanmak çok önemlidir.

HTTP önbelleğe alma protokolü

Bazel, HTTP/1.1 aracılığıyla uzaktan önbelleğe almayı destekler. Protokol, kavramsal olarak basittir: İkili program verileri (BLOB), PUT istekleri aracılığıyla yüklenir ve GET istekleri aracılığıyla indirilir. İşlem sonucu meta verileri /ac/ yolu altında, çıkış dosyaları da saklanır. /cas/ yolunun altında.

Örneğin, http://localhost:8080/cache altında çalışan bir uzak önbellek düşünün. SHA256 ile bir işleme ait işlem sonucu meta verilerini indirme Bazel isteği karma 01ba4719... aşağıdaki gibi görünür:

GET /cache/ac/01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b HTTP/1.1
Host: localhost:8080
Accept: */*
Connection: Keep-Alive

15e2b0d3... SHA256 karmasına sahip çıkış dosyasını yükleme CAS şöyle görünecektir:

PUT /cache/cas/15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225 HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Length: 9
Connection: Keep-Alive

0x310x320x330x340x350x360x370x380x39

Bazel'ı uzak önbelleği kullanarak çalıştırma

Sunucu uzak önbellek olarak ayarlandıktan sonra, Google'da kullandığınız uzak önbelleği için Bazel komutunuza bayrak eklemeniz gerekir. Yapılandırma listesine bakın ve daha fazla bilgi edineceksiniz.

Ayrıca, kullanıcı ayarlarınıza özel kimlik doğrulamayı da seçilen sunucudur.

Bunu engellemek için bu işaretleri bir .bazelrc dosyasına eklemek isteyebilirsiniz. kullanmanız gerekir. Projenize ve ekibinize ekip dinamikleri için aşağıdaki şartları karşılayan bir .bazelrc dosyasına işaret ekleyebilirsiniz:

  • Yerel makinenizde
  • Projenizin çalışma alanında, ekibinizle paylaşılan
  • CI sisteminde

Uzak önbelleğe alma ve uzak önbelleğe yazma

Uzak önbelleğe kimlerin yazabileceğine dikkat edin. İstebilirsiniz yalnızca CI sisteminiz tarafından kontrol edilmesi gerekir.

Uzak önbelleğe almak ve önbelleğe almak için aşağıdaki işareti kullanın:

build --remote_cache=http://your.host:port

HTTP dışında şu protokoller de desteklenir: HTTPS, grpc, grpcs.

Yalnızca uzak önbellek:

build --remote_upload_local_results=false

Belirli hedefleri uzak önbellekten hariç tutun

Belirli hedeflerin uzak önbelleği kullanmasını engellemek için hedefi no-remote-cache Örneğin:

java_library(
    name = "target",
    tags = ["no-remote-cache"],
)

Uzak önbellekten içerik silin

Uzak önbellekten içerik silmek, sunucunuzu yönetme işleminin bir parçasıdır. Uzak önbellekten nasıl içerik sileceğiniz, kullandığınız sunucuya bağlıdır olarak ayarlanacak. Çıkışları silerken önbelleğin tamamını silin ya da veya eski çıkışları silebilirsiniz.

Önbelleğe alınan çıkışlar bir ad ve karma grubu olarak depolanır. Silinirken çıkışın belirli bir ürüne ait olduğunu ayırt etmenin hiçbir yolu yoktur. seçeceğiz.

Aşağıdakileri yapmak için içeriği önbellekten silmek isteyebilirsiniz:

  • Önbellek bozulduktan sonra temiz bir önbellek oluşturma
  • Eski çıkışları silerek kullanılan depolama alanı miktarını azaltın

Unix prizler

Uzak HTTP önbelleği, unix alan adı yuvaları üzerinden bağlanmayı destekler. Davranış curl'ün --unix-socket işaretine benzer. Unix'i yapılandırmak için aşağıdakileri kullanın alan adı yuvası:

   build --remote_cache=http://your.host:port
   build --remote_cache_proxy=unix:/path/to/socket

Bu özellik Windows'da desteklenmez.

Disk önbelleği

Bazel, dosya sistemindeki bir dizini uzak önbellek olarak kullanabilir. Bu dallar arasında geçiş yaparken ve/veya çalışırken derleme yapılarını paylaşmak için kullanışlıdır aynı projenin birden fazla çalışma alanında (ör. birden fazla ödeme) kullanılabilir. Başlangıç Bazel, dizini çöp kutusuna toplamaz. Belirli bir web sitesindeki bir düzenli olarak temizlenecek. Disk önbelleğini aşağıdaki şekilde etkinleştirin:

build --disk_cache=path/to/build/cache

~ takma adını kullanarak --disk_cache işaretine kullanıcıya özel bir yol aktarabilirsiniz (Bazel, geçerli kullanıcının ana dizininin yerini alır). Bu, faydalı projenin tüm geliştiricileri için disk önbelleğini etkinleştirirken .bazelrc dosyada giriş yaptı.

Bilinen sorunlar

Derleme sırasında dosya değişikliği girme

Derleme sırasında bir giriş dosyası değiştirildiğinde Bazel geçersiz uzak önbelleğe alınır. Değişiklik algılamayı --experimental_guard_against_concurrent_changes işareti. Orada bilinen bir sorun değildir ve gelecekteki bir sürümde varsayılan olarak etkinleştirilecektir. Güncellemeler için [sorun numarası 3360] sayfasına göz atın. Genel olarak, işlem sırasında kaynak dosyalarında seçeceğiz.

İşleme sızdıran ortam değişkenleri

İşlem tanımı ortam değişkenlerini içerir. Bu durum önbellek isabetlerini makineler arasında paylaşmasını sağlar. Örneğin, farklı $PATH değişkenleri önbellek isabetlerini paylaşmaz. Yalnızca ortam değişkenleri --action_env aracılığıyla açıkça beyaz listeye eklenmiş olanlar bir işleme dahil ediliyorsa belirler. /etc/bazel.bazelrc yüklemek için Bazel'ın Debian/Ubuntu paketi kullanıldı $PATH dahil ortam değişkenlerinin beyaz listesiyle birlikte. Örneğin, daha az önbellek isabeti varsa, ortamınızda eski bir önbellek adı veya /etc/bazel.bazelrc dosyası yükleyin.

Bazel, çalışma alanının dışındaki araçları izlemez

Bazel şu anda çalışma alanının dışındaki araçları izlememektedir. Bu, bir bir sorun teşkil eder (örneğin, bir işlem /usr/bin/ kaynağından bir derleyici kullanıyorsa). Ardından, farklı derleyici yüklü iki kullanıcı önbellek isabetlerini yanlış bir şekilde paylaşır çünkü çıkışlar farklı ama aynı işlem karmasına sahip. Görüntüleyin sorun numarası 4558 olarak bildirilmelidir.

Docker container'larında derlemeler çalıştırılırken artımlı bellek içi durum kaybediliyor Bazel, tek Docker container'ında çalışırken bile sunucu/istemci mimarisini kullanır. Sunucu tarafında Bazel, derlemeleri hızlandıran bir bellek içi durumu sağlar. CI gibi Docker container'larının içinde derlemeler çalıştırırken bellek içi durumu kaybolur ve Bazel'ın uzak önbelleği kullanmadan önce bunu yeniden oluşturması gerekir.