Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!22.10.2024
Rails, Asset Pipeline, та артефакти
Якось в розмові згадалося, що Ruby on Rails не дуже дружня до збірки на CI. Принаймні, історично. Хоча й зараз офіційна документація згадує якісь хаки, тому те, що я розповім, більш-менш актуально й досі.
Коли я почав працювати з Rails, то “збірки JavaScript” як такої не існувало. Та й JavaScript багато не було. Шматочки JS та CSS просто додавали в теку public
. Не тільки в Rails, а взагалі. А вебзастосунки розгортували копіюванням файлів на сервер.
Коли у 2011 в Rails зʼявився механізм для збірки - Asset Pipeline - то не було ані Webpack, ні навіть Node.JS в широкому використанні. Памʼятаю, складно було взагалі отримати інтерпретатор JavaScript не в браузері. Тому логічно, що збірка була частиною застосунку, а саме Rake-скриптом. Цей скрипт запускався вже на продакшні, щоб підготувати JS/CSS. Ніхто його не ізольовував від решти застосунку, тому, наприклад, збірка мала доступ до бази. (Я вам навіть скажу, десь в мене був такий код, що витягав з живої бази даних якісь словники та генерував на їхній основі JS.)
Спочатку збірка JS відбувалася на Ruby та за власним для Rails алгоритмом. Але потім в JS виросла власна екосистема, з пакетами, інструментами та так далі. Якийсь час було заведено збирати Webpack окремо, а в Rails тільки зчитувати його маніфест — на то існував пакет webpack-rails. Це було досить чисто, та дозволяло відʼєднати збірку JS/CSS, передавши в застосунок тільки маніфест.
Але у 2019 мода перейшла до webpacker, який знову втягнув Webpack всередину застосунку. Як на мене, то був наслідок поширеної серед рубістів догми “рубі найкращий, давайте все в нього загорнемо”. Та нам знову стало потрібне середовище застосунку, щоб зібрати JS/CSS. Десь в той самий час розгортування переїхало на CI. Проблема з середовищем застосунку в тому, що на CI його треба затикати, та порожня база — це тільки початок. По коду доводиться розставляти перешкоди: “якщо ми у збірці, то сюди не йдемо”. Нові залежності підносять сюрпризи.
Сучасний підхід - jsbundling-rails - надав нам вибір між інструментами збірки, але все ж залишив її у контексті застосунку Rails. Тож нам все одно потрібно середовище застосунку на CI. Та, мабуть, найголовніше що мене дратує — що залишається та давня парадигма, що ми збираємо JS/CSS саме для цієї копії застосунку. Ніби це ми його тільки що залили по SCP на наш VPS, як у 2010-му. Та коли стає питання таку збірку робити артефактом, то мені від того трохи ніяковіє.