Натыкание версии на слияние и многое другое

В прошлом я писал статьи о том, как создавать версии, но все меняется. Это последняя и лучшая версия вашего кода в 2020 году.

Я предполагаю, что для этой статьи вы используете инструмент CI, а примеры будут основаны на действиях GitHub. Однако вы сможете легко применить их к любому инструменту CI. Я также предполагаю, что вы используете git-подобный сервис, такой как GitHub, для запросов на вытягивание или какой-то проверки кода.

Многие современные инструменты теперь используют теги git как фактическое место для версии вашего кода. Формат тегов версий использует семантическое управление версиями по следующей схеме:

v1.2.3

Эта статья покажет вам, как легко и автоматически создавать версии вашего кода.

Шаг 1. Поднять версию при слиянии

Разработчик отправляет запрос на вытягивание (PR), другие люди просматривают PR, затем он объединяется в вашу основную ветку (обычно ведущую). При слиянии с вашей основной веткой это запустит некоторые действия, такие как изменение номера версии и развертывание вашего кода.

Вот действие GitHub, чтобы автоматически получить самую последнюю версию, увеличить номер патча, пометить его и вставить метку:

Просто добавьте это .github/workflows/bump.yml, и готово! Прочтите файл gitbump.sh, если хотите точно знать, что он делает.

Шаг 2. При необходимости используйте новый номер версии в коде

Если вы хотите использовать тег версии, созданный на шаге 1 (например, для печати номера версии в пользовательском интерфейсе или когда кто-то набирает yourapp --version), вам нужно будет заменить номер версии в каком-либо коде.

Вы можете получить последнюю версию из тегов GitHub с помощью:

$(git tag --sort=-v:refname --list "v[0-9]*" | head -n 1 | cut -c 2-)

Для этого в GitHub Actions используйте следующее, чтобы установить VERSION env var, который вы можете использовать повсюду:

echo "VERSION=$(git tag --sort=-v:refname --list "v[0-9]*" | head -n 1 | cut -c 2-)" >> $GITHUB_ENV

Обновить версию в любом файле

Если у вас есть версия semver в файле, который вы хотите автоматически обновлять, вы можете использовать:

docker run --rm -i -v $PWD:/app -w /app treeder/bump --filename index.html --replace $VERSION

Это найдет версию в формате X.Y.Z и заменит ее новой версией. Если в файле есть несколько версий, вы можете передать дополнительные флаги в treeder / bump, чтобы он делал то, что вы хотите. Смотрите README.

Обновите версию в программе Go

Для программ Go (golang) вы можете использовать такой флаг сборки (в вашем основном пакете должен быть var Version string):

go build -ldflags "-X main.Version=$VERSION"

Обновите версию образа Docker

Чтобы создать версию и отправить образ Docker с этой новой версией:

docker build -t treeder/myimage:latest .
docker tag treeder/myimage:latest treeder/myimage:$VERSION
docker push treeder/myimage:$VERSION
docker push treeder/myimage:latest

Заключение

И вот оно: полностью автоматизированное управление версиями, которое соответствует вашему коду в git. Кусок торта, правда?

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