Кэширование трубопровода может помочь уменьшить время сборки, позволяя выводам или загруженным зависимостям с одного запуска повторно использовать в более поздних работах, уменьшая или избегая затрат, чтобы снова воссоздать или выдавать одни и те же файлы.
Давайте посмотрим, как включить и использовать кэширование в лазурных трубопроводах.
вступление
Всем привет. Сегодня мы говорим о том, как мы можем сократить время наших трубопроводов, чтобы бежать, используя кэширование.
Кэширование особенно полезно в сценариях, где те же зависимости загружаются снова и снова в начале каждого прогона. Это часто потребляющий процесс, включающий сотни или тысячи сетевых вызовов.
видео
Если вы Визуальный учащийся Или просто предпочитаю посмотреть и слушать вместо чтения, здесь у вас есть видео с целым объяснением, которое будет честно, это много более полный чем этот пост.
Если вы скорее предпочитаете читать, ну … Давайте просто продолжим:)
Почему кэширование
Почему важно кэшировать? Если вы находитесь на машине на машине On-Prem или Dev, процессы сборки и выпуска уже имеют какую-то реализацию кэширования, которая сохраняет файлы или метаданные локально.
Однако, когда речь идет о агентах Azure трубопроводов, каждый раз начинается новые трубопроводы, вы находитесь на Агент машина, которая была создана заново Просто для этого беги, поэтому ничего не хранится там, кроме двоичных файлов и услуг, которые потребности в процессе CICD. Вот почему вы можете использовать услугу кеша.
Помните, что кэширование может быть эффективным при улучшении времени сборки, если Время восстановления и сохранения кэша меньше времени, чтобы произвести выход снова с нуля. Из-за этого кэширование не может быть эффективным во всех сценариях, и на самом деле может оказать негативное влияние на время сборки.
Давайте кэш
Кэширование добавляется в трубопровод, используя Задача конвейера кэша Отказ Эта задача работает как любая другая задача и добавляется к разделу заданий.
variables: solution: '**/WebAppTest.sln' NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages
- task: Cache@2 inputs: key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**' restoreKeys: | nuget | "$(Agent.OS)" path: $(NUGET_PACKAGES) displayName: Cache NuGet packages
Задача кэша имеет Два необходимых ввода : ключ и путь :
- путь Должно быть установлено в каталог, чтобы заполнить кеш (на сохранение) и хранить файлы в (на восстановлении). Это может быть абсолютно или относительно.
- ключ вместо этого следует установить идентификатор для кэша, который вы хотите восстановить или сохранить
Существует также другой параметр «Восстановление клавиш», которые можно использовать, если вы хотите запросить несколько клавиш или ключевые префиксы. Это полезно для ответственности к другому ключу в том случае, если ключ не может быть найден.
В приведенном выше примере я использую Композитный ключ С ‘ ног «Строковый литерал, версия ОС Агент работает (что исходит из системной переменной), и, наконец, содержимое« packages.lock.json ‘ файл. Когда вы указываете файл, двигатель использует Хэш контента файла как часть ключа, так что если содержимое меняется, так и ключ. Я также указывал дополнительные фильтры, чтобы игнорировать этот файл, если синица присутствует в Bin и obj папки.
Когда шаг кэша встречается во время прогона, задача будет Восстановить кэш на основе предоставленных входов. Если кеш не найден, шаг завершается и следующий шаг в задании запущен. После того, как все шаги на работе запустились и предполагая успешный статус работы, специальный шаг « Save Cache ». Этот шаг отвечает за сохранение кеша.
Пропустить шаги на основе кэша ударил
Есть некоторые сценарии, в которых успешное восстановление кеша должно заставить другой набор шагов для запуска Отказ Например, шаг, который устанавливает зависимости, можно пропустить, если кэш был восстановлен.
variables: solution: '**/WebAppTest.sln' NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages CACHE_RESTORED: 'false'
- task: Cache@2 inputs: key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**' restoreKeys: | nuget | "$(Agent.OS)" path: $(NUGET_PACKAGES) cacheHitVar: CACHE_RESTORED displayName: Cache NuGet packages - task: NuGetCommand@2 inputs: restoreSolution: '$(solution)' condition: ne(variables.CACHE_RESTORED, 'true')
Для этого мы можем использовать Cacheehitvar param, и пропустите переменную к нему. Если есть кэш-хит, то это значение переменной будет изменено на правда Отказ
Тогда мы можем использовать эту переменную в Состояние Для задачи или шага мы хотим пропустить.
Сравнение
Я создал эту таблицу сравнения, поэтому у нас может быть обзор проверки кэширования.
Первый столбец — это выполнение с Нет кеша Отказ
Второй Один, вместо этого, с кэшем, но сначала беги, что означает, что есть Кэш Мисс . Как вы можете видеть, что общее время больше, потому что не только зависимости должны быть восстановлены как раньше, но нам нужно проверить, существует ли кэш и, поскольку он не загружает содержимое и создать элемент кэша.
Третий и последний столбец — это кэш ударил Отказ Кэш присутствует, поэтому зависимости не должны загружаться (следовательно, шаг восстановления Nuget является быстрее, и поскольку кэш не случайно, что нет времени для его сохранения. И это быстрее, даже всего несколько секунд, потому что у меня было всего несколько зависимостей в демонстрационном приложении.
Вывод
Стоит отметить, что кэширование в настоящее время поддерживается в CI и рабочие места развертывания, но не в классических заданиях выпуска.
Как вы думаете о системе кэширования лазурных трубопроводов? Вы используете это? Можете ли вы увидеть его преимущества? Дайте мне знать в разделе комментариев ниже.
Ссылки и ссылки
- Видео с полным объяснением и примерами о кешировании трубопроводов
- Azure трубопроводы серии триггеров
- Официальная документация о лазурных трубопроводах кэширование
Вроде, поделиться и следуй за мной 🚀 Для получения дополнительной информации:
📽 YouTube ☕. Купи мне кофе 💖 Парреон 🌐 Веб-сайт CODERDAVE.IO 👕 Merch 👦🏻 Страница в Facebook 🐱💻 Github 👲🏻 Twitter 👴🏻 LinkedIn 🔉 Подкас
Оригинал: «https://dev.to/n3wt0n/how-to-reduce-build-time-using-caching-in-azure-pipelines-59f6»