Kalıcı Çalışanlar Oluşturma

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

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,
}

0 değerine sahip bir request_id, "singleplex" olarak gösterilir 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.