Перейти до основного вмісту

Правки у файлах ядра

Ядро сайту — це копія опублікованої збірки. 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 на кожному сайті парку одним прогоном відповідає, «які установки ця збірка зламає», — поки збірку ще можна доповнити хуком, який зробить правку непотрібною.