Ardışık düzen önbelleğe almaPipeline caching

Ardışık düzen önbelleğe alma, bir çalıştırmaların sonraki çalışmalarda yeniden kullanılabilmesi için çıkışların veya indirilen bağımlılıkların daha sonra yeniden oluşturulması veya yeniden indirilmesi maliyetinin azaltılmasını sağlayarak derleme süresinin azalmasına yardımcı olabilir.Pipeline caching can help reduce build time by allowing the outputs or downloaded dependencies from one run to be reused in later runs, thereby reducing or avoiding the cost to recreate or redownload the same files again. Önbelleğe alma, özellikle de aynı bağımlılıkların her çalıştırmanın başlangıcında ve aşırı yüklendiği senaryolarda faydalıdır.Caching is especially useful in scenarios where the same dependencies are downloaded over and over at the start of each run. Bu genellikle yüzlerce veya binlerce ağ çağrısı içeren zaman alan bir işlemdir.This is often a time consuming process involving hundreds or thousands of network calls.

Önbelleğe alma işlemi, derleme süresini iyileştirmek için etkili olabilir, bu da önbelleğin geri yüklenmesi ve kaydedilmesi için geçen süre sıfırdan daha az olduğunda çıktının sıfırdan bir yeniden üretilmesiCaching can be effective at improving build time provided the time to restore and save the cache is less than the time to produce the output again from scratch. Bu nedenle, önbelleğe alma işlemi tüm senaryolarda etkili olmayabilir ve aslında derleme zamanında olumsuz bir etkiye sahip olabilir.Because of this, caching may not be effective in all scenarios and may actually have a negative impact on build time.

Önbelleğe alma şu anda CI ve dağıtım işlerinde destekleniyor, ancak klasik yayın işleri değil.Caching is currently supported in CI and deployment jobs, but not classic release jobs.

Yapıtlar ve önbelleğe alma ne zaman kullanılır?When to use artifacts versus caching

