© 2021 WebHive

Автоматизируем версионность приложений

Для развертывания приложений и рельсовых в частности, весьма актуально знать версию приложения. И не только знать, но и обновлять по необходимости. Желательно автоматически. Для этого существуют различные способы и методики. Ниже поделюсь способом к которому вынужденно пришёл я. 

Традиционный подход

Которым я всегда пользовался, заключался в банальном хранении версии приложения в виде 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

Итого

Вот таким незатейливым способом я решил свои проблемы с версионностью приложений и думаю испрользовать такой подход и впредь в виду его практичности и независимости от структуры репозитаря. Кроме того ничтно не мешает даже в случае монорепозитария настроить автоматическое обновление тега.

Комментарии