Bagikan melalui


Penyimpanan Sementara Saluran

Layanan Azure DevOps

Cache pipa dapat membantu mengurangi waktu build dengan menggunakan kembali dependensi yang diunduh dari eksekusi sebelumnya, menghindari perlunya mereproduksi atau mengunduh ulang file yang sama. Ini sangat membantu dalam skenario di mana dependensi yang sama diunduh berulang kali pada awal setiap eksekusi. Ini sering kali merupakan proses yang memakan waktu yang melibatkan ratusan atau ribuan panggilan jaringan.

Penggunaan cache paling efektif ketika waktu yang dibutuhkan untuk memulihkan dan menyimpan cache kurang dari waktu yang dibutuhkan untuk membuat ulang file. Namun, dalam beberapa kasus, penembolokan mungkin tidak memberikan manfaat kinerja dan bahkan dapat berdampak negatif pada waktu pembuatan. Penting untuk mengevaluasi skenario spesifik Anda untuk menentukan apakah penggunaan cache adalah pendekatan yang tepat.

Nota

Penembolokan alur tidak didukung untuk alur rilis Klasik.

Kapan menggunakan artefak pipa alur versus penyimpanan alur pipa

Penembolokan alur dan artefak alur melakukan fungsi serupa tetapi ditujukan untuk skenario yang berbeda dan tidak boleh digunakan secara bergantian.

  • Gunakan artefak alur: ketika Anda perlu mengambil file tertentu yang diproduksi oleh satu pekerjaan dan membagikannya dengan pekerjaan lain (dan pekerjaan lain tersebut kemungkinan akan gagal tanpanya).

  • Gunakan penembolokan alur: saat Anda ingin meningkatkan waktu build dengan menggunakan kembali file dari eksekusi sebelumnya (dan tidak memiliki file tersebut tidak akan memengaruhi kemampuan pekerjaan untuk dijalankan).

Nota

Penembolokan alur dan artefak alur tersedia tanpa biaya untuk semua tingkatan (gratis dan berbayar). Lihat konsumsi penyimpanan Artefak untuk detail selengkapnya.

Persyaratan untuk agen mandiri

Executable berikut harus ditempatkan dalam folder yang tercantum dalam variabel lingkungan PATH. Perhatikan bahwa persyaratan ini hanya berlaku untuk agen yang dihost sendiri, karena agen yang dihosting telah diinstal sebelumnya dengan perangkat lunak yang diperlukan.

Mengarsipkan perangkat lunak / Platform Windows Linux Mac
GNU Tar Diperlukan Diperlukan Tidak
BSD Tar Tidak Tidak Diperlukan
7-Ritsleting Direkomendasikan Tidak Tidak

Tugas cache: Cara kerjanya

Penembolokan ditambahkan ke jalur pemrosesan dengan menambahkan tugas Cache ke bagian steps proyek.

Selama eksekusi alur, ketika langkah cache ditemui, tugas mencoba memulihkan cache berdasarkan input yang disediakan. Jika tidak ada cache yang ditemukan, langkah selesai, dan langkah berikutnya dalam pekerjaan dijalankan.

Setelah semua langkah dalam pekerjaan berhasil dijalankan, langkah khusus "Post-job: Cache" secara otomatis ditambahkan dan dipicu untuk setiap langkah "pulihkan cache" yang tidak dilewati. Langkah ini berfungsi untuk menyimpan cache.

Nota

Cache tidak dapat diubah. Setelah cache dibuat, kontennya tidak dapat dimodifikasi.

Mengonfigurasi tugas Cache

