Aracılığıyla paylaş


İşlem hattı önbelleğe alma

Azure DevOps Services

İşlem hattı önbelleğe alma, önceki çalıştırmalardan indirilen bağımlılıkları yeniden kullanarak derleme süresini kısaltmaya yardımcı olabilir ve aynı dosyaları yeniden oluşturma veya yeniden indirme gereksinimini ortadan kaldırır. Bu, her çalıştırmanın başlangıcında aynı bağımlılıkların tekrar tekrar indirildiği senaryolarda özellikle yararlıdır. Bu genellikle yüzlerce veya binlerce ağ çağrısı içeren zaman alan bir işlemdir.

Önbelleği geri yüklemek ve kaydetmek için gereken süre, dosyaları yeniden oluşturmak için gereken süreden kısa olduğunda önbelleğe alma en etkili olur. Ancak bazı durumlarda önbelleğe alma, performans avantajları sağlamayabilir ve hatta derleme süresini olumsuz etkileyebilir. Önbelleğe almanın doğru yaklaşım olup olmadığını belirlemek için belirli senaryonuzu değerlendirmeniz önemlidir.

Not

İşlem hattı önbelleğe alma, Klasik yayın işlem hatlarında desteklenmez.

İşlem hattı yapıtları mı yoksa işlem hattı önbelleğe alma mı ne zaman kullanılmalı?

İşlem hattı önbelleği ve işlem hattı yapıtları benzer işlevleri gerçekleştirir, ancak farklı durumlara yöneliktir ve birbirinin yerine kullanılmamalıdır.

  • İşlem hattı yapıtlarını kullanın: bir görev tarafından üretilen belirli dosyaları almanız ve bunları diğer görevlerle paylaşmanız gerektiğinde (bu diğer görevler bu dosyalar olmadan muhtemelen başarısız olacaktır).

  • İşlem hattı önbelleğe alma özelliğini kullanın: Önceki çalıştırmalardan dosyaları yeniden kullanarak derleme süresini geliştirmek istediğinizde (ve bu dosyalara sahip olmaması işin çalışma becerisini etkilemez).

Not

İşlem hattı önbelleğe alma ve işlem hattı yapıtları tüm katmanlar (ücretsiz ve ücretli) için ücretsiz olarak kullanılabilir. Diğer ayrıntılar için bkz. Artifacts depolama tüketimi.

Kendi barındırılan aracı gereksinimleri

Aşağıdaki yürütülebilir dosyalar, ortam değişkeninde PATH listelenen bir klasörde bulunmalıdır. Barındırılan aracılar gerekli yazılımla önceden yüklenmiş olarak geldiğinden, bu gereksinimlerin yalnızca kendi kendine barındırılan aracılar için geçerli olduğunu unutmayın.

Arşiv yazılımı / Platform Windows Linux işletim sistemi Mac
GNU Tar Gerekli Gerekli Hayır
BSD Katranı Hayır Hayır Gerekli
7-Zip Önerilen Hayır Hayır

Önbellek görevi: Nasıl çalışır?

Bir işin bölümüne steps eklenerek önbelleğe alma, işlem hattına eklenir.

İşlem hattı yürütme sırasında, bir önbellek adımıyla karşılaşıldığında, görev sağlanan girişlere göre önbelleği geri yüklemeyi dener. Önbellek bulunmazsa, adım tamamlanır ve işteki bir sonraki adım yürütülür.

İşin tüm adımları başarıyla çalıştırıldıktan sonra, atlanmamış her "önbelleği geri yükleme" adımı için özel bir "post-job: Cache" adımı otomatik olarak eklenir ve tetikler. Bu adım önbelleğikaydetmekten sorumludur.

Not

Önbellekler değiştirilemez. Önbellek oluşturulduktan sonra içeriği değiştirilemez.

Önbellek görevini yapılandırma