Ardışık düzen önbelleğe alma ve işlem hattı yapıtları benzer işlevler gerçekleştirir, ancak farklı senaryolar için tasarlanmıştır ve birbirlerinin yerine kullanılmamalıdır.Pipeline caching and pipeline artifacts perform similar functions but are designed for different scenarios and should not be used interchangeably. Genel olarak:In general:

  • Tek bir işte üretilen belirli dosyaları almanız ve bunları diğer işlerle paylaşmak gerektiğinde (ve bu diğer işler bu işlemler olmadan başarısız olur) işlem hattı yapılarını kullanın .Use pipeline artifacts when you need to take specific files produced in one job and share them with other jobs (and these other jobs will likely fail without them).

  • Önceki çalıştırmaların dosyalarını yeniden kullanarak derleme süresini geliştirmek istediğinizde işlem hattı önbelleğe alma özelliğini kullanın (ve bu dosyaların olmaması işin çalışma yeteneğini etkilemez).Use pipeline caching when you want to improve build time by reusing files from previous runs (and not having these files will not impact the job's ability to run).

Not

Önbelleğe alma şu anda ücretsizdir ve Cashes Azure Blob depolama alanında depolanır.Caching is currently free, and cashes are stored in Azure blob storage.

Önbellek görevi kullanUse Cache task

Ardışık düzen görevi kullanılarak bir işlem hattına önbelleğe alma eklenir Cache .Caching is added to a pipeline using the Cache pipeline task. Bu görev diğer tüm görevler gibi çalışarak steps bir işin bölümüne eklenir.This task works like any other task and is added to the steps section of a job.

Çalıştırma sırasında bir önbellek adımına rastlandı, görev, belirtilen girdilere göre önbelleği geri yükler.When a cache step is encountered during a run, the task will restore the cache based on the provided inputs. Önbellek bulunamazsa adım tamamlanır ve işin bir sonraki adımı çalıştırılır.If no cache is found, the step completes and the next step in the job is run. İşteki tüm adımlar çalıştırıldıktan ve başarılı bir iş durumu varsayılırsa, atlanan her "geri yükleme önbelleği" adımı için özel bir "önbelleği Kaydet" adımı çalıştırılır.After all steps in the job have run and assuming a successful job status, a special "save cache" step is run for each "restore cache" step that was not skipped. Bu adım, önbelleğin kaydedilmesinden sorumludur.This step is responsible for saving the cache.

Not

Önbellekler sabittir, yani bir önbellek oluşturulduktan sonra içeriği değiştirilemez.Caches are immutable, meaning that once a cache is created, its contents cannot be changed. Daha fazla bilgi için bkz. SSS bölümünde bir önbelleği temizleyebilir mi?See Can I clear a cache? in the FAQ section for additional details.

Önbellek yapılandırma göreviConfigure Cache task

CacheGörevde iki gerekli giriş vardır: key ve path .The Cache task has two required inputs: key and path.

Yol girişiPath input

path önbelleğe alma klasörünün yolu.path the path of the folder to cache. Mutlak veya göreli bir yol olabilir.Can be an absolute or a relative path. Göreli yollar ile çözümlenir $(System.DefaultWorkingDirectory) .Relative paths are resolved against $(System.DefaultWorkingDirectory). Önceden tanımlanmış değişkenleri kullanabilirsiniz, ancak joker karakterler desteklenmez.You can use predefined variables however wildcards are not supported.

Anahtar girişiKey input

key geri yüklemek veya kaydetmek istediğiniz önbelleğin tanımlayıcısına ayarlanmalıdır.key should be set to the identifier for the cache you want to restore or save. Anahtarlar, her segmentin bir karakterle ayrıldığı dize değerleri, dosya yolları veya dosya desenlerinin birleşiminden oluşur | .Keys are composed of a combination of string values, file paths, or file patterns, where each segment is separated by a | character.

  • Dizeler:Strings:
    sabit değer (önbelleğin adı veya bir araç adı gibi) ya da bir ortam değişkeninden (geçerli işletim sistemi veya geçerli iş adı gibi) alınmışfixed value (like the name of the cache or a tool name) or taken from an environment variable (like the current OS or current job name)

  • Dosya yolları:File paths:
    içerikleri karma hale getirilen belirli bir dosyanın yolu.path to a specific file whose contents will be hashed. Bu dosya, görevin çalıştırıldığı zamanda mevcut olmalıdır.This file must exist at the time the task is run. "Bir dosya yolu gibi görünen" Tüm anahtar segmentinin bir dosya yolu gibi değerlendirildiğini aklınızda bulundurun.Keep in mind that any key segment that "looks like a file path" will be treated like a file path. Özellikle, bu, içeren kesimleri içerir . .In particular, this includes segments containing a .. Bu, "dosya" mevcut olmadığında görevin başarısız olmasına neden olabilir.This could result in the task failing when this "file" does not exist.

    İpucu

    Yol benzeri dize segmentinin bir dosya yolu gibi işlenmesini önlemek için, bunu çift tırnak işaretleriyle sarın, örneğin: "my.key" | $(Agent.OS) | key.fileTo avoid a path-like string segment from being treated like a file path, wrap it with double quotes, for example: "my.key" | $(Agent.OS) | key.file

  • Dosya desenleri:File patterns:
    en az bir dosyayla eşleşmesi gereken, glob stili joker karakter deseninin virgülle ayrılmış listesi.comma-separated list of glob-style wildcard pattern that must match at least one file. Örnek:For example:

    • **/yarn.lock: kaynaklar dizini altındaki tüm yarn. Lock dosyaları**/yarn.lock: all yarn.lock files under the sources directory
    • */asset.json, !bin/**: bin dizini dışında, kaynaklar dizini altındaki bir dizinde bulunan dosyalardaki tüm asset.js*/asset.json, !bin/**: all asset.json files located in a directory under the sources directory, except under the bin directory

Bir dosya yolu veya dosya düzeniyle tanımlanan herhangi bir dosyanın içeriği dinamik bir önbellek anahtarı oluşturmak için karma hale getirilir.The contents of any file identified by a file path or file pattern is hashed to produce a dynamic cache key. Bu, projenizin önbelleğe alınmış öğeleri benzersiz şekilde tanımlayan dosya (ler) i olduğunda yararlıdır.This is useful when your project has file(s) that uniquely identify what is being cached. Örneğin,,, veya gibi dosyalar, package-lock.json yarn.lock hepsi, Gemfile.lock Pipfile.lock benzersiz bir bağımlılıklar kümesini temsil ettiğinden, genellikle bir önbellek anahtarında başvurulur.For example, files like package-lock.json, yarn.lock, Gemfile.lock, or Pipfile.lock are commonly referenced in a cache key since they all represent a unique set of dependencies.

Göreli dosya yolları veya dosya desenleri, ile çözümlenir $(System.DefaultWorkingDirectory) .Relative file paths or file patterns are resolved against $(System.DefaultWorkingDirectory).

Örnek:Example:

Yarn tarafından yüklenen bağımlılıkların nasıl önbelleğe alınacağını gösteren bir örnek aşağıda verilmiştir:Here is an example showing how to cache dependencies installed by Yarn:

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 anahtarı üç bölümden oluşur: bir statik dize ("Yarn"), bu önbellek her bir işletim sistemi için benzersiz olduğundan ve yarn.lock önbellekteki bağımlılıkların kümesini benzersiz bir şekilde tanımlayan dosyanın karması.In this example, the cache key contains three parts: a static string ("yarn"), the OS the job is running on since this cache is unique per operating system, and the hash of the yarn.lock file that uniquely identifies the set of dependencies in the cache.

Görev eklendikten sonra ilk çalıştırmada, bu anahtar tarafından tanımlanan önbellek mevcut olmadığından önbellek adımı "önbellek isabetsizliği" olarak bildirir.On the first run after the task is added, the cache step will report a "cache miss" since the cache identified by this key does not exist. Son adımdan sonra, içindeki dosyalardan bir önbellek oluşturulur $(Pipeline.Workspace)/.yarn ve karşıya yüklenir.After the last step, a cache will be created from the files in $(Pipeline.Workspace)/.yarn and uploaded. Sonraki çalıştırmada, önbellek adımı bir "Önbellek İsabeti" olarak bildirir ve önbelleğin içeriği indirilir ve geri yüklenir.On the next run, the cache step will report a "cache hit" and the contents of the cache will be downloaded and restored.

Anahtarları geri yükleRestore keys

restoreKeys birden çok tam anahtara veya anahtar öneklerine karşı sorgulamak isterse, kullanılabilir.restoreKeys can be used if one wants to query against multiple exact keys or key prefixes. Bu, bir isabet getirmediğinden başka bir anahtara geri dönmek için kullanılır key .This is used to fallback to another key in the case that a key does not yield a hit. Geri yükleme anahtarı ön eke göre bir anahtar arar ve sonuç olarak en son oluşturulan önbellek girişini verir.A restore key will search for a key by prefix and yield the latest created cache entry as a result. İşlem hattı tam eşleşme bulamazsa ancak bunun yerine kısmi bir önbellek okuması kullanmak isterse, bu kullanışlıdır.This is useful if the pipeline is unable to find an exact match but wants to use a partial cache hit instead. Birden fazla geri yükleme anahtarı eklemek için, geri yükleme anahtarını göstermek üzere yeni bir satır kullanarak bunları sınırlandırın (daha fazla ayrıntı için örneğe bakın).To insert multiple restore keys, simply delimit them by using a new line to indicate the restore key (see the example for more details). Geri yükleme anahtarlarının denenme sırası yukarıdan aşağıya doğru olacaktır.The order of which restore keys will be tried against will be from top to bottom.

Şirket içinde barındırılan aracıda gerekli yazılımRequired software on self-hosted agent

Yazılım/platformu ArşivleArchive software / Platform WindowsWindows LinuxLinux MacMac
GNU tarGNU Tar GerekliRequired GerekliRequired NoNo
BSD tarBSD Tar HayırNo HayırNo GerekliRequired
7-zip7-Zip ÖnerilenRecommended HayırNo HayırNo

Yukarıdaki yürütülebilir dosyaların, PATH ortam değişkeninde listelenen bir klasörde olması gerekir.The above executables need to be in a folder listed in the PATH environment variable. Barındırılan aracıların yazılımın dahil edildiğini, bu yalnızca kendi kendine barındırılan aracılar için geçerli olduğunu unutmayın.Please note that the hosted agents come with the software included, this is only applicable for self-hosted agents.

Örnek:Example:

Aşağıda, Yarn tarafından geri yükleme anahtarlarının nasıl kullanılacağına ilişkin bir örnek verilmiştir:Here is an example on how to use restore keys by Yarn:

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

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

- script: yarn --frozen-lockfile

Bu örnekte, önbellek görevi anahtarın önbellekte olup olmadığını bulmaya çalışacaktır.In this example, the cache task will attempt to find if the key exists in the cache. Anahtar önbellekte yoksa, ilk geri yükleme anahtarını kullanmaya çalışır yarn | $(Agent.OS) .If the key does not exist in the cache, it will try to use the first restore key yarn | $(Agent.OS). Bu, bu anahtarla tam olarak eşleşen veya bu anahtarı önek olarak içeren tüm anahtarları aramaya çalışır.This will attempt to search for all keys that either exactly match that key or has that key as a prefix. Farklı bir karma segmenti varsa bir ön ek isabet ortaya çıkabilir yarn.lock .A prefix hit can happen if there was a different yarn.lock hash segment. Örneğin, aşağıdaki anahtar yarn | $(Agent.OS) | old-yarn.lock eskisinin yarn.lock şundan farklı bir karma değer aldığı önbellekte ise yarn.lock , geri yükleme anahtarı kısmi bir vuruş olur.For example, if the following key yarn | $(Agent.OS) | old-yarn.lock was in the cache where the old yarn.lock yielded a different hash than yarn.lock, the restore key will yield a partial hit. İlk geri yükleme anahtarında bir isabetsizlik varsa, daha sonra yarn ile başlayan herhangi bir anahtarı bulmaya çalışacak bir sonraki geri yükleme anahtarını kullanacaktır yarn .If there is a miss on the first restore key, it will then use the next restore key yarn which will try to find any key that starts with yarn. Ön ek isabetleri için sonuç, en son oluşturulan önbellek anahtarını sonuç olarak verir.For prefix hits, the result will yield the most recently created cache key as the result.

Not

Bir işlem hattının bir veya daha fazla önbelleğe alma görevi olabilir.A pipeline can have one or more caching task(s). Önbelleğe alma depolama kapasitesi için bir sınır yoktur, aynı işlem hattındaki işler ve görevler aynı önbelleğe erişebilir ve aynı önbelleği paylaşabilir.There is no limit on the caching storage capacity, and jobs and tasks from the same pipeline can access and share the same cache.

Önbellek yalıtımı ve güvenliğiCache isolation and security

Farklı işlem hatlarından ve farklı dallardaki önbellekler arasında yalıtımı sağlamak için her önbellek, kapsam olarak adlandırılan mantıksal bir kapsayıcıya aittir.To ensure isolation between caches from different pipelines and different branches, every cache belongs to a logical container called a scope. Kapsamlar, bir işlem hattından bir işin farklı bir işlem hattından önbelleklere erişememesini sağlayan bir güvenlik sınırı sağlar ve bir çekme isteği oluşturan iş, çekme isteğinin hedef dalı için önbelleğe okuma erişimine sahip olur (aynı işlem hattı için), ancak hedef dalın kapsamında önbellekler yazamaz (oluşturamaz).Scopes provide a security boundary that ensures a job from one pipeline cannot access the caches from a different pipeline, and a job building a PR has read access to the caches for the PR's target branch (for the same pipeline), but cannot write (create) caches in the target branch's scope.

Çalıştırma sırasında bir önbellek adımına rastlırsa, anahtar tarafından tanımlanan önbellek sunucudan istenir.When a cache step is encountered during a run, the cache identified by the key is requested from the server. Sunucu daha sonra iş için görünür olan kapsamlardan bu anahtarla bir önbellek arar ve önbelleği döndürür (varsa).The server then looks for a cache with this key from the scopes visible to the job, and returns the cache (if available). Önbellek kaydetme sırasında (işin sonunda), ardışık düzen ve dalı temsil eden kapsama bir önbellek yazılır.On cache save (at the end of the job), a cache is written to the scope representing the pipeline and branch. Daha fazla ayrıntı için aşağıya bakın.See below for more details.

CI, el ile ve zamanlanmış çalıştırmalarCI, manual, and scheduled runs

KapsamScope OkumaRead YazmaWrite
Kaynak dalSource branch YesYes YesYes
ana dalmain branch YesYes HayırNo

Çekme isteği çalıştırmalarıPull request runs

KapsamScope OkumaRead YazmaWrite
Kaynak dalSource branch YesYes HayırNo
Hedef dalTarget branch YesYes HayırNo
Ara dal (gibi refs/pull/1/merge )Intermediate branch (such as refs/pull/1/merge) YesYes YesYes
ana dalmain branch YesYes HayırNo

Çekme isteği çatalı çalıştırmalarıPull request fork runs

DalBranch OkumaRead YazmaWrite
Hedef dalTarget branch YesYes HayırNo
Ara dal (gibi refs/pull/1/merge )Intermediate branch (such as refs/pull/1/merge) YesYes YesYes
ana dalmain branch YesYes HayırNo

İpucu

Önbellekler bir proje, işlem hattı ve dal kapsamında olduğundan, önbellek anahtarına herhangi bir proje, ardışık düzen veya dal tanımlayıcısı dahil etme gereksinimi yoktur.Because caches are already scoped to a project, pipeline, and branch, there is no need to include any project, pipeline, or branch identifiers in the cache key.

Önbellek geri yükleme üzerinde koşullandırmaConditioning on cache restoration

Bazı senaryolarda önbelleğin başarıyla geri yüklenmesi, farklı bir adım kümesinin çalıştırılmasına neden olmalıdır.In some scenarios, the successful restoration of the cache should cause a different set of steps to be run. Örneğin, önbellek geri yüklenmişse, bağımlılıkları yükleyen bir adım atlanabilir.For example, a step that installs dependencies can be skipped if the cache was restored. Bu, cacheHitVar görev girişi kullanılarak mümkündür.This is possible using the cacheHitVar task input. Bu girişin bir ortam değişkeni adına ayarlanması, bir true geri yükleme anahtar önbelleğinde vuruş yapıldığında değişkenin bir önbellek okuması olduğunda olarak ayarlanmasına neden olur inexact , aksi takdirde olarak ayarlanır false .Setting this input to the name of an environment variable will cause the variable to be set to true when there is a cache hit, inexact on a restore key cache hit, otherwise it will be set to false. Daha sonra bu değişkene, bir adım koşulunda veya bir komut dosyası içinden başvurulabilir.This variable can then be referenced in a step condition or from within a script.

Aşağıdaki örnekte, install-deps.sh önbellek geri yüklendiğinde adım atlanır:In the following example, the install-deps.sh step is skipped when the cache is restored:

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

PaketleyiciBundler

Paketcisi kullanan Ruby projeleri için, paketcisi BUNDLE_PATH tarafından kullanılan ortam değişkenini geçersiz kılarak, Içindeki Gems 'lerin aranacağı yolu ayarlayın.For Ruby projects using Bundler, override the BUNDLE_PATH environment variable used by Bundler to set the path Bundler will look for Gems in.

Örnek:Example:

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

steps:
- task: Cache@2
  inputs:
    key: 'gems | "$(Agent.OS)" | my.gemspec'
    restoreKeys: | 
      gems | "$(Agent.OS)"
      gems
    path: $(BUNDLE_PATH)
  displayName: Cache gems

- script: bundle install

Ccache (C/C++)Ccache (C/C++)

Ccache , C/C++ için bir derleyici önbelleğidir.Ccache is a compiler cache for C/C++. İşlem hattınızda Ccache kullanmak için yüklü olduğundan emin olun Ccache ve isteğe bağlı olarak PATH (bkz. ccache çalıştırma modları) eklendi.To use Ccache in your pipeline make sure Ccache is installed, and optionally added to your PATH (see Ccache run modes). CCACHE_DIROrtam değişkenini altında bir yol olarak ayarlayın $(Pipeline.Workspace) ve bu dizini önbelleğe koyun.Set the CCACHE_DIR environment variable to a path under $(Pipeline.Workspace) and cache this directory.

Örnek:Example:

variables:
  CCACHE_DIR: $(Pipeline.Workspace)/ccache

steps:
- bash: |
    sudo apt-get install ccache -y    
    echo "##vso[task.prependpath]/usr/lib/ccache"
  displayName: Install ccache and update PATH to use linked versions of gcc, cc, etc

- task: Cache@2
  inputs:
    key: 'ccache | "$(Agent.OS)"'
    path: $(CCACHE_DIR)
  displayName: ccache

Not

Bu örnekte, anahtar sabit bir değerdir (işletim sistemi adı) ve önbellekler sabit olduğundan, belirli bir kapsam (dal) için bu anahtarla bir önbellek oluşturulduktan sonra önbellek güncelleştirilemez.In this example, the key is a fixed value (the OS name) and because caches are immutable, once a cache with this key is created for a particular scope (branch), the cache cannot be updated. Bu, aynı dala yönelik sonraki derlemelerin, önbelleğin içeriği değişmiş olsa bile önbelleği güncelleştiremeyeceği anlamına gelir.This means subsequent builds for the same branch will not be able to update the cache even if the cache's contents have changed. Bu sorun gelecek bir özellikte değinilecek: 10842: ardışık düzen önbelleğe alma işleminde geri dönüş anahtarlarını etkinleştirmeThis problem will be addressed in an upcoming feature: 10842: Enable fallback keys in Pipeline Caching

Sıkıştırma düzeyini denetleme ayarları da dahil olmak üzere daha fazla seçenek için bkz. Ccache yapılandırma ayarları .See Ccache configuration settings for more options, including settings to control compression level.

Docker görüntüleriDocker images

Docker görüntülerini önbelleğe alma işlemi, işlem hattınızı çalıştırmak için gereken süreyi önemli ölçüde azaltır.Caching Docker images dramatically reduces the time it takes to run your pipeline.

pool:
  vmImage: ubuntu-16.04

steps:
  - task: Cache@2
    inputs:
      key: 'docker | "$(Agent.OS)" | caching-docker.yml'
      path: $(Pipeline.Workspace)/docker
      cacheHitVar: DOCKER_CACHE_RESTORED
    displayName: Caching Docker image

  - script: |
      docker load < $(Pipeline.Workspace)/docker/cache.tar
    condition: and(not(canceled()), eq(variables.DOCKER_CACHE_RESTORED, 'true'))

  - script: |
      mkdir -p $(Pipeline.Workspace)/docker
      docker pull ubuntu
      docker save ubuntu > $(Pipeline.Workspace)/docker/cache.tar
    condition: and(not(canceled()), or(failed(), ne(variables.DOCKER_CACHE_RESTORED, 'true')))

caching-docker.ymlKendi işlem hattı YAML dosyanız ile değiştirin.Replace caching-docker.yml with your own pipeline YAML file.

GolangGolang

Golang projeleri için Go. mod dosyasına indirilecek paketleri belirtebilirsiniz.For Golang projects, you can specify the packages to be downloaded in the go.mod file. GOCACHEDeğişkeniniz zaten ayarlanmamışsa Önbelleğin indirilmesini istediğiniz yere ayarlayın.If your GOCACHE variable isn't already set, set it to where you want the cache to be downloaded.

Örnek:Example:

variables:
  GO_CACHE_DIR: $(Pipeline.Workspace)/.cache/go-build/

steps:
- task: Cache@2
  inputs:
    key: 'go | "$(Agent.OS)" | go.mod'
    restoreKeys: | 
      go | "$(Agent.OS)"
    path: $(GO_CACHE_DIR)
  displayName: Cache GO packages

GradleGradle

Gradle 'in yerleşik önbelleğe alma desteğinin kullanılması, derleme zamanında önemli bir etkiye sahip olabilir.Using Gradle's built-in caching support can have a significant impact on build time. Etkinleştirmek için, GRADLE_USER_HOME ortam değişkenini altında bir yol olarak ayarlayın $(Pipeline.Workspace) ve --build-cache komut satırını geçirin ya da org.gradle.caching=true dosyanızda ayarlayın gradle.properties .To enable, set the GRADLE_USER_HOME environment variable to a path under $(Pipeline.Workspace) and either pass --build-cache on the command line or set org.gradle.caching=true in your gradle.properties file.

Örnek:Example:

variables:
  GRADLE_USER_HOME: $(Pipeline.Workspace)/.gradle

steps:
- task: Cache@2
  inputs:
    key: 'gradle | "$(Agent.OS)"'
    restoreKeys: gradle
    path: $(GRADLE_USER_HOME)
  displayName: Gradle build cache

- script: |
    ./gradlew --build-cache build    
    # stop the Gradle daemon to ensure no files are left open (impacting the save cache operation later)
    ./gradlew --stop    
  displayName: Build

Not

Bu örnekte, anahtar sabit bir değerdir (işletim sistemi adı) ve önbellekler sabit olduğundan, belirli bir kapsam (dal) için bu anahtarla bir önbellek oluşturulduktan sonra önbellek güncelleştirilemez.In this example, the key is a fixed value (the OS name) and because caches are immutable, once a cache with this key is created for a particular scope (branch), the cache cannot be updated. Bu, aynı dala yönelik sonraki derlemelerin, önbelleğin içeriği değişmiş olsa bile önbelleği güncelleştiremeyeceği anlamına gelir.This means subsequent builds for the same branch will not be able to update the cache even if the cache's contents have changed. Bu sorun gelecek bir özellikte değinilecek: 10842: ardışık düzen önbelleğe alma işleminde geri dönüş anahtarlarını etkinleştirme.This problem will be addressed in an upcoming feature: 10842: Enable fallback keys in Pipeline Caching.

MavenMaven

Maven, indirmeleri ve yerleşik yapıları depolayan yerel bir depoya sahiptir.Maven has a local repository where it stores downloads and built artifacts. Etkinleştirmek için, maven.repo.local seçeneğini altında bir yol olarak ayarlayın $(Pipeline.Workspace) ve bu klasörü önbelleğe koyun.To enable, set the maven.repo.local option to a path under $(Pipeline.Workspace) and cache this folder.

Örnek:Example:

variables:
  MAVEN_CACHE_FOLDER: $(Pipeline.Workspace)/.m2/repository
  MAVEN_OPTS: '-Dmaven.repo.local=$(MAVEN_CACHE_FOLDER)'

steps:
- task: Cache@2
  inputs:
    key: 'maven | "$(Agent.OS)" | **/pom.xml'
    restoreKeys: |
      maven | "$(Agent.OS)"
      maven
    path: $(MAVEN_CACHE_FOLDER)
  displayName: Cache Maven local repo

- script: mvn install -B -e

Maven görevikullanıyorsanız, MAVEN_OPTS bunun üzerine yazılmadığı için değişkeni de geçirdiğinizden emin olun:If you are using a Maven task, make sure to also pass the MAVEN_OPTS variable because it gets overwritten otherwise:

- task: Maven@3
  inputs:
    mavenPomFile: 'pom.xml'
    mavenOptions: '-Xmx3072m $(MAVEN_OPTS)'

.NET/NuGet.NET/NuGet

PackageReferencesNuGet bağımlılıklarını doğrudan proje dosyanızda ve dosya (dosyaları) içinde yönetmek için kullanıyorsanız packages.lock.json , NUGET_PACKAGES ortam değişkenini bu dizini altında bir yol olarak ayarlayarak ve önbelleğe almayı etkinleştirebilirsiniz $(UserProfile) .If you use PackageReferences to manage NuGet dependencies directly within your project file and have packages.lock.json file(s), you can enable caching by setting the NUGET_PACKAGES environment variable to a path under $(UserProfile) and caching this directory.

Örnek:Example:

variables:
  NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages

steps:
- task: Cache@2
  inputs:
    key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**'
    restoreKeys: |
       nuget | "$(Agent.OS)"
    path: $(NUGET_PACKAGES)
  displayName: Cache NuGet packages

İpucu

Ortam değişkenleri her zaman NuGet.Config dosyadaki tüm ayarları geçersiz kılar.Environment variables always override any settings in the NuGet.Config file. İşlem hattınızda hata vererek başarısız olduysa Information, There is a cache miss. , aracıdaki yeni yerel yolu göstermek için bir işlem hattı değişkeni oluşturmanız gerekir NUGET_PACKAGES (Exp d:\a\1) ) .If your pipeline failed with the error: Information, There is a cache miss., you must create a pipeline variable for NUGET_PACKAGES to point to the new local path on the agent (exp d:\a\1). İşlem hatlarınız değişiklikleri seçip göreve başarıyla devam etmelidir.Your pipeline should pick up the changes then and continue the task successfully.

