Skip to content

Добавляет кэш изображений в Github Actions#395

Merged
pepelsbey merged 1 commit intomainfrom
images-cache
Oct 15, 2025
Merged

Добавляет кэш изображений в Github Actions#395
pepelsbey merged 1 commit intomainfrom
images-cache

Conversation

@monochromer
Copy link
Member

@monochromer monochromer commented Oct 14, 2025

Обработка изображений занимает большую часть вермени сборки, при этом изображения не меняются, а Антарктида тает. Поэтому есть идея хранить обработанные изображения в кэше Github Actions.

Техника основана на статье Зака Лазермана https://www.zachleat.com/web/faster-builds-with-eleventy-img/

Процесс следующий:

  • Eleventy Image складывает все изображения при "первоначальной" (без кэша) сборке в папку .cache/@11ty/_images
  • Добавляем эту папку в кэш Actions по ключу images-${{ hashFiles('src/articles/**/*.png', 'src/articles/**/*.jpg', 'src/articles/**/*.svg', 'src/articles/**/*.gif', 'src/people/**/*.jpg') }}. В идеале этот ключ должен ещё зависеть от настроек обработки изображений - форматов, размеров и пр. Но я пока упустил этот момент для простоты.
  • При повторной сборке восстанавливаем этот кэш. Eleventy Image смотрит на наличие изображений в папке .cache/@11ty/_images. Затем после сборки просто копирует их в свою dist/_images.

Ещё момент - кэш хранится не больше недели с момента последнего обращения к нему. Поэтому я добавил action, который раз в неделю по четвергам проверяет кэш. Правда, я пока не уверен, будет ли это засчитываться как обращение.

@pepelsbey
Copy link
Member

У меня чесались руки по этой же статье прикрутить, но зуд прошёл)

@pepelsbey pepelsbey changed the title Добавление кэша изображений в Github Actions Добавляет кэш изображений в Github Actions Oct 14, 2025
@HellSquirrel
Copy link

Обработка изображений занимает большую часть вермени сборки, при этом изображения не меняются, а Антарктида тает. Поэтому есть идея хранить обработанные изображения в кэше Github Actions.

Техника основана на статье Зака Лазермана https://www.zachleat.com/web/faster-builds-with-eleventy-img/

Процесс следующий:

  • Eleventy Image складывает все изображения при "первоначальной" сборке в папку .cache/@11ty/_images
  • Добавляем эту папку в кэш Actions по ключу images-${{ hashFiles('src/articles/**/*.png', 'src/articles/**/*.jpg', 'src/articles/**/*.svg', 'src/articles/**/*.gif', 'src/people/**/*.jpg') }}. В идеале этот ключ должен ещё зависеть от настроек обработки изображений - форматов, размеров и пр. Но я пока упустил этот момент для простоты.
  • При повторной сборке восстанавливаем этот кэш. Eleventy Image смотрит на наличие изображений в папке .cache/@11ty/_images. Затем после сборки просто копирует их в свою dist/_images.

Ещё момент - кэш хранится не больше недели с момента последнего обращения к нему. Поэтому я добавил action, который раз в неделю по четвергам проверяет кэш. Правда, я пока не уверен, будет ли это засчитываться как обращение.

Круто! Меня немного смущает то что кеш портится со временем. Не может ли оказаться так что при сборке кеша не будет? Я не нашла (но я не специалист) в PR фолбека на отсуствующий кеш. Можешь уточнить если ли он и если нет - то мб добавим?

@monochromer
Copy link
Member Author

Не может ли оказаться так что при сборке кеша не будет?

Может. Тогда будут первые два пункта из процесса.

Я не нашла (но я не специалист) в PR фолбека на отсуствующий кеш

Eleventy Image смотрит на наличие изображений в папке .cache/@11ty/_images (Это указывается в настройках трансформаций). Если изображения там нет, то собирает и складывает туда. Если есть, то игнорирует и идёт к обработке следующего изображения.

@pepelsbey pepelsbey merged commit 5279c41 into main Oct 15, 2025
6 checks passed
@pepelsbey pepelsbey deleted the images-cache branch October 15, 2025 09:56
@pepelsbey
Copy link
Member

Спасибо! Сейчас посмотрим, как оно работает 😬

@pepelsbey
Copy link
Member

Whoaaa! Было 12m 54s, стало 1m 48s 🤯

@monochromer
Copy link
Member Author

Можно будет ещё оптимизировать, если переиспользовать результат сборки между линтингом html и деплоем.

@pepelsbey
Copy link
Member

Можно будет ещё оптимизировать, если переиспользовать результат сборки между линтингом html и деплоем.

А я как раз линтинг HTML выпиливаю, он совсем не нужен в нынешнем процессе (пишем только маркдаун) и только крутится зря. Раз уж оптимизировать)

