Bu sayfada uzak önbelleğe alma, önbelleği barındıracak bir sunucu oluşturma ve uzak önbelleği kullanarak derleme çalıştırma konuları ele alınmaktadır.
Uzak önbellek, derleme çıkışlarını paylaşmak için bir geliştirici ekibi ve/veya sürekli entegrasyon (CI) sistemi tarafından kullanılır. Derlemeniz yeniden üretilebiliyorsa bir makinedeki çıkışlar başka bir makinede güvenli bir şekilde yeniden kullanılabilir. Bu da derlemeleri önemli ölçüde hızlandırabilir.
Genel Bakış
Bazel, derlemeyi işlem adı verilen ayrı adımlara ayırır. Her işlemde girişler, çıkış adları, komut satırı ve ortam değişkenleri bulunur. Her işlem için gerekli girişler ve beklenen çıkışlar açıkça belirtilir.
Bir sunucuyu, derleme çıkışları olan uzak önbellek (bu işlem çıkışları) için ayarlayabilirsiniz. Bu çıkışlar, çıkış dosyası adlarının listesinden ve içeriklerinin karma değerlerinden oluşur. Uzak önbellek sayesinde her yeni çıkışı yerel olarak oluşturmak yerine başka bir kullanıcının derlemesindeki derleme çıkışlarını yeniden 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 önbellekte iki tür veri depolanır:
- İşlem karmalarının işlem sonucu meta verileriyle eşlendiği bir harita olan işlem önbelleği.
- Çıkış dosyalarının içerik adreslenebilir deposu (CAS).
Uzaktan önbelleğin her işlem için stdout ve stderr'yi de depoladığını unutmayın. Bu nedenle, Bazel'ın stdout/stderr'inin incelenmesi önbellek isabetlerini tahmin etmek için iyi bir sinyal değildir.
Bir derleme uzaktan önbelleğe almayı nasıl kullanır?
Uzak önbellek olarak ayarlanan bir sunucuyu birden fazla şekilde kullanabilirsiniz:
- Uzak önbelleği okuma ve yazma
- Belirli hedefler hariç uzak önbelleğe okuma ve/veya yazma
- Yalnızca uzak önbellekten oku
- Uzak önbelleği hiç kullanmama
Uzaktan önbelleğe okuma ve yazma yapabilen bir Bazel derlemesi çalıştırdığınızda derleme aşağıdaki adımları uygular:
- Bazel, oluşturulması gereken hedeflerin grafiğini ve ardından gerekli işlemlerin listesini oluşturur. Bu işlemlerin her birinin tanımlanmış girişleri ve çıkış dosya adları vardır.
- Bazel, yerel makinenizi mevcut derleme çıkışları için kontrol eder ve bulduklarını yeniden kullanır.
- Bazel, mevcut derleme çıkışları için önbelleği kontrol eder. Çıkış bulunursa Bazel, çıktı alır. Bu bir önbellek isabetidir.
- Çıkışların bulunamadığı gerekli işlemler için Bazel, işlemleri yerel olarak yürütür ve gerekli derleme çıkışlarını oluşturur.
- Yeni derleme çıkışları uzak önbelleğe yüklenir.
Önbelleğin arka ucu olarak sunucu ayarlama
Önbelleğin arka ucu olarak kullanılacak bir sunucu oluşturmanız gerekir. HTTP/1.1 sunucusu, Bazel'in verilerini opak baytlar olarak işleyebilir. Bu nedenle, birçok mevcut sunucu uzak önbelleğe alma arka ucu olarak kullanılabilir. Uzak önbelleğe almayı destekleyen Bazel'in HTTP Önbelleğe Alma Protokolü'dür.
Önbelleğe alınan çıkışları depolayacak arka uç sunucuyu seçmek, kurmak ve yönetmek sizin sorumluluğunuzdadır. Sunucu seçerken aşağıdakileri 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.
- Kolay yönetim. Ö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ü] ile
Bazel için uzak önbellek olarak kullanılabilir. Debian ve Ubuntu'da nginx-extras
paketini yükleyebilirsiniz. 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. /path/to/cache/dir
değerini, nginx'in yazma ve okuma iznine sahip olduğu geçerli bir dizinle değiştirmeniz gerektiğini unutmayın. Daha büyük çıkış dosyalarınız varsa client_max_body_size
seçeneğini daha büyük bir değerle değiştirmeniz gerekebilir. Sunucu için kimlik doğrulama gibi başka yapılandırmalar gerekir.
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, altyapınızda kullanabileceğiniz açık kaynaklı bir uzak derleme önbelleğidir. 2018'in başlarından bu yana çeşitli şirketlerde üretimde başarıyla kullanılmaktadır. Bazel projesinin bazel-remote için teknik destek sağlamadığını unutmayın.
Bu önbellek, içeriği diskte depolar ve üst depolama sınırını uygulamak ve kullanılmayan yapıları temizlemek için çöp toplama işlemi de sağlar. Önbellek [docker görüntüsü] olarak ve kodu GitHub'da mevcuttur. Hem REST hem de gRPC uzak önbellek API'leri desteklenir.
Nasıl kullanılacağıyla ilgili talimatlar için GitHub sayfasına bakın.
Google Cloud Storage
[Google Cloud Storage], Bazel'in uzak önbelleğe alma protokolüyle uyumlu bir HTTP API'si sağlayan, tamamen yönetilen bir nesne deposudur. Bunun için faturalandırmanın etkin olduğu bir Google Cloud hesabınız olmalıdır.
Cloud Storage'ı önbellek olarak kullanmak için:
Depolama paketi oluşturun. Ağ bant genişliği uzak önbelleğe almak için önemli olduğundan, size en yakın paket konumunu seçtiğinizden emin olun.
Bazel'in Cloud Storage'da kimlik doğrulaması yapması için bir hizmet hesabı oluşturun. Hizmet hesabı oluşturma başlıklı makaleye göz atın.
Gizli bir JSON anahtarı oluşturun ve ardından kimlik doğrulaması için Bazel'e iletin. Anahtarı güvende tutun. Anahtarı olan herkes GCS paketinize/paketinizden rastgele veri okuyabilir ve yazabilir.
Bazel komutunuza aşağıdaki işaretçileri ekleyerek Cloud Storage'a bağlanın:
- İşareti kullanarak şu URL'yi Bazel'a iletin:
--remote_cache=https://storage.googleapis.com/bucket-name
, buradabucket-name
, depolama paketinizin adıdır. - Kimlik doğrulama anahtarını
--google_credentials=/path/to/your/secret-key.json
işaretini kullanarak iletin veya uygulama kimlik doğrulamasını kullanmak için--google_default_credentials
işaretini kullanın.
- İşareti kullanarak şu URL'yi Bazel'a iletin:
Cloud Storage'ı eski dosyaları otomatik olarak silecek şekilde yapılandırabilirsiniz. Bunu yapmak için Nesne Yaşam Döngülerini Yönetme bölümünü inceleyin.
Diğer sunucular
PUT ve GET'i destekleyen herhangi bir HTTP/1.1 sunucusunu önbelleğin arka ucu olarak ayarlayabilirsiniz. Kullanıcılar Hazelcast, Apache httpd ve AWS S3 gibi arka uçları önbelleğe alma konusunda başarılı olduklarını bildirmiştir.
Kimlik doğrulama
0.11.0 sürümünden itibaren Bazel'e HTTP Temel Kimlik Doğrulaması için destek eklendi.
Uzaktan önbelleğe alma URL'si aracılığıyla Bazel'e kullanıcı adı ve şifre iletebilirsiniz. Söz dizimi https://username:password@hostname.com:port/path
şeklindedir. Temel HTTP Kimlik Doğrulaması'nın, kullanıcı adını ve şifreyi ağ üzerinden düz metin olarak ilettiğini unutmayın. Bu nedenle, bunların her zaman HTTPS ile kullanılması çok önemlidir.
HTTP önbelleğe alma protokolü
Bazel, HTTP/1.1 üzerinden uzaktan önbelleğe almayı destekler. Protokol kavramsal olarak basittir:
İkili veriler (BLOB) PUT istekleri aracılığıyla yüklenir ve GET istekleri aracılığıyla indirilir.
İşlem sonucu meta verileri /ac/
yolunda, çıkış dosyaları ise /cas/
yolu altında depolanır.
Örneğin, http://localhost:8080/cache
altında çalışan bir uzak önbellek düşünün.
SHA256 karması 01ba4719...
olan bir işlem için işlem sonucu meta verilerini indirme Bazel isteği aşağıdaki gibi görünür:
GET /cache/ac/01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b HTTP/1.1
Host: localhost:8080
Accept: */*
Connection: Keep-Alive
CAS'ye 15e2b0d3...
SHA256 karmasına sahip çıkış dosyası yüklemeyle ilgili bir Bazel isteği aşağıdaki gibi görünür:
PUT /cache/cas/15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225 HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Length: 9
Connection: Keep-Alive
0x310x320x330x340x350x360x370x380x39
Bazel'i uzak önbelleği kullanarak çalıştırma
Bir sunucu uzak önbellek olarak ayarlandıktan sonra uzak önbelleği kullanmak için Bazel komutunuza bayrak eklemeniz gerekir. Yapılandırma listesini ve işaretlemelerini aşağıda bulabilirsiniz.
Seçtiğiniz sunucuya özgü kimlik doğrulamasını da yapılandırmanız gerekebilir.
Bazel'i her çalıştırdığınızda bunları belirtmek zorunda kalmamak için bu işaretleri bir .bazelrc
dosyasına ekleyebilirsiniz. Projenize ve ekip dinamiklerinize bağlı olarak, aşağıdaki özelliklere sahip bir .bazelrc
dosyasına işaret ekleyebilirsiniz:
- Yerel makinenizde
- Projenizin çalışma alanında, ekiple paylaşılan
- CI sisteminde
Uzak önbellekten veri okuma ve önbelleğe veri yazma
Uzaktan önbelleğe yazma yetkisi olan kişilere dikkat edin. Uzak önbelleğe yalnızca CI sisteminizin yazabilmesini isteyebilirsiniz.
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
'ün yanı sıra aşağıdaki protokoller de desteklenir: HTTPS
, grpc
, grpcs
.
Yalnızca uzaktan önbellekten okumak için yukarıdaki işarete ek olarak aşağıdaki işareti de kullanın:
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
ile etiketleyin. Ö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. Uzaktan önbellekten içerik silme işlemi, önbellek olarak ayarladığınız sunucuya bağlıdır. Çıkışları silerken önbelleğin tamamını veya eski çıkışları silin.
Önbelleğe alınan çıkışlar bir ad ve karma grubu olarak depolanır. İçerik silinirken hangi çıkışın belirli bir derlemeye ait olduğunu ayırt etmenin bir yolu yoktur.
Önbellekten içerik silmek için:
- Önbelleğin bozulmasından 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. Bu davranış, curl'in --unix-socket
işaretine benzer. unix alan adı soketini yapılandırmak için şunu kullanın:
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 birden fazla ödeme gibi aynı projenin birden fazla çalışma alanında çalışırken derleme yapılarını paylaşmak için faydalıdır. 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 iletebilirsiniz (Bazel, mevcut kullanıcının ana dizini ile değiştirir). Bu özellik, projenin kontrol edilen .bazelrc
dosyası aracılığıyla projenin tüm geliştiricileri için disk önbelleğini etkinleştirirken kullanışlıdır.
Atık toplama
Bazel 7.4 sürümünden itibaren, disk önbelleği veya bağımsız önbellek girişlerinin yaşı için maksimum boyut ayarlamak üzere --experimental_disk_cache_gc_max_size
ve --experimental_disk_cache_gc_max_age
kullanabilirsiniz. Bazel, derlemeler arasında boştayken disk önbelleğini otomatik olarak çöp toplar. Boşta kalma zamanlayıcısı --experimental_disk_cache_gc_idle_delay
ile ayarlanabilir (varsayılan olarak 5 dakikadır).
Otomatik çöp toplama işlemine alternatif olarak, çöp toplama işlemini isteğe bağlı olarak çalıştırmaya yarayan bir araç da sunuyoruz.
Bilinen sorunlar
Derleme sırasında giriş dosyası değiştirme
Bir giriş dosyası derleme sırasında değiştirildiğinde Bazel, uzak önbelleğe geçersiz sonuçlar yükleyebilir. --experimental_guard_against_concurrent_changes
işaretiyle değişiklik algılamayı etkinleştirebilirsiniz. Bilinen bir sorun yoktur ve bu özellik gelecekteki bir sürümde varsayılan olarak etkinleştirilecektir.
Güncellemeler için [issue #3360] başlıklı makaleyi inceleyin. Genellikle derleme sırasında kaynak dosyalarda değişiklik yapmaktan kaçının.
Ortam değişkenlerinin bir işleme sızması
İşlem tanımı ortam değişkenlerini içerir. Bu, uzak önbellek isabetlerini makineler arasında paylaşırken soruna yol açabilir. Örneğin, farklı $PATH
değişkenlerine sahip ortamlar önbelleğe alınan isabetleri paylaşmaz. İşlem tanımına yalnızca --action_env
aracılığıyla açıkça beyaz listeye eklenen ortam değişkenleri dahil edilir. $PATH
dahil olmak üzere ortam değişkenlerinin beyaz listesiyle /etc/bazel.bazelrc
yüklemek için Bazel'in Debian/Ubuntu paketi kullanılıyordu. Beklenenden daha az önbellek isabeti alıyorsanız ortamınızda eski bir /etc/bazel.bazelrc
dosyası olmadığından emin olun.
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 durum, örneğin bir işlemde /usr/bin/
hizmetindeki bir derleyici kullanılıyorsa sorun olabilir. Ardından, farklı derleyiciler yüklemiş iki kullanıcı, çıkışlar farklı olmasına rağmen aynı işlem karmasına sahip olduğundan önbellek isabetlerini yanlış bir şekilde paylaşır. Güncellemeler için 4558 numaralı soruna bakın.
Derlemeler Docker kapsayıcılarında çalıştırıldığında artımlı bellek içi durum kaybedilir Bazel, tek bir Docker kapsayıcısında çalıştırıldığında bile sunucu/istemci mimarisini kullanır. Bazel, sunucu tarafında derlemeleri hızlandıran bellek içi bir durum sürdürür. CI'de olduğu gibi Docker kapsayıcılarında derlemeler çalıştırıldığında bellek içi durum kaybedilir ve Bazel'in uzak önbelleği kullanmadan önce durumu yeniden oluşturması gerekir.
Harici bağlantılar
Veri merkezinde derleme: Bazel ekibi, FOSDEM 2018'de uzaktan önbelleğe alma ve yürütme hakkında bir konuşma yaptı.
Daha hızlı Bazel geliştirmeleri uzaktan önbelleğe alma: karşılaştırmalı değerlendirme:Nicolò Valigi kaleme aldığı bir blog yayınında Bazel'deki uzaktan önbelleğe alma işlemlerini karşılaştırdı.