Для развертывания приложений и рельсовых в частности, весьма актуально знать версию приложения. И не только знать, но и обновлять по необходимости. Желательно автоматически. Для этого существуют различные способы и методики. Ниже поделюсь способом к которому вынужденно пришёл я.
Традиционный подход
Которым я всегда пользовался, заключался в банальном хранении версии приложения в виде git-овского тэга.
Ничего плохого про этот способ сказать не могу, но вот недавно нарвался на его ограничение, а именно — попался мне проект, в котором в одном репе лежат несколько приложений. Поделать с этим ничего не возможно, а для автоматической сборки Git Actions надо бы подсовывать для каждого приложения свою версию.
Чисто теоретически можно конечно для всех приложений из репа использовать одну и ту же версию, либо в качестве версии использовать хэш коммита, но это как-то не то. Возможно вкусовщина, но если можно сделать как мне нравится, то почему бы и не?
Кроме того у меня давно вызывала раздражение необходимость указывать номер версии в тэге вручную. Хотелось просто указать какую-нибудь команду типа «сделай мне следующую версию».
Храним версию прямо в приложении
И вот настал момент я таки собрался с силами, вернее обстоятельства таки вынудили разобраться с этим вопросом. Как известно — «всё уже изобретено до нас», поэтому несмотра на наличие собственных идей как реализовать желаемое, начать таки решил с поиска готовых решений. И я их нашёл. Меня прежде всего интересовали rails и nodejs, поэтому речь пойдет именно о них.
Rails
Для рельсы таким решением оказался gem bump, который делает ровно то, что мне нужно.
Единственным некритичным недостатком оказаласть невозможность писать версиs в любое заданное место — доступны только стандартные расположения, предлагаемые этим gem-ом. Причем для библиотек предлагается родной для рельсы способ с прописыванием в коде библиотеки, а вот для готового приложения ничего, более подходящего, кроме как использовать предлагаемый отдельный файл VERSION я не нашёл. Но это так — мелкие придирки.
Какие плюсы
- Стандартный формат версии < major.minir.patch.pre> с возможностью инкремента отдельно любой части
- Можно задать префикс типа
v1.2.3
- Умеет само обновлять tag в git-е
- Может автоматом найти и заменить номер версии в дополнительно указанных файлах
- Умеет вести changelog
- Интегрируется с rake
В общем и целом — полный фарш.
Чтобы вывести текущую версию, что актуально для сборки и деплоя, используется следующая команда:
$ rake bump:current
Ну, а чтобы увеличить версию достаточно выполнить
$ rake bump:show-next INCREMENT=patch
Ну или если вам не по душе rake
, то:
$ bump show-next patch
Node.js
Как оказалось почти всё умеет yarn, что порадовало, но вот как вывести текущую версию, не меняя её я не нашёл, поэтому, имея в виду, что версия хранится в package.json
, который суть есть не что иное как JSON файл тупо воспользовался старым добрым jq
$ jq -r '.version' < package.json
0.0.2
Из плюсов отмечу возможность автоматически задавать tag в git-е, ну, а минус указал выше.
Инкремент выполняется без извращений
$ yarn version --patch
yarn version v1.22.10
info Current version: 0.0.2
info New version: 0.0.3
Итого
Вот таким незатейливым способом я решил свои проблемы с версионностью приложений и думаю испрользовать такой подход и впредь в виду его практичности и независимости от структуры репозитаря. Кроме того ничтно не мешает даже в случае монорепозитария настроить автоматическое обновление тега.
Комментарии