Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Služby Azure DevOps
Ukládání kanálů do mezipaměti může pomoci zkrátit dobu sestavení tím, že znovu použije stažené závislosti z předchozích spuštění, takže nebude nutné znovu vytvářet nebo stahovat stejné soubory. To je užitečné zejména ve scénářích, kdy se stejné závislosti stahují opakovaně na začátku každého spuštění. To je často časově náročný proces zahrnující stovky nebo tisíce síťových volání.
Ukládání do mezipaměti je nejúčinnější, když je čas potřebný k obnovení a uložení vyrovnávací paměti kratší než čas potřebný k opětovnému vygenerování souborů. V některých případech však ukládání do mezipaměti nemusí poskytovat výhody z hlediska výkonu a může dokonce negativně ovlivnit dobu sestavení. Je důležité vyhodnotit konkrétní scénář a určit, jestli je ukládání do mezipaměti správným přístupem.
Poznámka
Ukládání kanálů do mezipaměti se u klasických kanálů verze nepodporuje.
Kdy použít artefakty kanálu a kdy ukládat kanály do mezipaměti
Ukládání kanálů do mezipaměti a artefakty kanálu provádějí podobné funkce, ale jsou určené pro různé scénáře a neměly by se používat zaměnitelně.
Použít artefakty kanálu: Když potřebujete vzít konkrétní soubory vytvořené jednou úlohou a sdílet je s jinými úlohami (a tyto jiné úlohy by bez nich pravděpodobně selhaly).
Použít ukládání kanálů do mezipaměti: Pokud chcete zkrátit dobu sestavení opětovným použitím souborů z předchozích spuštění (a nemít tyto soubory nebude mít vliv na schopnost úlohy běžet).
Poznámka
Ukládání do mezipaměti kanálu a artefakty kanálu jsou k dispozici zdarma pro všechny úrovně (bezplatné i placené). Další podrobnosti najdete v tématu Využití úložiště Artifacts.
Požadavky na agenta v místním prostředí
Následující spustitelné soubory musí být umístěny ve složce uvedené v proměnné PATH prostředí. Všimněte si, že tyto požadavky se vztahují pouze na agenty v místním prostředí, protože hostovaní agenti jsou předinstalovaní s potřebným softwarem.
| Archivní software / platforma | Windows | Operační systém Linux | Macintosh |
|---|---|---|---|
| GNU Tar | Povinný | Povinný | Ne |
| BSD dehet | Ne | Ne | Povinný |
| 7-Zip | Doporučený | Ne | Ne |
Úloha kešování: Jak to funguje
Ukládání do mezipaměti se do kanálu přidá přidáním úlohy Cache do steps části úlohy.
Když během provádění kanálu dojde ke kroku mezipaměti, úloha se pokusí obnovit mezipaměť na základě zadaných vstupů. Pokud není nalezena žádná mezipaměť, krok se dokončí a provede se další krok v úloze.
Jakmile jsou všechny kroky v úloze úspěšně spuštěny, je pro každý nepřeskočený krok "obnovení mezipaměti" automaticky přidán a aktivován speciální krok "Po úloze: Mezipaměť". Tento krok zodpovídá za ukládání mezipaměti.
Poznámka
Cache jsou neměnné. Jakmile je mezipaměť vytvořena, nelze její obsah upravovat.
Konfigurace úlohy mezipaměti
Úloha Cache má dva povinné argumenty: cestu a klíč:
path: Cesta ke složce, kterou chcete uložit do mezipaměti. Může to být absolutní nebo relativní cesta. Relativní cesty jsou vyhodnocovány ve vztahu k
$(System.DefaultWorkingDirectory).Spropitné
Pomocí předdefinovaných proměnných můžete uložit cestu ke složce, kterou chcete uložit do mezipaměti. Zástupné znaky však nejsou podporovány.
key: Definuje identifikátor mezipaměti, kterou chcete obnovit nebo uložit. Klíč se skládá z kombinace řetězcových hodnot, cest k souborům nebo vzorů souborů, přičemž každý segment je oddělen znakem
|.řetězců:
Pevná hodnota (například název mezipaměti nebo název nástroje) nebo převzatá z proměnné prostředí (například aktuální název operačního systému nebo úlohy).cesty k souborům:
Cesta ke konkrétnímu souboru, jehož obsah bude zašifrován. Soubor musí existovat v době spuštění úlohy. S každým segmentem, který se podobá cestě k souboru, se tak zachází, proto buďte opatrní, zejména při použití segmentů obsahujících., protože to může vést k chybám "soubor neexistuje".Spropitné
Pokud se chcete vyhnout tomu, aby se s řetězcovým segmentem podobným cestě zacházelo jako s cestou k souboru, zabalte ho dvojitými uvozovkami, například:
"my.key" | $(Agent.OS) | key.filevzory souborů :
Čárkami oddělený seznam vzorů zástupných znaků ve stylu glob, které musí odpovídat alespoň jednomu souboru. Příklady:-
**/yarn.lock: všechny soubory yarn.lock v adresáři sources. -
*/asset.json, !bin/**: všechny souboryasset.json umístěné v adresáři v adresáři zdroje, kromě souborů v adresáři bin .
-
Obsah každého souboru identifikovaného cestou k souboru nebo vzorem souboru je zahashován, aby se vygeneroval dynamický klíč mezipaměti. To je užitečné, když váš projekt obsahuje soubory, které jednoznačně identifikují, co se ukládá do mezipaměti. Například na soubory jako package-lock.json, yarn.lock, , Gemfile.locknebo Pipfile.lock se často odkazuje v klíči mezipaměti, protože představují jedinečnou sadu závislostí. Relativní cesty k souborům nebo vzorky jsou přeloženy proti $(System.DefaultWorkingDirectory).
- příklad:
Následující příklad ukazuje, jak ukládat balíčky Yarn do mezipaměti:
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
V tomto příkladu se klíč mezipaměti skládá ze tří částí: statického řetězce ("příze"), operačního systému, ve kterém je úloha spuštěna (protože mezipaměť je jedinečná pro každý operační systém), a hodnoty hash yarn.lock souboru (která jednoznačně identifikuje závislosti).
Při prvním spuštění po přidání úlohy krok mezipaměti ohlásí "neúspěšné uložení do mezipaměti", protože mezipaměť identifikovaná tímto klíčem neexistuje. Po posledním kroku se vytvoří mezipaměť ze souborů v $(Pipeline.Workspace)/s/.yarn a nahraje se. Při příštím spuštění krok mezipaměti nahlásí "zásah do mezipaměti" a obsah mezipaměti se stáhne a obnoví.
Při použití checkout: selfprogramu je úložiště rezervováno do $(Pipeline.Workspace)/sa vaše .yarn složka bude pravděpodobně umístěna v samotném úložišti.
Poznámka
Pipeline.Workspace je místní cesta agenta, na kterém běží váš kanál, ve kterém jsou vytvořeny všechny adresáře. Tato proměnná má stejnou hodnotu jako Agent.BuildDirectory.
Pokud nepoužíváte checkout: self, ujistěte se, že jste proměnnou aktualizovali YARN_CACHE_FOLDER tak, aby odkazovala na umístění ve .yarn vašem úložišti.
Použití obnovovacích klíčů
restoreKeys Umožňuje dotazovat se na více přesných klíčů nebo předpon klíčů. Používá se jako záložní řešení, když zadaný key nepřináší přístup. Klíč pro obnovení vyhledá klíč podle předpony a vrátí naposledy vytvořenou položku mezipaměti. To je užitečné, když kanál nemůže najít přesnou shodu, ale přesto chce použít částečný požadavek na mezipaměť.
Chcete-li zadat více obnovovacích klíčů, uveďte je na samostatných řádcích. Pořadí, ve kterém se klíče pro obnovení zkouší, je shora dolů.
- příklad:
Zde je příklad, jak použít klíče pro obnovení k ukládání balíčků Yarn do mezipamě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
V tomto příkladu se úloha ukládání do mezipaměti nejprve pokusí obnovit zadaný klíč. Pokud klíč v mezipaměti neexistuje, zkusí se použít první klíč pro obnovení: yarn | $(Agent.OS). Tím se vyhledají všechny klíče mezipaměti, které se přesně shodují s touto předponou nebo začínají touto předponou.
Shoda předpony může nastat, pokud se změnila hodnota hash yarn.lock souboru. Pokud například mezipaměť obsahuje klíč yarn | $(Agent.OS) | old-yarn.lock (kde old-yarn.lock má jiný hash než aktuální yarn.lock), bude mít tento klíč obnovení za následek částečný přístup do mezipaměti.
Pokud první klíč pro obnovení nevrátí shodu, další klíč pro obnovení (yarn) To vyhledá jakýkoli klíč mezipaměti, který začíná na yarn. V případě shod předpon vrátí proces obnovení naposledy vytvořenou položku mezipaměti.
Poznámka
Kanál může obsahovat více úloh ukládání do mezipaměti a pro ukládání do mezipaměti neexistuje žádný limit úložiště. Úlohy a úlohy v rámci stejného kanálu mohou přistupovat ke stejné mezipaměti a sdílet ji.
Použít podmínku obnovení
V některých scénářích můžete chtít podmíněně provést kroky na základě toho, zda byla mezipaměť úspěšně obnovena. Můžete například přeskočit krok, který nainstaluje závislosti, pokud byla mezipaměť obnovena. Toho lze dosáhnout pomocí argumentu cacheHitVar .
Nastavení tohoto vstupu na název proměnné prostředí způsobí, že proměnná bude nastavena na true hodnotu v případě, že dojde k dosažení mezipaměti, inexact pokud klíč obnovení poskytne částečný přístup do mezipaměti a false pokud není nalezena žádná mezipaměť. Na tuto proměnnou pak můžete odkazovat v podmínce kroku nebo ve skriptu.
Zde je příklad, kdy install-deps.sh se krok při obnovení mezipaměti přeskočí:
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
Izolace a zabezpečení mezipaměti
Aby se zajistila izolace mezi mezipamětí z různých kanálů a různých větví, je každá mezipaměť uložena v logickém kontejneru nazývaném obor. Rozsahy fungují jako hranice zabezpečení, která zaručuje:
Úlohy z jednoho kanálu nemají přístup k mezipamětem z jiného kanálu.
Úlohy, které vytvářejí žádosti o přijetí změn, mohou číst mezipaměti z cílové větve (pro stejný kanál), ale nemohou zapisovat (vytvářet) mezipaměti v oboru cílové větve.
Když během spuštění dojde k kroku mezipaměti, vyžádá se ze serveru mezipaměť identifikovaná klíčem. Server pak vyhledá mezipaměť s tímto klíčem z oborů viditelných pro úlohu a vrátí mezipaměť (pokud je k dispozici). Při ukládání mezipaměti (na konci úlohy) se mezipaměť zapíše do rozsahu, který představuje potrubí a větev.
CI, ruční a naplánovaná spuštění
| Rozsah | Číst | Psát |
|---|---|---|
| Zdrojová větev | Ano | Ano |
větev main |
Ano | Ne |
větev master |
Ano | Ne |
Spuštění procesů žádostí o přijetí změn
| Rozsah | Číst | Psát |
|---|---|---|
| Zdrojová větev | Ano | Ne |
| Cílová větev | Ano | Ne |
Zprostředkovací větev (například refs/pull/1/merge) |
Ano | Ano |
větev main |
Ano | Ne |
větev master |
Ano | Ne |
Spuštění forku pull requestu
| Větev | Číst | Psát |
|---|---|---|
| Cílová větev | Ano | Ne |
Zprostředkovací větev (například refs/pull/1/merge) |
Ano | Ano |
větev main |
Ano | Ne |
větev master |
Ano | Ne |
Spropitné
Vzhledem k tomu, že mezipaměti jsou již vymezeny na projekt, kanál a větev, není nutné do klíče mezipaměti zahrnout žádné identifikátory projektu, kanálu nebo větve.
Příklady
- Balicí stroj
- Ccache
- Dokař
- Pokračovat
- Gradle
- Odborník
- .NET/NuGet
- Npm
- Příze
- Krajta/Anakonda
- PHP/Skladatel
U projektů Ruby používajících Bundler přepište proměnnou BUNDLE_PATH prostředí a nastavte cestu , kde Bundler hledá drahokamy.
příklad:
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
Známé problémy a zpětná vazba
Pokud máte potíže s nastavením ukládání do mezipaměti ve svém kanálu, podívejte se na seznam otevřených problémů v microsoft/azure-pipelines-tasks úložišti. Pokud váš problém není uveden, vytvořte nový a poskytněte potřebné informace o vašem scénáři.
Otázky a odpovědi
Otázka: Můžu vymazat mezipaměť?
Odpověď: Vymazání mezipaměti není podporováno. Přístupům do stávajících mezipamětí se však můžete vyhnout přidáním řetězcového literálu (například version2) do klíče mezipaměti. Například změňte následující klíč mezipaměti z tohoto:
key: 'yarn | "$(Agent.OS)" | yarn.lock'
Na toto:
key: 'version2 | yarn | "$(Agent.OS)" | yarn.lock'
Otázka: Kdy vyprší platnost mezipaměti?
A: Platnost mezipaměti vyprší po sedmi dnech bez aktivity.
Otázka: Kdy se mezipaměť nahraje?
Odpověď: Mezipaměť se vytvoří ze zadaného path a nahraje po posledním kroku úlohy. Další podrobnosti najdete v příkladu.
Otázka: Existuje omezení velikosti mezipaměti?
Odpověď: Neexistuje žádné vynucené omezení velikosti jednotlivých mezipamětí nebo celkové velikosti mezipaměti v rámci organizace.