Kalıcı çalışanlar, derlemenizi hızlandırabilir. Eğer derlemenizde başlangıç maliyeti yüksek olan veya yüklenmeye yol açan işlemler alanlar arası önbelleğe alma özelliğinden yararlanıyorsanız, kendi kalıcı çalışanın bu işlemleri yapmasını sağlar.
Bazel sunucusu, çalışanla stdin
/stdout
aracılığıyla iletişim kurar. Google
protokol arabelleklerinin veya JSON dizelerinin kullanımını destekler.
Çalışan uygulaması iki bölümden oluşur:
Bir işi yapmak
Israrlı bir çalışan birkaç şartı yerine getirir:
- Okuyor
WorkRequests
stdin
ile başlayan fiyatlarla! - Yazar
WorkResponses
(yalnızca
WorkResponse
)stdout
cihazına. --persistent_worker
işaretini kabul eder. Sarmalayıcı,--persistent_worker
komut satırı işareti ve kendini yalnızca şu durumlarda kalıcı hale getir: işaret iletilmezse tek seferlik bir derleme yapması ve çıkması gerekir.
Programınız bu şartları karşılıyorsa, standart URL'ler yerine kalıcı yardımcı oluyor!
İş istekleri
WorkRequest
, çalışana yönelik bir bağımsız değişkenler listesi,
çalışanın erişebileceği girişleri temsil eden yol-özet çiftleri (bu,
ancak önbelleğe alma için bu bilgileri kullanabilirsiniz) ve istek kimliği (0)
tek yönlü çalışanlara yöneliktir.
NOT: Protokol arabellek spesifikasyonunda "yılan büyük/küçük harf" kullanılmasına rağmen (request_id
),
JSON protokolünde "deve büyük/küçük harf" kullanılır. (requestId
). Bu dokümanda büyük/küçük harf kullanımı
bu örnekte, alan hakkında konuşurken yılan şeklinde
protokolü.
{
"arguments" : ["--some_argument"],
"inputs" : [
{ "path": "/path/to/my/file/1", "digest": "fdk3e2ml23d"},
{ "path": "/path/to/my/file/2", "digest": "1fwqd4qdd" }
],
"requestId" : 12
}
İsteğe bağlı verbosity
alanı, ekstra hata ayıklama çıkışı istemek için kullanılabilir
hakkından bahsedeceğiz. Neyin nasıl üretileceği tamamen çalışanın işidir. Yüksek
değerleri daha ayrıntılı çıktıyı gösterir. --worker_verbose
işareti şu kullanıcıya iletiliyor:
Bazel, verbosity
alanını 10 olarak ayarlar ancak daha küçük veya daha büyük değerler kullanılabilir
manuel olarak da yükleyebilirsiniz.
İsteğe bağlı sandbox_dir
alanı yalnızca şunları destekleyen çalışanlar tarafından kullanılır:
Multiplex korumalı alan.
İş yanıtları
WorkResponse
; bir istek kimliği, sıfır veya sıfır olmayan bir çıkış kodu ve bir
işleme veya yürütme sırasında karşılaşılan hataları açıklayan çıkış dizesi
talep ediyor. output
alanında kısa bir açıklama yer alır; tüm günlükler
çalışanın stderr
öğesine yazılmalıdır. Çünkü çalışanlar yalnızca
WorkResponses
parametresinden stdout
değerine ayarlanırsa çalışan, stdout
yönergesini genellikle yönlendirir.
stderr
için kullandığı araçlardan biridir.
{
"exitCode" : 1,
"output" : "Action failed with the following message:\nCould not find input
file \"/path/to/my/file/1\"",
"requestId" : 12
}
Protobuflar standardına göre, tüm alanlar isteğe bağlıdır. Ancak, Bazel için
aynı isteğe sahip olması için WorkRequest
ve ilgili WorkResponse
idare eder, bu nedenle istek kimliği sıfır değilse belirtilmelidir. Bu geçerli bir
WorkResponse
{
"requestId" : 12,
}
request_id
değerinin 0 olması bir "singleplex" olduğunu gösterir istek, bu istekte kullanıldığında kullanılır
diğer isteklerle paralel olarak işlenemez. Sunucu,
belirli bir çalışan yalnızca request_id
0 veya yalnızca 0 ile istek alır
request_id
sıfırdan büyük. Singleplex istekleri seri olarak gönderilir
sunucu bir istek alana kadar başka bir istek göndermezse
yanıtı (iptal istekleri dışında, aşağıya bakın).
Notlar
- Her protokol arabelleğinden önce
varint
biçiminde bir uzunluk gelir (bkz.MessageLite.writeDelimitedTo()
- JSON isteklerinin ve yanıtlarının önünde bir boyut göstergesi bulunmaz.
- JSON istekleri, protobuf ile aynı yapıyı korur ancak standart API'yi kullanır Tüm alan adları için JSON ve büyük/küçük harf kullanın.
- Aynı geriye ve ileriye dönük uyumluluk özelliklerini korumak için JSON çalışanları, bu mesajlardaki bilinmeyen alanlara izin vermelidir ve ve eksik değerler için protobuf varsayılanlarını kullanın.
- Bazel, istekleri protobuf olarak depolar ve aşağıdakileri kullanarak JSON'a dönüştürür: protobuf'un JSON biçimi
İptal
Çalışanlar, isteğe bağlı olarak iş isteklerinin tamamlanmadan önce iptal edilmesine izin verebilir.
Bu özellikle yerel dinamik yürütmenin olduğu durumlarda yararlıdır.
yürütülmesi daha hızlı bir uzaktan yürütme ile düzenli olarak kesintiye uğrayabilir. İzin vermek için
iptal etmek için şunu ekleyin: supports-worker-cancellation: 1
execution-requirements
alanına (aşağıya bakın) gidin ve
--experimental_worker_cancellation
işareti.
İptal isteği, cancel
alanının ayarlandığı bir WorkRequest
(ve
benzer şekilde bir iptal yanıtı, was_cancelled
içeren bir WorkResponse
olur
alan ayarlanmış olmalıdır). İptal isteğinde veya iptal isteğinde olması gereken diğer tek alan
yanıt, hangi isteğin iptal edileceğini gösteren request_id
. request_id
alanı, tek yönlü çalışanlar için 0 veya daha önceki bir yapılandırmanın 0 olmayan request_id
değeri için
Multiplex çalışanları için WorkRequest
gönderildi. Sunucu iptal isteği gönderebilir
daha önce yanıt vermiş olduğu istekler için çalışır. Bu durumda,
isteği yoksayılmalıdır.
İptal edilmemiş her WorkRequest
iletisi tam olarak bir kez yanıtlanmalıdır;
olmadığını öğrendim. Sunucu bir iptal isteği gönderdikten sonra, çalışan
request_id
grubu ve was_cancelled
ile WorkResponse
ile yanıt ver
alanının doğru değerine ayarlanması gerekir. Normal WorkResponse
göndermek de kabul edilir, ancak
output
ve exit_code
alanları yoksayılır.
WorkRequest
için yanıt gönderildikten sonra, çalışan
dosyalarını yüklemenizi sağlar. Sunucu, dosyaları temizleyebilir,
dahil edilir.
Çalışanı kullanan kuralı yapmak
Ayrıca, bir kontrol noktası görevi görebilir. Çalışan kullanan bir Starlark kuralı oluşturmak, başka herhangi bir kural oluşturarak ekleyebilirsiniz.
Buna ek olarak, kuralın çalışanın kendisine bir referans içermesi ve üretilen eylemler için bazı gereksinimler vardır.
Çalışana referans verme
Çalışanı kullanan kural, çalışanın kimliğini belirten bir alan içermelidir.
olduğundan, bir \*\_binary
kuralının örneğini tanımlamak için
ele alacağız. Çalışanınızın adı MyWorker.Java
ise
ilişkilendirilmiş kural:
java_binary(
name = "worker",
srcs = ["MyWorker.Java"],
)
Bu, "çalışan"ı oluşturur etiketidir. Bu, çalışan ikili programıdır. Bu durumda çalışanı kullanan bir kural tanımlayın. Bu kural, şu özelliklere sahip bir çalışan ikilisi anlamına gelir.
Derlediğiniz çalışan ikili programı, üstte yer alan "work" adlı bir paketteyse Örneğin, özellik tanımı şu olabilir:
"worker": attr.label(
default = Label("//work:worker"),
executable = True,
cfg = "exec",
)
cfg = "exec"
, çalışanın
yürütme platformu (yani çalışan;
araç olarak kullanabilirsiniz).
İş eylemi gereksinimleri
Çalışanı kullanan kural, çalışanın gerçekleştireceği işlemler oluşturur. Bu işlemin birkaç gereksinimi vardır.
"bağımsız değişkenler" alanı. Bu, dizelerin bir listesini alır. Bunlar, başlatma sırasında çalışana iletilen bağımsız değişkenlerdir. Projedeki son öğe "bağımsız değişkenler" listesi bir
flag-file
(@ öncesi) bağımsız değişkenidir. Çalışanların okuması belirtilen işaret dosyasındaki bağımsız değişkenlerin WorkRequest bazında alınması için kullanılır. Sizin kuralı, bu işaret dosyasına çalışan için başlatma olmayan bağımsız değişkenler yazabilir."execution-requirements" alanı şunları içerir:
"supports-workers" : "1"
,"supports-multiplex-workers" : "1"
veya her ikisi."Bağımsız değişkenler" ve "yürütme-gereksinimleri" tümü için alanların doldurulması zorunludur işlemler gönderilir. Ayrıca, JSON çalışanlarının,
"requires-worker-protocol" : "json"
alanı için kullanılır."requires-worker-protocol" : "proto"
aynı zamanda proto çalışanları için şart olmasa da çünkü bunlar varsayılandır.Yürütme şartlarında da bir
worker-key-mnemonic
ayarlayabilirsiniz. Bu yürütülebilir dosyayı birden fazla işlem türü için yeniden kullanıyorsanız ve bu çalışanın işlemlerini ayırt etmek istiyorsunuz.İşlem sırasında oluşturulan geçici dosyalar dizinini oluşturur. Bu işlem, korumalı alana almayı etkinleştirir.
Kural tanımının "çalışan" olarak yazıldığını varsayalım özelliğinin yanı sıra
"srcs" olarak girişleri temsil eden bir özellik, "çıkış" ilişkilendirmek
, çıkışları ve bir "bağımsız değişkenleri" temsil eden bir çalışanı temsil eden özellik
başlangıç bağımsız değişkenleri için ctx.actions.run
çağrısı şöyle olabilir:
ctx.actions.run(
inputs=ctx.files.srcs,
outputs=[ctx.outputs.output],
executable=ctx.executable.worker,
mnemonic="someMnemonic",
execution_requirements={
"supports-workers" : "1",
"requires-worker-protocol" : "json"},
arguments=ctx.attr.args + ["@flagfile"]
)
Başka bir örnek için bkz. Kalıcı çalışanlar uygulama.
Örnekler
Bazel kod tabanı, Java derleyici çalışanları, ek olarak örnek JSON çalışanı Entegrasyon testlerimizde kullanılan testlerden biridir.
Kullanıcılarınızın yapı doğru geri çağırmayı ileterek bir çalışana dönüştürmenizi sağlar.
Çalışan kullanan bir kural örneği için Bazel'in çalışan entegrasyon testi.
Kuruluş dışından katkıda bulunanlar çeşitli dillerde çalışanları hayata geçirdi; CANNOT TRANSLATE bakmak Bazel kalıcı çalışanlarının çok dilli uygulamaları. Şunları yapabilirsiniz: daha pek çok örneği GitHub'da bulabilirsiniz.