@melikhov-dev melikhov-dev requested a review from Copilot October 15, 2025 14:54
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Добавляет кэширование обработанных изображений для ускорения сборок Eleventy и снижает повторную обработку, а также копирует кэшированные изображения в итоговую сборку.

  • Перенос вывода Eleventy Image в кэш-папку .cache/@11ty/_images и генерация ссылок на /_images/
  • Подключение actions/cache в деплой-пайплайне для восстановления/сохранения кэша
  • Добавлен еженедельный workflow для проверки наличия кэша

Reviewed Changes

Copilot reviewed 3 out of 4 changed files in this pull request and generated 4 comments.

File Description
src/eleventy-config/transforms.js Использование общей кэш-папки для Eleventy Image и копирование изображений в dist/_images после сборки
.github/workflows/deploy.yml Восстановление/сохранение кэша изображений в CI перед сборкой
.github/workflows/check-image-cache.yml Периодическая проверка наличия кэша изображений по расписанию

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

- name: check cache
if: steps.images-cache.outputs.cache-hit != 'true'
shell: bash
run: echo "Кэш изображений не найден
Copy link

Copilot AI Oct 15, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В команде shell отсутствует закрывающая кавычка, из-за чего шаг завершится ошибкой синтаксиса. Закройте кавычку.

Suggested change
run: echo "Кэш изображений не найден
run: echo "Кэш изображений не найден"

Copilot uses AI. Check for mistakes.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут, пожалуй, соглашусь )

Comment on lines +13 to +25
- name: Cache images
id: images-cache
uses: actions/cache@v4
env:
cache-name: cache-images
with:
path: '.cache/@11ty/_images'
enableCrossOsArchive: true
key: images-${{ hashFiles('src/articles/**/*.png', 'src/articles/**/*.jpg', 'src/articles/**/*.svg', 'src/articles/**/*.gif', 'src/people/**/*.jpg') }}
- name: check cache
if: steps.images-cache.outputs.cache-hit != 'true'
shell: bash
run: echo "Кэш изображений не найден
Copy link

Copilot AI Oct 15, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Восстановление кэша не продлевает срок его жизни в GitHub Actions; TTL обновляется только при сохранении. Текущий workflow по расписанию не перезапишет кэш (на cache-hit сохранения не происходит), поэтому не продлит TTL. Решение: используйте пары actions/cache/restore и actions/cache/save с «роллирующим» ключом (например, с префиксом images-${{ HASH }}- и суффиксом, зависящим от недели), и измените restore на использование restore-keys, чтобы сборка могла брать последний сохраненный вариант.

Suggested change
- name: Cache images
id: images-cache
uses: actions/cache@v4
env:
cache-name: cache-images
with:
path: '.cache/@11ty/_images'
enableCrossOsArchive: true
key: images-${{ hashFiles('src/articles/**/*.png', 'src/articles/**/*.jpg', 'src/articles/**/*.svg', 'src/articles/**/*.gif', 'src/people/**/*.jpg') }}
- name: check cache
if: steps.images-cache.outputs.cache-hit != 'true'
shell: bash
run: echo "Кэш изображений не найден
- name: Compute cache hash
id: cache-hash
run: echo "hash=$(git ls-files src/articles/**/*.png src/articles/**/*.jpg src/articles/**/*.svg src/articles/**/*.gif src/people/**/*.jpg | xargs sha256sum | sha256sum | cut -d' ' -f1)" >> $GITHUB_OUTPUT
- name: Get week number
id: week
run: echo "week=$(date +%V)" >> $GITHUB_OUTPUT
- name: Restore images cache
id: images-cache-restore
uses: actions/cache/restore@v4
with:
path: '.cache/@11ty/_images'
enableCrossOsArchive: true
key: images-${{ steps.cache-hash.outputs.hash }}-week-${{ steps.week.outputs.week }}
restore-keys: |
images-${{ steps.cache-hash.outputs.hash }}-
- name: check cache
if: steps.images-cache-restore.outputs.cache-hit != 'true'
shell: bash
run: echo "Кэш изображений не найден"
- name: Save images cache
if: always()
uses: actions/cache/save@v4
with:
path: '.cache/@11ty/_images'
enableCrossOsArchive: true
key: images-${{ steps.cache-hash.outputs.hash }}-week-${{ steps.week.outputs.week }}

Copilot uses AI. Check for mistakes.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В документации Github'а сказано про "accessed". Так что лучше проверить самим через неделю-другую.

@pepelsbey
Copy link
Member

@monochromer что скажешь в ответ Копайлоту? 😬

@monochromer
Copy link
Member Author

@monochromer что скажешь в ответ Копайлоту? 😬

Из того, что есть, я бы пока только опечатку поправил )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants