Версионирование go программ

Читая новости на отличном ресурсе по Go, наткнулся на статью Дейва Чени Гоферы, тэгируйте свои релизы. Вкратце, там говорится о полезности тэгов к комитам пакета в git репозитории, а так же о том, что при указании версии, стоит обратить внимание на формат SemVer 2.0.0.

Что самое интересное, статья написана 24 июня, примерно в то же время, может быть, днём ранее, я написал инструмент для себя, который позволяет автоматизировать процесс изменения патч-версии приложений, написанных на Go.

Вдохновил меня на этот поступок, как ни странно, инструмент из мира node.js — npm. Дело в том, что npm имеет в своём арсенале команду version patch, которая делает три простые и очень нужные вещи для npm пакетов:

  • Увеличивает на единичку в файле package.json версию патча, согласно SemVer 2.0.0;
  • Комитит файла package.json;
  • Навешивает на комит тэг, соответствующий версии в package.json.

В нашем главном проекте Blank, в npm пакетах, мы дописали скрипты в файл package.json для автоматической заливки изменений на github.

  "scripts": {
    "patch": "npm version patch && npm run push",
    "push": "git push origin master --follow-tags && npm publish"
  }

Таким образом, для того, чтобы «зарелизить» новую патч-версию своего приложения, достаточно написать в корне проекта:

> npm run patch

NPM остальное сделает сам — увеличит версию патча, сделает комит, навесит тэг с версией и отправит на github.

Мне эта штука так понравилась, что, не найдя ничего похожего для Go, я решил сделать подобный инструмент для гоферов. Итак, представляю patcher.

Что он делает:

  • В файле main.go в корне проекта ищет переменную version и увеличивает на единицу патч-версию;
  • Комитит файл main.go с сообщением Version update: ЗНАЧЕНИЕ_ПЕРЕМЕННОЙ_version;
  • Навешивает к комиту тэг vЗНАЧЕНИЕ_ПЕРЕМЕННОЙ_version;

Кроме того, при запуске с ключом -p (patcher -p), утилита тут же отправит все изменения в удалённый репозиторий. Вот так всё просто.

Далее уже можно настроить систему непрерывной интеграции, например, на сборку тэгированных релизов с автоматическим обновлением сервисов, либо с публикацией на ресурсах для скачивания приложения.

Установка производится как обычно:

> go get github.com/ivahaev/patcher

Если $GOPATH/bin находится в вашем $PATH, запуск производится из командной строки

> patcher [filename [varName]] [-p]

Или если в $PATH не прописаны пути:

> $GOPATH/bin/patcher [filename [varName]] [-p]

Есть два необязательных параметра — имя файла, в котором находится переменная с версией и, имя самой переменной с версией приложения. По-умолчанию, эти параметры равны main.go и version, соответственно. Также, если указать ключ -p, утилита автоматически отправит изменения в удалённый репозиторий.

Я использую эту утилиту каждый день и она делает мою жизнь гораздо ярче, чего и вам желаю :).

В другой раз расскажу о том, как всё это используется для непрерывной интеграции в наших проектах.