Tugas Cache memiliki dua argumen yang diperlukan: jalur dan kunci:

  1. jalur: Jalur ke folder yang ingin Anda cache. Ini bisa menjadi jalur absolut atau relatif. Path relatif dipecahkan terhadap $(System.DefaultWorkingDirectory).

    Petunjuk / Saran

    Anda dapat menggunakan variabel yang telah ditentukan sebelumnya untuk menyimpan jalur ke folder yang ingin Anda cache. Namun, kartubebas tidak didukung.

  2. kunci: Ini menentukan pengidentifikasi untuk cache yang ingin Anda pulihkan atau simpan. Kunci terdiri dari kombinasi nilai string, jalur file, atau pola file, dengan setiap segmen dipisahkan oleh | karakter.

    • String:
      Nilai tetap (seperti nama cache atau nama alat), atau diambil dari variabel lingkungan (seperti OS atau nama pekerjaan saat ini).

    • Jalur file:
      Jalur ke file tertentu yang isinya akan di-hash. File harus ada pada saat tugas dijalankan. Segmen apa pun yang menyerupai jalur file diperlakukan seperti itu, jadi berhati-hatilah, terutama saat menggunakan segmen yang berisi ., karena ini dapat menyebabkan kegagalan "file tidak ada".

      Petunjuk / Saran

      Untuk menghindari segmen string yang menyerupai jalur diperlakukan seperti jalur file, Anda dapat membungkusnya dengan tanda kutip ganda, misalnya: "my.key" | $(Agent.OS) | key.file

    • Pola berkas:
      Daftar pola wildcard bergaya glob yang dipisahkan dengan koma dan harus sesuai dengan setidaknya satu file. Contoh:

      • **/yarn.lock: semua file yarn.lock di bawah direktori sumber.
      • */asset.json, !bin/**: semua file asset.json yang terletak di direktori di bawah direktori sumber, kecuali yang ada di direktori bin .

Konten file apa pun yang diidentifikasi oleh jalur file atau pola file di-hash untuk menghasilkan kunci cache dinamis. Ini berguna ketika proyek Anda memiliki file yang secara unik mengidentifikasi apa yang sedang di-cache. Misalnya, file seperti package-lock.json, yarn.lock, Gemfile.lock, atau Pipfile.lock sering dirujuk dalam kunci cache, karena mewakili serangkaian dependensi unik. Jalur atau pola file relatif ditentukan terhadap $(System.DefaultWorkingDirectory).

  • Contoh:

Contoh berikut menunjukkan cara menyimpan paket Yarn:

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

Dalam contoh ini, kunci cache terdiri dari tiga bagian: string statis ("yarn"), OS tempat pekerjaan berjalan (karena cache unik per sistem operasi), dan hash yarn.lock file (yang secara unik mengidentifikasi dependensi).

Pada eksekusi pertama setelah tugas ditambahkan, langkah cache akan melaporkan "cache miss" karena cache yang diidentifikasi oleh kunci ini tidak ada. Setelah langkah terakhir, cache akan dibuat dari file di $(Pipeline.Workspace)/s/.yarn dan diunggah. Pada eksekusi berikutnya, langkah cache akan melaporkan "tembolok hit" dan konten cache akan diunduh dan dipulihkan.

Saat menggunakan checkout: self, repositori akan dicheck ke $(Pipeline.Workspace)/s, dan folder .yarn Anda mungkin akan berada di dalam repositori itu sendiri.

Nota

Pipeline.Workspace adalah jalur lokal pada agen yang menjalankan pipeline Anda tempat semua direktori dibuat. Variabel ini memiliki nilai yang sama dengan Agent.BuildDirectory. Jika Anda tidak menggunakan checkout: self, pastikan Anda memperbarui YARN_CACHE_FOLDER variabel untuk menunjuk ke lokasi .yarn di repositori Anda.

Gunakan kunci pemulihan

restoreKeys memungkinkan Anda untuk mengkueri beberapa kunci atau awalan kunci yang tepat. Ini digunakan sebagai cadangan ketika yang telah ditentukan key tidak menghasilkan hit. Kunci pemulihan mencari kunci berdasarkan awalan dan mengembalikan entri cache yang terakhir dibuat. Ini berguna ketika pipeline tidak dapat menemukan kecocokan yang tepat tetapi masih ingin menggunakan hit cache parsial.

Untuk menentukan beberapa kunci pemulihan, cantumkan pada baris terpisah. Urutan di mana kunci pemulihan dicoba adalah dari atas ke bawah.

  • Contoh:

Berikut adalah contoh cara menggunakan kunci pemulihan untuk cache paket 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

Dalam contoh ini, tugas cache terlebih dahulu mencoba memulihkan kunci yang ditentukan. Jika kunci tidak ada di cache, sistem kemudian mencoba kunci pemulihan pertama: yarn | $(Agent.OS). Ini mencari kunci cache apa pun yang sama persis atau dimulai dengan awalan ini.

Kecocokan awalan yarn.lock dapat terjadi jika hash file telah berubah. Misalnya, jika cache berisi kunci yarn | $(Agent.OS) | old-yarn.lock (di mana old-yarn.lock memiliki hash yang berbeda dari saat ini yarn.lock), kunci pemulihan ini akan menghasilkan hit cache parsial.

Jika kunci pemulihan pertama tidak menghasilkan kecocokan, kunci pemulihan berikutnya (yarn) Ini akan mencari kunci cache apa pun yang dimulai dengan yarn. Untuk kecocokan awalan, proses pemulihan mengembalikan entri cache yang terakhir dibuat.

Nota

Alur dapat mencakup beberapa tugas caching, dan tidak ada batasan penyimpanan untuk caching. Pekerjaan dan tugas dalam alur yang sama dapat mengakses dan berbagi cache yang sama.

Gunakan kondisi pemulihan

Dalam beberapa skenario, Anda mungkin ingin menjalankan langkah-langkah secara kondisional berdasarkan apakah cache berhasil dipulihkan. Misalnya, Anda dapat melewati langkah yang menginstal dependensi jika cache dipulihkan. Ini dapat dicapai menggunakan cacheHitVar argumen .

Mengatur input ini ke nama variabel lingkungan menyebabkan variabel diatur ke true ketika ada hit cache, inexact jika kunci pemulihan menghasilkan hit cache parsial, dan false jika tidak ada cache yang ditemukan. Anda kemudian dapat mereferensikan variabel ini dalam kondisi langkah atau dalam skrip.

Berikut adalah contoh di mana langkah install-deps.sh dilewati saat cache dipulihkan:

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

Isolasi dan keamanan cache

Untuk memastikan isolasi antara cache dari alur kerja yang berbeda dan cabang yang berbeda, setiap cache disimpan dalam kontainer logis yang disebut ruang lingkup. Cakupan bertindak sebagai batas keamanan yang menjamin:

  • Pekerjaan dari satu alur tidak dapat mengakses cache dari alur yang berbeda.

  • Pekerjaan pembuatan pull request dapat membaca cache dari cabang target (untuk alur yang sama), tetapi tidak dapat menulis (membuat) cache di ruang lingkup cabang target.

Ketika langkah cache ditemui selama eksekusi, cache yang diidentifikasi oleh kunci diminta dari server. Server kemudian mencari cache dengan kunci ini dari cakupan yang dapat diakses oleh pekerjaan, dan mengembalikan cache (jika tersedia). Saat cache disimpan (di akhir pekerjaan), cache ditulis ke cakupan yang mewakili alur kerja dan cabang.

CI, proses manual, dan eksekusi terjadwal

Ruang lingkup Membaca Menulis
Cabang sumber Ya Ya
cabang main Ya Tidak
cabang master Ya Tidak

Pull request sedang berjalan

Ruang lingkup Membaca Menulis
Cabang sumber Ya Tidak
Cabang target Ya Tidak
Cabang menengah (seperti refs/pull/1/merge) Ya Ya
cabang main Ya Tidak
cabang master Ya Tidak

Eksekusi percabangan permintaan tarik

Cabang Membaca Menulis
Cabang target Ya Tidak
Cabang menengah (seperti refs/pull/1/merge) Ya Ya
cabang main Ya Tidak
cabang master Ya Tidak

Petunjuk / Saran

Karena cache sudah tercakup ke proyek, alur, dan cabang, tidak perlu menyertakan proyek, alur, atau pengidentifikasi cabang apa pun dalam kunci cache.

Contoh

Untuk proyek Ruby menggunakan Bundler, ambil alih BUNDLE_PATH variabel lingkungan untuk mengatur jalur tempat Bundler mencari Gems.

Contoh:

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   

Masalah dan umpan balik yang diketahui

Jika Anda mengalami masalah saat menyiapkan penyimpanan cache di alur Anda, periksa daftar masalah terbuka dalam microsoft/azure-pipelines-tasks repositori. Jika Anda tidak melihat masalah Anda tercantum, membuat yang baru dan memberikan informasi yang diperlukan tentang skenario Anda.

Tanya Jawab

T: Dapatkah saya menghapus cache?

A: Menghapus cache tidak didukung. Namun, Anda dapat menghindari hit pada cache yang ada dengan menambahkan string literal (seperti version2) ke kunci cache Anda. Misalnya, ubah kunci cache berikut dari ini:

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

Untuk ini:

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

T: Kapan cache kedaluwarsa?

A: Cache kedaluwarsa setelah tujuh hari tanpa aktivitas.

T: Kapan cache diunggah?

A: Cache dibuat dari yang Anda tentukan path dan diunggah setelah langkah terakhir pekerjaan. Lihat contoh untuk detail selengkapnya.

T: Apakah ada batasan ukuran cache?

A: Tidak ada batasan yang diberlakukan pada ukuran cache individual atau ukuran total cache dalam organisasi.