Dela via


Pipeline-cache

Azure DevOps-tjänster

Cachelagring av pipelinen kan minska byggtiden genom att återanvända nedladdade beroenden från tidigare körningar, så att du inte behöver återskapa eller ladda ned samma filer igen. Detta är särskilt användbart i scenarier där samma beroenden laddas ned upprepade gånger i början av varje körning. Det här är ofta en tidskrävande process som omfattar hundratals eller tusentals nätverksanrop.

Cachelagring är mest effektivt när den tid som krävs för att återställa och spara cacheminnet är mindre än den tid det tar att återskapa filerna. Men i vissa fall kanske cachelagring inte ger prestandafördelar och kan till och med påverka byggtiden negativt. Det är viktigt att utvärdera ditt specifika scenario för att avgöra om cachelagring är rätt metod.

Obs

Cachelagring av pipeline stöds inte för klassiska versionspipelines.

När du ska använda pipelineartefakter kontra pipelinecachelagring

Cachelagring av pipeline och pipelineartefakter utför liknande funktioner men är avsedda för olika scenarier och bör inte användas på ett utbytbart sätt.

  • Använd pipelineartefakter: när du behöver ta specifika filer som skapats av ett jobb och dela dem med andra jobb (och de andra jobben skulle förmodligen misslyckas utan dem).

  • Använd pipeline-cachning: när du vill förbättra byggtiden genom att återanvända filer från tidigare körningar, eftersom frånvaron av dessa filer inte påverkar jobbets förmåga att köras.

Obs

Pipeline-cache och pipeline-artifakter är tillgängliga utan kostnad för alla nivåer (kostnadsfri och betald). Mer information finns i Artifakternas lagringsförbrukning.

Krav för lokalt installerad agent

Följande körbara filer måste finnas i en mapp som anges i PATH miljövariabeln. Observera att dessa krav endast gäller för lokalt installerade agenter, eftersom värdbaserade agenter förinstalleras med nödvändig programvara.

Arkivera programvara/plattform Windows Linux Mac
GNU Tjära Krävs Krävs Nej
BSD tar Nej Nej Krävs
7-dragkedja Rekommenderad Nej Nej

Cacheaktivitet: Så här fungerar den

Cachelagring läggs till i en pipeline genom att cacheaktiviteten läggs till i steps avsnittet i ett jobb.

När ett cachesteg påträffas under pipelinekörningen försöker uppgiften återställa cachen baserat på de angivna indata. Om ingen cache hittas slutförs steget och nästa steg i jobbet körs.

När alla steg i jobbet har körts framgångsrikt läggs ett särskilt "Post-job: Cache" -steg automatiskt till och utlöses för varje "återställningscache"-steg som inte har hoppats över. Det här steget har ansvar för att spara cacheminnet .

Obs

Cacher är oföränderliga. När en cache har skapats kan dess innehåll inte ändras.

Konfigurera cachningsuppgiften

