Csővezeték gyorsítótárazása

Azure DevOps Services

A folyamatok gyorsítótárazása segíthet csökkenteni a buildelési időt a korábbi futtatásokból letöltött függőségek újrafelhasználásával, így elkerülhető, hogy ugyanazokat a fájlokat újra létre vagy újra letöltsék. Ez különösen hasznos olyan esetekben, amikor ugyanazok a függőségek lesznek ismételten letöltve az egyes futtatások elején. Ez gyakran több száz vagy több ezer hálózati hívással járó időigényes folyamat.

A gyorsítótárazás akkor a leghatékonyabb, ha a gyorsítótár visszaállításához és mentéséhez szükséges idő rövidebb, mint a fájlok újragenerálásához szükséges idő. Bizonyos esetekben azonban előfordulhat, hogy a gyorsítótárazás nem nyújt teljesítménybeli előnyöket, sőt negatívan befolyásolhatja a buildelési időt. Fontos kiértékelni az adott forgatókönyvet annak megállapításához, hogy a gyorsítótárazás a megfelelő megközelítés-e.

Jegyzet

A folyamatok gyorsítótárazása nem támogatott a klasszikus kiadási folyamatok esetében.

Mikor érdemes folyamat-összetevőket használni a folyamat gyorsítótárazásához képest?

A folyamat-gyorsítótárazás és a folyamat-összetevők hasonló funkciókat hajtanak végre, de különböző forgatókönyvekhez készültek, és nem használhatók felcserélhetően.

  • Folyamat-összetevők használata: amikor egy feladat által előállított fájlokat kell használnia, és meg kell osztania őket más feladatokkal (és ezek a többi feladat valószínűleg meghiúsulnának nélkülük).

  • Folyamat-gyorsítótárazás használata: ha a korábbi futtatások fájljainak újrafelhasználásával szeretné javítani a buildelési időt (és ha nem rendelkezik ezekkel a fájlokkal, az nem befolyásolja a feladat futtatási képességét).

Jegyzet

A folyamat-gyorsítótárazás és a folyamat-összetevők díjmentesen érhetők el minden szinten (ingyenes és fizetős). További részletekért lásd az Artifacts tárolási fogyasztását .

A saját üzemeltetésű ügynökre vonatkozó követelmények

A következő végrehajtható fájloknak a környezeti változóban felsorolt PATH mappában kell lenniük. Vegye figyelembe, hogy ezek a követelmények csak a saját üzemeltetésű ügynökökre vonatkoznak, mivel az üzemeltetett ügynökök előre telepítve vannak a szükséges szoftverrel.

Archív szoftver / platform Windows Linux Mac
GNU Tar Szükséges Szükséges Nem
BSD kátrány Nem Nem Szükséges
7 cipzáras Ajánlott Nem Nem

Gyorsítótár-feladat: Hogyan működik

A gyorsítótárazás úgy kerül a folyamatba, hogy hozzáadja a Gyorsítótár feladatotsteps egy feladat szakaszához.

A folyamat végrehajtása során, ha gyorsítótár-lépéssel találkozik, a feladat a megadott bemenetek alapján próbálja meg visszaállítani a gyorsítótárat. Ha nem található gyorsítótár, a lépés befejeződik, és a feladat következő lépése végrehajtásra kerül.

A feladat összes lépésének sikeres futtatása után a rendszer automatikusan hozzáad egy speciális "Feladat utáni: Gyorsítótár" lépést, és aktiválódik minden olyan "gyorsítótár visszaállítása" lépéshez, amelyet nem hagytak ki. Ez a lépés felelős a gyorsítótármentéséért.

Jegyzet

A gyorsítótárak nem módosíthatók. A gyorsítótár létrehozása után a tartalma nem módosítható.

A Gyorsítótár-feladat konfigurálása