Kilit dosyası oluşturmayı etkinleştirme hakkında daha fazla bilgi için bkz. proje dosyalarında paket başvurusu .See Package reference in project files for more details on how to enable lock file creation.

Node.js/NPMNode.js/npm

Node.js bir projede önbelleğe almayı etkinleştirmenin farklı yolları vardır, ancak önerilen yol NPM 'nin paylaşılan önbellek dizininiönbelleğe almak için kullanılır.There are different ways to enable caching in a Node.js project, but the recommended way is to cache npm's shared cache directory. Bu dizin NPM tarafından yönetilir ve indirilen tüm modüllerin önbelleğe alınmış bir sürümünü içerir.This directory is managed by npm and contains a cached version of all downloaded modules. Yüklemesi sırasında NPM, genel npm kayıt defteri veya özel bir kayıt defterine yapılan ağ çağrılarını azaltabilen veya ortadan kaldıran modüller için önce bu dizini denetler (varsayılan olarak).During install, npm checks this directory first (by default) for modules which can reduce or eliminate network calls to the public npm registry or to a private registry.

NPM 'nin paylaşılan önbellek dizininin varsayılan yolu tüm platformlarda aynıolmadığından, npm_config_cache ortam değişkenini altında bir yol olarak geçersiz kılmanız önerilir $(Pipeline.Workspace) .Because the default path to npm's shared cache directory is not the same across all platforms, it is recommended to override the npm_config_cache environment variable to a path under $(Pipeline.Workspace). Bu Ayrıca, önbelleğin kapsayıcı ve kapsayıcı olmayan işlerden erişilebilir olmasını da sağlar.This also ensures the cache is accessible from container and non-container jobs.