Önbellek görevinin iki gerekli bağımsız değişkeni vardır: yol ve anahtar:

  1. path: Önbelleğe almak istediğiniz klasörün yolu. Bu, mutlak veya göreli bir yol olabilir. Göreli yollar $(System.DefaultWorkingDirectory)ile çözümlenir.

    İpucu

    Önbelleğe almak istediğiniz klasörün yolunu depolamak için önceden tanımlanmış değişkenleri kullanabilirsiniz. Ancak joker karakterler desteklenmez.

  2. key: Bu, geri yüklemek veya kaydetmek istediğiniz önbelleğin tanımlayıcısını tanımlar. Anahtar, dize değerlerinin, dosya yollarının veya dosya desenlerinin bir birleşiminden oluşur ve her kesim bir | karakterle ayrılır.

    • Dizeleri:
      Sabit bir değer (önbellek adı veya araç adı gibi) veya bir ortam değişkeninden (geçerli işletim sistemi veya iş adı gibi) alınır.

    • dosya yolları:
      İçeriği karma haline getirilecek belirli bir dosyanın yolu. Görev çalıştırıldığında dosyanın mevcut olması gerekir. Dosya yoluna benzeyen tüm kesimler bu şekilde ele alınır, bu nedenle özellikle içeren .kesimleri kullanırken dikkatli olun çünkü bu durum "dosya yok" hatalarına yol açabilir.

      İpucu

      Yol benzeri bir dize kesiminin dosya yolu gibi değerlendirilmesini önlemek için, bunu çift tırnak içine alın, örneğin: "my.key" | $(Agent.OS) | key.file

    • dosya desenleri:
      En az bir dosyayla eşleşmesi gereken glob stili joker karakter desenlerinin virgülle ayrılmış listesi. Örnekler:

      • **/yarn.lock: sources dizinindeki tüm yarn.lock dosyaları.
      • */asset.json, !bin/**: tüm asset.json dosyaları, bin dizinindekiler dışında sources dizininin altındaki bir dizinde bulunur.

Bir dosya yolu veya dosya deseni tarafından tanımlanan herhangi bir dosyanın içeriğine, dinamik önbellek anahtarı oluşturmak üzere karma fonksiyonu uygulanır. Bu, projenizde önbelleğe alınanları benzersiz olarak tanımlayan dosyalar olduğunda kullanışlıdır. Örneğin, , package-lock.json, yarn.lockveya Gemfile.lock gibi Pipfile.lockdosyalara genellikle benzersiz bir bağımlılık kümesini temsil eden bir önbellek anahtarında başvurulur. Göreli dosya yolları veya desenleri $(System.DefaultWorkingDirectory) öğesine göre çözümlenir.

  • Örnek:

Aşağıdaki örnekte Yarn paketlerinin nasıl önbelleğe alınacakları gösterilmektedir:

variables:
  YARN_CACHE_FOLDER: $(Pipeline.Workspace)/s/.yarn

steps:
- task: Cache@2
  inputs:
    key: '"yarn" | "$(Agent.OS)" | yarn.lock'
    restoreKeys: |
       "yarn" | "$(Agent.OS)"
       "yarn"
    path: $(YARN_CACHE_FOLDER)
  displayName: Cache Yarn packages

- script: yarn --frozen-lockfile

Bu örnekte önbellek anahtarı üç bölümden oluşur: statik dize ("yarn"), işin üzerinde çalıştığı işletim sistemi (önbellek işletim sistemi başına benzersiz olduğundan) ve dosyanın karması yarn.lock (bağımlılıkları benzersiz olarak tanımlar).

Görev eklendikten sonraki ilk çalıştırmada, bu anahtar tarafından tanımlanan önbellek mevcut olmadığından önbellek adımı "önbellek hatası" bildirir. Son adımdan sonra, $(Pipeline.Workspace)/s/.yarn içindeki dosyalardan bir önbellek oluşturulacak ve karşıya yüklenecektir. Bir sonraki çalıştırmada önbellek adımı bir "önbellek isabeti" bildirir ve önbelleğin içeriği indirilip geri yüklenir.

Ne zaman checkout: self kullanılır, deponuz $(Pipeline.Workspace)/s'e aktarılır, ve büyük olasılıkla .yarn klasörünüz deponun içinde yer alır.

Not

Pipeline.Workspace, işlem hattınızı çalıştıran aracıdaki tüm dizinlerin oluşturulduğu yerel yoldur. Bu değişken Agent.BuildDirectoryile aynı değere sahiptir. Eğer checkout: self kullanmıyorsanız, YARN_CACHE_FOLDER değişkenini, deponuzdaki .yarn konumuna işaret edecek şekilde güncellediğinizden emin olun.

Geri yükleme anahtarlarını kullanma

restoreKeys birden çok tam anahtarı veya anahtar ön eklerini sorgulamanıza olanak tanır. Belirtilen key bir isabet vermediğinde yedek olarak kullanılır. Geri yükleme anahtarı bir anahtarı ön eke göre arar ve en son oluşturulan önbellek girdisini döndürür. İşlem hattı tam eşleşme bulamadıysa ancak yine de kısmi önbellek isabeti kullanmak istediğinde bu yararlı olur.

Birden çok geri yükleme anahtarı belirtmek için bunları ayrı satırlarda listeleyin. Geri yükleme anahtarlarının denendiği sıra yukarıdan aşağıyadır.

  • Örnek:

Aşağıda Yarn paketlerini önbelleğe almak için geri yükleme anahtarlarının nasıl kullanılacağına yönelik bir örnek verilmişti:

variables:
  YARN_CACHE_FOLDER: $(Pipeline.Workspace)/.yarn

steps:
- task: Cache@2
  inputs:
    key: '"yarn" | "$(Agent.OS)" | yarn.lock'
    restoreKeys: |
       yarn | "$(Agent.OS)"
       yarn
    path: $(YARN_CACHE_FOLDER)
  displayName: Cache Yarn packages

- script: yarn --frozen-lockfile

Bu örnekte, önbellek görevi önce belirtilen anahtarı geri yüklemeyi dener. Anahtar önbellekte yoksa, ilk geri yükleme anahtarını dener: yarn | $(Agent.OS). Bu, bu ön ekle tam olarak eşleşen veya bu ön ek ile başlayan önbellek anahtarlarını arar.

Dosyanın karması değiştiyse bir ön ek eşleşmesi meydana gelebilir. Örneğin, önbellek yarn | $(Agent.OS) | old-yarn.lock anahtarını içeriyorsa (burada old-yarn.lock'in karması, mevcut yarn.lock'den farklıdır), bu geri yükleme anahtarı, kısmi bir önbellek isabetiyle sonuçlanır.

İlk geri yükleme anahtarı eşleşme sağlamazsa, bir sonraki geri yükleme anahtarı yarn herhangi bir yarn ile başlayan önbellek anahtarını arar. Ön ek eşleşmeleri için geri yükleme işlemi en son oluşturulan önbellek girişini döndürür.

Not

İşlem hattı birden çok önbelleğe alma görevi içerebilir ve önbelleğe alma için depolama sınırı yoktur. Aynı işlem hattındaki işler ve görevler aynı önbelleğe erişebilir ve bu önbelleği paylaşabilir.

Geri yükleme koşulunu kullanma

Bazı senaryolarda, önbelleğin başarıyla geri yüklenip yüklenmediğine bağlı olarak adımları koşullu olarak yürütmek isteyebilirsiniz. Örneğin, önbellek geri yüklendiyse bağımlılıkları yükleyen bir adımı atlayabilirsiniz. Bu, cacheHitVar argümanı kullanılarak başarılabilir.

Bu girdinin bir ortam değişkeni adı olarak ayarlandığında, önbellek isabeti olduğunda değişken true olarak ayarlanır, geri yükleme anahtarı kısmi önbellek isabeti sağlarsa inexact olarak ayarlanır ve önbellek bulunamazsa false olarak ayarlanır. Daha sonra bu değişkene bir adım koşulunda veya bir betik içinde başvurabilirsiniz.

Önbellek geri yüklendiğinde adımın install-deps.sh atlandığı bir örnek aşağıda verilmiştir:

steps:
- task: Cache@2
  inputs:
    key: mykey | mylockfile
    restoreKeys: mykey
    path: $(Pipeline.Workspace)/mycache
    cacheHitVar: CACHE_RESTORED

- script: install-deps.sh
  condition: ne(variables.CACHE_RESTORED, 'true')

- script: build.sh

Önbellek yalıtımı ve güvenlik

Farklı işlem hatlarından ve farklı dallardan gelen önbellekler arasında yalıtım sağlamak için, her önbellek kapsam adı verilen bir mantıksal kapsayıcı içinde depolanır. Kapsamlar, aşağıdaki garantileri veren bir güvenlik sınırı görevi görür:

  • Bir işlem hattındaki işler farklı bir işlem hattından önbelleklere erişemez.

  • Çekme istekleri oluşturan işler, hedef daldan (aynı işlem hattı için) önbellekleri okuyabilir, ancak hedef dalın kapsamında önbellek yazamaz (oluşturamaz).

Bir çalıştırma sırasında önbellek adımıyla karşılaşıldığında, anahtar tarafından tanımlanan önbellek sunucudan istenir. Ardından sunucu, işin görünür olduğu kapsamlardan bu anahtara sahip bir önbellek arar ve önbelleği döndürür (varsa). Önbellek kaydetmede (işin sonunda), işlem hattını ve dalı temsil eden kapsama bir önbellek yazılır.

CI, manuel ve zamanlanmış çalıştırmalar

Kapsam Okumak Yazmak
Kaynak dal Evet Evet
main şube Evet Hayır
master şube Evet Hayır

Çekme isteği çalıştırmaları

Kapsam Okumak Yazmak
Kaynak dal Evet Hayır
Hedef şube Evet Hayır
Ara dal (refs/pull/1/mergegibi) Evet Evet
main şube Evet Hayır
master şube Evet Hayır

Çekme isteği için fork çalıştırmaları

Dal / Şube Okumak Yazmak
Hedef şube Evet Hayır
Ara dal (refs/pull/1/mergegibi) Evet Evet
main şube Evet Hayır
master şube Evet Hayır

İpucu

Önbelleklerin kapsamı zaten bir proje, işlem hattı ve dal olarak belirlenmiş olduğundan, önbellek anahtarına herhangi bir proje, işlem hattı veya dal tanımlayıcısı eklemeniz gerekmez.

Örnekler

Bundler kullanan Ruby projelerinde, Bundler'ın BUNDLE_PATH Gems'i arayacağı yolu ayarlamak için ortam değişkenini geçersiz kılın.

Örnek:

variables:
  BUNDLE_PATH: $(Pipeline.Workspace)/.bundle

steps:
- task: Cache@2
  displayName: Bundler caching
  inputs:
    key: 'gems | "$(Agent.OS)" | Gemfile.lock'
    path: $(BUNDLE_PATH)
    restoreKeys: | 
      gems | "$(Agent.OS)"
      gems   

Bilinen sorunlar ve geri bildirim

İşlem hattınızda önbelleğe almayı ayarlarken sorun yaşıyorsanız depodaki microsoft/azure-pipelines-tasks listesini denetleyin. Sorununuzu listede görmüyorsanız, yeni bir tane oluşturun ve senaryonuz hakkında gerekli bilgileri sağlayın.

Sorular ve Cevaplar

S: Önbelleği temizleyebilir miyim?

Y: Önbelleği temizleme desteklenmez. Ancak, önbellek anahtarınıza bir dizi sabiti (örneğin version2) ekleyerek mevcut önbelleklerde isabetlerden kaçınabilirsiniz. Örneğin, aşağıdaki önbellek anahtarını aşağıdakinden değiştirin:

key: 'yarn | "$(Agent.OS)" | yarn.lock'

Şu şekilde:

key: 'version2 | yarn | "$(Agent.OS)" | yarn.lock'

S: Önbelleğin süresi ne zaman doluyor?

Önbellekler herhangi bir etkinlik olmadığı takdirde yedi gün sonra geçerliliğini yitirir.

Q: Önbellek ne zaman karşıya yüklenir?

Bir önbellek, belirttiğiniz path'den oluşturulur ve işin son adımından sonra karşıya yüklenir. Daha fazla ayrıntı için örnek bakın.

S: Önbelleğin boyutuyla ilgili bir sınır var mı?

Y: Tek tek önbelleklerin boyutu veya kuruluş içindeki toplam önbellek boyutu üzerinde zorunlu bir sınır yoktur.