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: eylem çıktılarıdır. 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:
- 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.
- Bazel, yerel makinenizi mevcut derleme çıkışları için kontrol eder ve mevcut derleme çıktılarını bir çözüm bulur.
- Bazel, mevcut derleme çıkışları için önbelleği kontrol eder. Çıkış bulunursa Bazel, çıkışı alır. Bu bir önbellek isabetidir.
- Çıkışların bulunamadığı gerekli işlemler için Bazel, eylemleri yerel olarak yapar ve gerekli derleme çıkışlarını oluşturur.
- Yeni derleme çıkışları, uzak önbelleğe yüklenir.
Sunucuyu önbelleğin arka ucu olarak ayarlama
Önbelleğin arka ucu olarak işlev görecek bir sunucu oluşturmanı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:
Depolama paketi oluşturun. Ağ bant genişliği olarak size en yakın paket konumunu seçtiğinizden emin olun. için önemlidir.
Cloud Storage'da kimlik doğrulaması yapmak üzere Bazel için bir hizmet hesabı oluşturun. Görüntüleyin Hizmet hesabı oluşturma.
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.
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
, buradabucket-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
.
- İşareti kullanarak aşağıdaki URL'yi Bazel'e iletin:
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
UYARI: Bayt olmadan derleyin HTTP önbelleğiyle uyumlu değil. Maksimum performans artışı elde etmek için bunun yerine gRPC önbelleği kullanmayı düşünün.
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 hangi çıktını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_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
sorun (örneğin, bir işlem /usr/bin/
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ı içinde 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.
Harici bağlantılar
Veri Merkezinde Derlemeniz: Bazel ekibi, FOSDEM 2018'de uzaktan önbelleğe alma ve yürütme hakkında bir konuşma yaptı.
Daha hızlı Bazel için uzaktan önbelleğe alma yöntemi: karşılaştırma: Nicolò Valigi bir blog yayını yazdı Bu araçta Bazel'de uzaktan önbelleğe alma işlemlerini karşılaştırdı.