Örnek:Example:

variables:
  npm_config_cache: $(Pipeline.Workspace)/.npm

steps:
- task: Cache@2
  inputs:
    key: 'npm | "$(Agent.OS)" | package-lock.json'
    restoreKeys: |
       npm | "$(Agent.OS)"
    path: $(npm_config_cache)
  displayName: Cache npm

- script: npm ci

Projenizin bir package-lock.json dosyası yoksa, package.json bunun yerine önbellek anahtarı girişinde dosyaya başvurun.If your project does not have a package-lock.json file, reference the package.json file in the cache key input instead.

İpucu

npm ci node_modules , Tutarlı, yinelenebilir bir modül kümesinin kullanıldığından emin olmak için klasörü sildiği için, ' ı çağırırken önbelleğe almayı önleyin node_modules npm ci .Because npm ci deletes the node_modules folder to ensure that a consistent, repeatable set of modules is used, you should avoid caching node_modules when calling npm ci.

Node.js/YarnNode.js/Yarn

NPM ile olduğu gibi, Yarn ile yüklenen paketleri önbelleğe almanın farklı yolları vardır.Like with npm, there are different ways to cache packages installed with Yarn. Önerilen yol, Yarn 'nin paylaşılan önbellek klasörünüönbelleğe almak için kullanılır.The recommended way is to cache Yarn's shared cache folder. Bu dizin Yarn tarafından yönetilir ve indirilen tüm paketlerin önbelleğe alınmış bir sürümünü içerir.This directory is managed by Yarn and contains a cached version of all downloaded packages. Yüklemesi sırasında Yarn, genel veya özel kayıt defterlerine yapılan ağ çağrılarını azaltabilen veya ortadan kaldıran modüller için önce bu dizini (varsayılan olarak) denetler.During install, Yarn checks this directory first (by default) for modules, which can reduce or eliminate network calls to public or private registries.

Örnek:Example:

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

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

- script: yarn --frozen-lockfile

Python/PIPPython/pip

PIP veya Poetry kullanan Python projeleri için PIP_CACHE_DIR ortam değişkenini geçersiz kılın.For Python projects that use pip or Poetry, override the PIP_CACHE_DIR environment variable. Poetry kullanırsanız, key alanında öğesini requirements.txt ile değiştirin poetry.lock .If you use Poetry, in the key field, replace requirements.txt with poetry.lock.

ÖrnekExample

variables:
  PIP_CACHE_DIR: $(Pipeline.Workspace)/.pip

steps:
- task: Cache@2
  inputs:
    key: 'python | "$(Agent.OS)" | requirements.txt'
    restoreKeys: | 
      python | "$(Agent.OS)"
      python
    path: $(PIP_CACHE_DIR)
  displayName: Cache pip packages

- script: pip install -r requirements.txt

Python/PipenvPython/Pipenv

Pipenv kullanan Python projeleri için ortam değişkenini geçersiz kılın PIPENV_CACHE_DIR .For Python projects that use Pipenv, override the PIPENV_CACHE_DIR environment variable.

ÖrnekExample

variables:
  PIPENV_CACHE_DIR: $(Pipeline.Workspace)/.pipenv

steps:
- task: Cache@2
  inputs:
    key: 'python | "$(Agent.OS)" | Pipfile.lock'
    restoreKeys: | 
      python | "$(Agent.OS)"
      python
    path: $(PIPENV_CACHE_DIR)
  displayName: Cache pipenv packages

