Правки у файлах ядра
Ядро сайту — це копія опублікованої збірки. cms9:self-update і нічний
cms9:auto-update замінюють ці файли файлами наступної збірки, тож будь-яка
правка в app4/app/, app4/themes/administrator/, app4/themes/default/ чи
app4/resources/ тимчасова за визначенням.
До збірки 527 це відбувалось без жодного слова: оновлювач звіряв завантажені файли з новим манифестом і ніколи не питав, чи файли на диску ще дорівнюють збірці, з якої прийшли. Правка на проді зникала при наступному оновленні, і єдиною ознакою була стара поведінка, яка поверталась.
Тепер оновлення питає першим. Еталон — манифест встановленої збірки (один
sha256 на файл, рівно те, що опублікував сервер збірок), закешований у
writable/update/core_baseline.json:
- змінені файли, додані під коренями ядра і видалені локально знаходяться ще до того, як щось на диску зрушить;
- оновлення, яке затерло б правку, зупиняється з
local_changesі перелічує файли; cms9:auto-updateпропускає лише ядро на такому сайті (модулі оновлюються далі) і піднімає банер в адмінці;--overwrite-localпереписує правки свідомо і лишає копію кожного заміненого файлу.
Та сама ідея, що й локальні правки в модулі, на рівень вище.
Подивитись, що змінив сайт: cms9:core-drift
php spark cms9:core-drift # звіт для людини
php spark cms9:core-drift --json # для скрипта
php spark cms9:core-drift --fetch # забрати еталон з каналу зараз
Команда лише читає, і без --fetch не робить жодного мережевого запиту.
Запускати її треба на кожному сайті окремо — ssh-циклом або деплой-інструментом
— перед тим, як різати реліз; нічого тут не агрегує кілька сайтів, бо ніщо тут
із ними не спілкується.
| код | значення |
|---|---|
0 | усі файли ядра дорівнюють збірці, яка їх привезла |
1 | на сайті правили файли ядра (перелічені поіменно) |
2 | немає еталона для встановленої збірки — оцінки немає |
7 | помилка виклику |
Код 2 — це чесне «невідомо», а не провал: сайт, який не оновлювався після
появи цієї перевірки, ще не має кешованого манифеста. Він отримає його сам при
наступному оновленні ядра або одразу з --fetch — канал віддає манифест
будь-якої опублікованої збірки без ліцензійного токена.
Що ніколи не вважається правкою
Чистий сайт має показувати нуль, інакше вся перевірка перетворюється на шум,
який оператори навчаються обходити через --overwrite-local. Свідомо виключені:
writable/(кеші, логи, сесії, завантаження),.env, публічний docroot, composer-дерево в корені установки і будь-яка текаtests/;- залишки редагування:
*.bak*,*.orig,*.rej,*~,*.swp; .baseline.jsonмодулів, які везе ядро, — оновлення ядра саме їх переписує на кожному сайті;- модулі, яких у пакеті ядра ніколи не було (магазинні й сайтові — Pixozip, CloudStorage тощо);
- теми сайту: в пакеті ядра їдуть лише
administratorіdefault, решта — своє; - файл, який уже дорівнює новій збірці (сайт застосував той самий фікс
руками), і файл, якого це оновлення взагалі не чіпає:
cms9:core-driftназве обидва, але блокувати вони не будуть.
Локально видалений файл теж перелічується і ніколи не блокує: оновлення просто покладе його назад.
Що робить оновлення
php spark cms9:self-update # сухий прогін: скаже одразу
php spark cms9:self-update --apply # відмова з переліком файлів
php spark cms9:self-update --apply --overwrite-local # свідомий перезапис
Перевірка стоїть перед кроком бекапу, тож відмова не змінює на диску
нічого. З --overwrite-local правлені файли спершу копіюються в
writable/core_local_changes/<реліз>-<час>/ — це версія сайту для кожного
затертого файлу, — і шлях друкується в лог.
Автоматичний прогін (cms9:auto-update) не переписує ніколи. Він пише пропуск
і назви файлів у writable/logs/auto-update.log, запам'ятовує затриману
збірку і показує її в адмінці — банером у шапці та на сторінці Оновлення
системи. Банер закривається «×» для названої збірки і повертається для
наступної, тож сайт із правками нагадує про себе раз на збірку, а не на кожній
сторінці.
Куди перенести правки, щоб вони жили
Перевірка робить правку видимою, а не постійною. Три підтримані місця для самої зміни:
1. Тема, якщо зміна про вигляд
Розмітка, CSS і JS вітрини належать темі. Будь-яка тема, крім default і
administrator, у пакет ядра не входить і переживає кожне оновлення.
2. Власний модуль на подіях
Бізнес-поведінка — додаткова перевірка в оформленні, поле в замовленні,
інтеграція — живе в app/Modules/<YourModule>/ з обробниками подій, а не в
правленому класі ядра. Модулі оновлюються окремо від ядра.
3. Фікс у самому ядрі, вище за течією
Якщо зміна справді належить ядру — реальна помилка, відсутній хук, — її треба зробити в репозиторії ядра, і на сайт вона приїде збіркою. Це єдина форма «правки ядра», яка переживає оновлення, і вона ще й дістається всім іншим сайтам.
php spark cms9:core-drift --json на кожному сайті парку одним прогоном
відповідає, «які установки ця збірка зламає», — поки збірку ще можна доповнити
хуком, який зробить правку непотрібною.