A Cache feladatnak két kötelező argumentuma van: elérési út és kulcs:

  1. elérési út: A gyorsítótárazni kívánt mappa elérési útja. Ez lehet abszolút vagy relatív elérési út. A relatív elérési utak a $(System.DefaultWorkingDirectory)-hoz képest vannak megoldva.

    Borravaló

    Előre definiált változók segítségével tárolhatja a gyorsítótárazni kívánt mappa elérési útját. A helyettesítő karakterek azonban nem támogatottak.

  2. key: Ez határozza meg a visszaállítani vagy menteni kívánt gyorsítótár azonosítóját. A kulcs sztringértékek, fájlelérési utak vagy fájlminták kombinációjából áll, és minden szegmenst egy | karakter választ el egymástól.

    • Húrok:
      Rögzített érték (például a gyorsítótár neve vagy egy eszköz neve), vagy egy környezeti változóból (például az aktuális operációs rendszer vagy feladat neve) származik.

    • fájl elérési útjai:
      Egy adott fájl elérési útja, amelynek tartalma kivonatolva lesz. A fájlnak léteznie kell a feladat futtatásakor. A rendszer minden olyan szegmenst, amely hasonlít a fájl elérési útjára, ezért legyen óvatos, különösen a , mivel .ez a "fájl nem létezik" hibákhoz vezethet.

      Borravaló

      Ha szeretné elkerülni, hogy egy elérési úthoz hasonló sztringszegmens fájlútvonalként legyen kezelve, csomagolja be dupla idézőjelekkel, például: "my.key" | $(Agent.OS) | key.file

    • fájlminták:
      Gömb stílusú helyettesítő karakteres minták vesszővel tagolt listája, amelyeknek legalább egy fájlnak meg kell egyezniük. Példák:

      • **/yarn.lock: az összes yarn.lock fájl a források könyvtárban.
      • */asset.json, !bin/**: a forráskönyvtár alatti könyvtárban található összes asset.json fájl, kivéve azokat, amelyek a bin könyvtárban vannak.

A fájl elérési útja vagy fájlmintája által azonosított fájlok tartalma kivonatolva dinamikus gyorsítótár-kulcsot hoz létre. Ez akkor hasznos, ha a projekt olyan fájlokkal rendelkezik, amelyek egyedileg azonosítják a gyorsítótárazott fájlokat. Például az olyan fájlok, mint a package-lock.json, yarn.lock, Gemfile.lockvagy Pipfile.lock gyakran hivatkoznak egy gyorsítótárkulcsban, mivel ezek egyedi függőségeket képviselnek. A relatív fájlelérési utak vagy minták feloldása a $(System.DefaultWorkingDirectory).

  • példa:

Az alábbi példa bemutatja, hogyan gyorsítótárazhatja a fonalcsomagokat:

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

Ebben a példában a gyorsítótárkulcs három részből áll: egy statikus sztringből ("fonalból"), az operációs rendszerből, amelyen a feladat fut (mivel a gyorsítótár operációs rendszerenként egyedi) és a yarn.lock fájl kivonatából (amely egyedileg azonosítja a függőségeket).

A feladat hozzáadása utáni első futtatáskor a gyorsítótár-lépés "gyorsítótár-hiányt" jelez, mert a kulcs által azonosított gyorsítótár nem létezik. Az utolsó lépés után a rendszer létrehoz egy gyorsítótárat a $(Pipeline.Workspace)/s/.yarn fájljaiból, és feltölti. A következő futtatáskor a gyorsítótár lépése "gyorsítótár-találatot" jelent, és a gyorsítótár tartalma le lesz töltve és visszaállítva.

A használatakor checkout: selfa tárházat a rendszer kiveszi a $(Pipeline.Workspace)/s, és a .yarn mappa valószínűleg magában az adattárban fog elhelyezkedni.

Jegyzet

Pipeline.Workspace a folyamatot futtató ügynök helyi elérési útja, ahol az összes címtár létrejön. Ez a változó ugyanazzal az értékkel rendelkezik, mint Agent.BuildDirectory. Ha nem használja checkout: self, győződjön meg arról, hogy frissíti a változót YARN_CACHE_FOLDER , hogy az adattárban lévő helyre .yarn mutasson.

Visszaállítási kulcsok használata

restoreKeys Lehetővé teszi több pontos kulcs vagy kulcselőtag lekérdezését. Tartalékként használatos, ha a megadott key nem ad találatot. A visszaállítási kulcs előtag alapján keres egy kulcsot, és a legutóbb létrehozott gyorsítótár-bejegyzést adja vissza. Ez akkor hasznos, ha a folyamat nem talál pontos egyezést, de továbbra is részleges gyorsítótár-lekérést szeretne használni.

Több visszaállítási kulcs megadásához sorolja fel őket külön sorokban. A visszaállítási kulcsok kipróbálásának sorrendje fentről lefelé halad.

  • példa:

Íme egy példa arra, hogyan használhat visszaállítási kulcsokat a fonalcsomagok gyorsítótárazásához:

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

Ebben a példában a gyorsítótár-feladat először megpróbálja visszaállítani a megadott kulcsot. Ha a kulcs nem létezik a gyorsítótárban, akkor megpróbálja az első visszaállítási kulcsot: yarn | $(Agent.OS). Ez megkeresi azokat a gyorsítótár-kulcsokat, amelyek pontosan megfelelnek ennek az előtagnak, vagy azzal kezdődnek.

Előtagegyezés akkor fordulhat elő, ha a yarn.lock fájl kivonata megváltozott. Ha például a gyorsítótár tartalmazza a kulcsot yarn | $(Agent.OS) | old-yarn.lock (ahol old-yarn.lock az aktuálistól yarn.lockeltérő kivonattal rendelkezik), ez a visszaállítási kulcs részleges gyorsítótár-találatot eredményez.

Ha az első visszaállítási kulcs nem ad egyezést, a következő visszaállítási kulcs (yarn) Ez minden olyan gyorsítótárkulcsot keres, amely a következővel yarnkezdődik: . Előtagegyezések esetén a visszaállítási folyamat a legutóbb létrehozott gyorsítótár-bejegyzést adja vissza.

Jegyzet

A folyamatok több gyorsítótárazási feladatot is tartalmazhatnak, és a gyorsítótárazáshoz nincs tárolási korlát. Az ugyanazon a folyamaton belüli feladatok és feladatok ugyanazt a gyorsítótárat érhetik el és oszthatják meg.

Visszaállítási feltétel használata

Bizonyos esetekben előfordulhat, hogy feltételesen szeretné végrehajtani a lépéseket attól függően, hogy a gyorsítótár visszaállítása sikeresen megtörtént-e. Kihagyhat például egy olyan lépést, amely függőségeket telepít, ha a gyorsítótár vissza lett állítva. Ez az cacheHitVar érveléssel érhető el.

Ha ezt a bemenetet egy környezeti változó nevére állítja, a változó gyorsítótár-találat esetén lesz beállítva true , inexact ha egy visszaállítási kulcs részleges gyorsítótár-találatot eredményez, és false ha nem található gyorsítótár. Ezután hivatkozhat erre a változóra egy lépésfeltételben vagy egy szkriptben.

Íme egy példa, ahol a rendszer kihagyja a lépést install-deps.sh a gyorsítótár visszaállításakor:

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

Gyorsítótár elkülönítése és biztonsága

A különböző folyamatokból és különböző ágakból származó gyorsítótárak elkülönítésének biztosítása érdekében minden gyorsítótárat egy hatókörnek nevezett logikai tárolóban tárolunk a rendszer. A hatókörök biztonsági határként működnek, amely garantálja a következőket:

  • Az egyik folyamatból származó feladatok nem férhetnek hozzá egy másik folyamat gyorsítótáraihoz.

  • A lekéréses kérelmeket létrehozó feladatok gyorsítótárakat olvashatnak a célágból (ugyanahhoz a folyamathoz), de nem írhatnak (hozhatnak létre) gyorsítótárakat a célág hatókörében.

Amikor egy futtatás során gyorsítótár-lépés történik, a rendszer a kulcs által azonosított gyorsítótárat kéri a kiszolgálótól. A kiszolgáló ezután megkeresi a feladat számára látható hatókörökből ezt a kulcsot tartalmazó gyorsítótárat, és visszaadja a gyorsítótárat (ha van ilyen). A gyorsítótár mentésekor (a feladat végén) a rendszer a gyorsítótárat a munkafolyamat és ág által képviselt hatókörbe írja.

CI, manuális és ütemezett futtatások

Hatókör Olvas Ír
Forráság Igen Igen
main ág Igen Nem
master ág Igen Nem

Pull kérések futtatása

Hatókör Olvas Ír
Forráság Igen Nem
Célelőfiók Igen Nem
Köztes ág (például refs/pull/1/merge) Igen Igen
main ág Igen Nem
master ág Igen Nem

Pull request fork futtatások

Ág Olvas Ír
Célelőfiók Igen Nem
Köztes ág (például refs/pull/1/merge) Igen Igen
main ág Igen Nem
master ág Igen Nem

Borravaló

Mivel a gyorsítótárak már hatókörrel vannak elosztva egy projektre, folyamatra és ágra, nem kell projekt-, folyamat- vagy ágazonosítókat tartalmaznia a gyorsítótárkulcsban.

Példák

A Bundlert használó Ruby-projektek esetében bírálja felül a környezeti változót BUNDLE_PATH , hogy beállítsa azt az elérési utat , ahol a Bundler drágaköveket keres.

példa:

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   

Ismert problémák és visszajelzés

Ha problémái vannak a gyorsítótárazás beállításával a folyamatban, ellenőrizze az adattárban microsoft/azure-pipelines-tasks listáját. Ha nem látja a problémát a listában, hozzon létre egy újat, és adja meg a forgatókönyvével kapcsolatos szükséges információkat.

K&A

K: Törölhetem a gyorsítótárat?

V: A gyorsítótár törlése nem támogatott. A meglévő gyorsítótárakra vonatkozó találatokat azonban elkerülheti, ha hozzáad egy sztringkonstansot (például version2) a gyorsítótárkulcshoz. Módosítsa például a következő gyorsítótárkulcsot:

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

Ehhez:

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

K: Mikor jár le a cache?

A gyorsítótárak hét nap inaktivitás után törlődnek.

K: Mikor lesz feltöltve a gyorsítótár?

A: A rendszer létrehoz egy gyorsítótárat a megadott path és a feladat utolsó lépése után tölti fel. További részletekért tekintse meg a példát.

K: Van-e korlátozás a gyorsítótár méretére?

A: Az egyes gyorsítótárak méretére vagy a szervezeten belüli gyorsítótár teljes méretére nincs kényszerített korlátozás.