- script: pipenv install

Python/AnacondaPython/Anaconda

Anaconda ortamları ile ardışık düzen önbelleğe alma 'yı ayarlamaSet up your pipeline caching with Anaconda environments

ÖrnekExample

variables:
  CONDA_CACHE_DIR: $(Pipeline.Workspace)/.condarc

# Add conda to system path
steps:
- script: echo "##vso[task.prependpath]$CONDA/bin"
  displayName: Add conda to PATH

- task: Cache@2
  displayName: Use cached Anaconda environment
  inputs:
    key: 'conda | "$(Agent.OS)" | environment.yml'
    restoreKeys: | 
      python | "$(Agent.OS)"
      python
    path: $(CONDA_CACHE_DIR)
    cacheHitVar: CONDA_CACHE_RESTORED

- script: conda env create --quiet --file environment.yml
  displayName: Create Anaconda environment
  condition: eq(variables.CONDA_CACHE_RESTORED, 'false')

PHP/besteciPHP/Composer

Besteci Oluşturucu kullanan PHP projeleri için, COMPOSER_CACHE_DIR besteci tarafından kullanılan ortam değişkenini geçersiz kılın.For PHP projects using Composer, override the COMPOSER_CACHE_DIR environment variable used by Composer.

Örnek:Example:

variables:
  COMPOSER_CACHE_DIR: $(Pipeline.Workspace)/.composer