Cacheaktiviteten har två obligatoriska argument: sökväg och nyckel:

  1. path: Sökvägen till den mapp som du vill cachelagrade. Detta kan vara en absolut eller relativ sökväg. Relativa sökvägar löses upp mot $(System.DefaultWorkingDirectory).

    Tips

    Du kan använda fördefinierade variabler för att lagra sökvägen till den mapp som du vill cachelagrar. Jokertecken stöds dock inte.

  2. nyckel: Detta definierar identifieraren för cacheminnet som du vill återställa eller spara. Nyckeln består av en kombination av strängvärden, filsökvägar eller filmönster, där varje segment avgränsas med ett | tecken.

    • Strängar:
      Ett fast värde (till exempel cachenamnet eller ett verktygsnamn) eller hämtat från en miljövariabel (till exempel det aktuella operativsystemet eller jobbnamnet).

    • Filsökvägar:
      Sökvägen till en specifik fil vars innehåll ska hashas. Filen måste finnas när aktiviteten körs. Alla segment som liknar en filsökväg behandlas som sådana, så var försiktig, särskilt när du använder segment som innehåller ., eftersom detta kan leda till "filen finns inte" fel.

      Tips

      Om du vill undvika att ett sökvägsliknande strängsegment behandlas som en filsökväg, omsluter du det med dubbla citattecken, till exempel: "my.key" | $(Agent.OS) | key.file

    • Filmönster:
      En kommaavgränsad lista över jokerteckenmönster i globformat som måste matcha minst en fil. Exempel:

      • **/yarn.lock: alla yarn.lock-filer under källkatalogen.
      • */asset.json, !bin/**: alla asset.json filer som finns i en katalog under källkatalogen, förutom de i bin-katalogen .

Innehållet i en fil som identifieras av en filsökväg eller ett filmönster hashas för att generera en dynamisk cachenyckel. Detta är användbart när projektet har filer som unikt identifierar vad som cachelagras. Till exempel refereras filer som package-lock.json, yarn.lock, Gemfile.lockeller Pipfile.lock ofta i en cachenyckel, eftersom de representerar en unik uppsättning beroenden. Relativa filsökvägar eller mönster löses utifrån $(System.DefaultWorkingDirectory).

  • Exempel:

I följande exempel visas hur du cachelagrade Yarn-paket:

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

I det här exemplet består cachenyckeln av tre delar: en statisk sträng ("yarn"), operativsystemet som jobbet körs på (eftersom cachen är unik per operativsystem) och hashen för yarn.lock filen (som unikt identifierar beroendena).

Vid den första körningen efter att uppgiften har lagts till rapporterar cachesteget en "cachemiss" eftersom cachen som identifieras av den här nyckeln inte finns. Efter det sista steget skapas en cache från filerna i $(Pipeline.Workspace)/s/.yarn och laddas upp. Vid nästa körning rapporterar cachesteget en "cacheträff" och innehållet i cachen laddas ned och återställs.

När du använder checkout: selfcheckas lagringsplatsen ut till $(Pipeline.Workspace)/soch mappen .yarn kommer troligen att finnas på själva lagringsplatsen.

Obs

Pipeline.Workspace är den lokala sökvägen på agenten som kör din pipeline där alla kataloger skapas. Den här variabeln har samma värde som Agent.BuildDirectory. Om du inte använder checkout: self, kontrollerar du att du uppdaterar variabeln YARN_CACHE_FOLDER så att den pekar på platsen för .yarn i ditt lagringsutrymme.

Använd återställningsnycklar

restoreKeys gör att du kan ställa frågor till flera specifika nycklar eller nyckelprefix. Den används som reserv när den angivna key inte ger någon träff. En återställningsnyckel söker efter en nyckel med prefix och returnerar den senast skapade cacheposten. Detta är användbart när pipelinen inte kan hitta en exakt matchning men ändå vill använda en partiell cacheträff.

Om du vill ange flera återställningsnycklar anger du dem på separata rader. Ordningen i vilken återställningsnycklarna provas är uppifrån och ned.

  • Exempel:

Här är ett exempel på hur du använder återställningsnycklar för att cachea Yarn-paket.

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

I det här exemplet försöker cacheaktiviteten först återställa den angivna nyckeln. Om nyckeln inte finns i cacheminnet försöker den sedan med den första återställningsnyckeln: yarn | $(Agent.OS). Detta söker efter cachenycklar som exakt matchar eller börjar med det här prefixet.

En prefixmatchning kan inträffa om hashen för yarn.lock filen har ändrats. Om cachen till exempel innehåller nyckeln yarn | $(Agent.OS) | old-yarn.lock (där old-yarn.lock har en annan hash än den aktuella yarn.lock) skulle återställningsnyckeln resultera i en partiell cacheträff.

Om den första återställningsnyckeln inte ger någon matchning söker nästa återställningsnyckel (yarn) Efter en cachenyckel som börjar med yarn. För prefixmatchningar returnerar återställningsprocessen den senast skapade cacheposten.

Obs

En pipeline kan innehålla flera cachelagringsuppgifter och det finns ingen lagringsgräns för cachelagring. Jobb och uppgifter i samma pipeline kan komma åt och dela samma cache.

Använd återställningsläge

I vissa scenarier kanske du vill köra steg villkorligt baserat på om cacheminnet har återställts. Du kan till exempel hoppa över ett steg som installerar beroenden om cacheminnet återställdes. Detta kan uppnås med argumentet cacheHitVar .

Om du anger den här indatan till namnet på en miljövariabel anges variabeln till true när det finns en cacheträff, inexact om en återställningsnyckel ger en partiell cacheträff och false om ingen cache hittas. Du kan sedan referera till den här variabeln i ett stegvillkor eller i ett skript.

Här är ett exempel där install-deps.sh steget hoppas över när cacheminnet återställs:

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

Cacheisolering och säkerhet

För att säkerställa isolering mellan cacheminnen från olika pipelines och olika grenar lagras varje cache i en logisk container som kallas ett omfång. Scope fungerar som en säkerhetsgräns som garanterar:

  • Jobb från en pipeline kan inte komma åt cacheminnen från en annan pipeline.

  • Jobb som skapar pull-begäranden kan läsa cacheminnen från målgrenen (för samma pipeline), men kan inte skriva (skapa) cacheminnen i målgrenens omfång.

När ett cachesteg påträffas under en körning begärs den av nyckeln identifierade cachen från servern. Servern letar sedan efter en cache med den här nyckeln från de omfång som är synliga för jobbet och returnerar cacheminnet (om tillgängligt). När cachen sparas (i slutet av jobbet) skrivs den till det område som representerar pipelinen och grenen.

CI, manuella och schemalagda processer

Omfattning Läsa Skriva
Källgren Ja Ja
main gren Ja Nej
master gren Ja Nej

Pull-begäranden genomförs

Omfattning Läsa Skriva
Källgren Ja Nej
Målfilial Ja Nej
Mellanliggande gren (till exempel refs/pull/1/merge) Ja Ja
main gren Ja Nej
master gren Ja Nej

Körningar av förgrenade pull-begäranden

Gren Läsa Skriva
Målfilial Ja Nej
Mellanliggande gren (till exempel refs/pull/1/merge) Ja Ja
main gren Ja Nej
master gren Ja Nej

Tips

Eftersom cacheminnen redan är begränsade till ett projekt, en pipeline och en gren behöver du inte inkludera några projekt-, pipeline- eller grenidentifierare i cachenyckeln.

Exempel

För Ruby-projekt som använder Bundler åsidosätter du BUNDLE_PATH miljövariabeln för att ange sökvägen där Bundler letar efter Gems.

Exempel:

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   

Kända problem och feedback

Om du har problem med att konfigurera cachelagring i pipelinen kontrollerar du listan över öppna problem på lagringsplatsen microsoft/azure-pipelines-tasks . Om du inte ser ditt problem i listan skapa en ny och ange nödvändig information om ditt scenario.

Frågor och svar

F: Kan jag rensa en cache?

S: Det går inte att rensa en cache. Du kan dock undvika träffar på befintliga cacheminnen genom att lägga till en strängliteral (till exempel version2) i cachenyckeln. Ändra till exempel följande cachenyckel från detta:

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

Så här gör du:

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

F: När upphör en cache att gälla?

Cacher går ut efter sju dagar utan aktivitet.

F: När laddas cachen upp?

S: En cache skapas från din angivna path och laddas upp efter det sista steget i jobbet. Mer information finns i exempel.

F: Finns det en gräns för storleken på en cache?

S: Det finns ingen framtvingad gräns för storleken på enskilda cacheminnen eller den totala cachestorleken i en organisation.