steps:
- task: Cache@2
  inputs:
    key: 'composer | "$(Agent.OS)" | composer.lock'
    restoreKeys: |
      composer | "$(Agent.OS)"
      composer
    path: $(COMPOSER_CACHE_DIR)
  displayName: Cache composer

- script: composer install

Bilinen sorunlar ve geri bildirimlerKnown issues and feedback

Projeniz için önbelleğe almayı etkinleştirme sorunlarıyla karşılaşırsanız, önce Microsoft/Azure-işlem hatları-görevler deposundaki işlem hattı önbelleğe alma sorunları listesini kontrol edin.If you experience problems enabling caching for your project, first check the list of pipeline caching issues in the microsoft/azure-pipelines-tasks repo. Sorununuzu listede görmüyorsanız Yeni bir sorun oluşturun.If you don't see your issue listed, create a new issue.

SSSFAQ

Bir önbelleği temizleyebilir miyim?Can I clear a cache?

Önbellek Temizleme işlemi şu anda desteklenmiyor.Clearing a cache is currently not supported. Ancak, var olan version2 önbellekler üzerinde herhangi bir isabetlerin önlediği bir şekilde anahtarı değiştirmek için mevcut önbellek anahtarınıza bir dize sabit değeri (gibi) ekleyebilirsiniz.However you can add a string literal (such as version2) to your existing cache key to change the key in a way that avoids any hits on existing caches. Örneğin, aşağıdaki önbellek anahtarını bu şekilde değiştirin:For example, change the following cache key from this:

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

şu şekilde:to this:

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

Önbelleğin süre sonu ne zaman dolacak?When does a cache expire?

Bir önbelleğin, yedi gün sonra etkinlik olmadığında sona erer.A cache will expire after seven days of no activity.

Önbelleğin boyutuyla ilgili bir sınır var mı?Is there a limit on the size of a cache?

Tek tek önbellekler veya bir kuruluştaki tüm önbelleklerin toplam boyutu üzerinde hiçbir Zorlanmış sınır yoktur.There is no enforced limit on the size of individual caches or the total size of all caches in an organization.