Автоматизация на HotFix в проекти на Maven с използване на TeamCity

В този пост ще опишем настройката на автоматизацията HotFix в Maven проекти с използването на Teamcity.

Обикновено, за да се направи HotFix се извършват много ръчни действия:

  1. Създайте клон за версията, на която искате да приложите HotFix
  2. Поправете грешката в версията
  3. Променете номер на bugfix версията в версията на клона
  4. Пуснете таг за bugfix версията

Точки 1, 3 и 4 могат да бъдат автоматизирани.

Преди да преминем към темата, искам да засегна важна и сложна тема — версиониране софтуера. Кратко за Semver може да се разбере от този скрийншот. Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Можете да прочетете повече на следния линк: 1.

Всички настройки, описани в този пост, се основават на Semver и Trunk-Based Development.

В Trunk-Based Development за всяка версия трябва да се създаде свой клон. Всички промени (hotfix) в рамките на тази версия се комитират в този клон.

В рамките на този пост ще автоматизираме следните неща:

  • CI сборка

  • Създаване на нова версия

  • Създаване на клон за версията

  • Промяна на bugfix версията

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Изисквания:

  • Git репозитория за съхраняване на вашия код. В поста ще се използва репозитория https://gitlab.com/anton_patsev/automation-maven-hotfix.
  • Teamcity сървър и агент. Можете да стартирате свой локален Teamcity сървър и агент с помощта на docker-compose
  • Там, където имате Teamcity агент, трябва да бъдат инсталирани java, maven, git

Създайте в Teamcity проект "Automation Maven Hotfix" и там ще създадем 4 задачи.

  • CI Build (CI сборка)

  • Създаване на клон за версията (Create branch for release)

  • Maven инкремент bugfix (Maven increment bugfix)

  • Maven версия (Maven release)

Скрийншот на проекта:

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Общи настройки

Във всички задачи е необходимо да се постави отметка "Clean build: Изтриване на всички файлове в директорията за проверка преди изграждането", тъй като при отсъствието на тази отметка се появяваха грешки.

Създаваме единствен VCS. Спецификите на VCS са обведени в червено.

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Обикновено VCS използва HTTPS схема. В Спецификация на клона: казва да се разглеждат всички клонове и всички тагове:

+:refs/heads/*
+:refs/tags/*

Необходимо е да се създадат 4 параметъра за конфигурация.

  • BRANCH_FOR_INCREMENT
  • TAG_FROM_VERSION
  • TEAM_USER
  • TEAM_USER_EMAIL

Полето value в BRANCH_FOR_INCREMENT и TAG_FROM_VERSION трябва да остане празно.

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Необходимо е да качите/добавите частен ключ. Във всички задачи, освен CI Build, се изисква частен ключ.

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Във всяка задача, освен CI Build, в раздела Build Features трябва да свържете частен ключ.

Пример за Maven версия

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

CI Build.

В задачата CI Build има само една стъпка mvn clean test

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Maven версия

В задачата Maven версия две стъпки. Първата стъпка проверява дали клона е master. Ако клона не е master, то задачата се проваля.

BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
  echo 'Branch is not master';
  echo 'Aborting';
  exit 1;
fi

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Втората стъпка е стандартна mvn release:prepare с опцията —batch-mode

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Създайте бранч за релиз

За да създадете hotfix за релиз, трябва да създадете бранч. Това се извършва от задачата Създайте бранч за релиз. Има 2 стъпки.

Първата стъпка проверява дали бранчът не master, а втората проверява дали версията в файла pom.xml не съдържа думата SNAPSHOT

BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
  echo 'Бранчът е master';
  echo 'Прекратяване';
  exit 1;
fi

echo "Вземи версията на пакета от pom.xml"
version=`python -c "import xml.etree.ElementTree as ET; print(ET.parse(open('pom.xml')).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)"`

echo "Проверка SNAPSHOT"
if [[ $version == "*SNAPSHOT*" ]]; then
    echo "******************* В А Р Н И Р А Н Е *************************"
    echo "************ Вие създавате бранч за SNAPSHOTS ******************"
    echo "***********************************************************"
    exit 1
fi

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Втората стъпка променя схемата за свързване в developerConnection от HTTPS на GIT.

# Здесь получаем developerConnection из файла pom.xml
developerConnection=$(xmllint -xpath "/*[local-name() = 'project' ]//*[local-name() = 'developerConnection']/text()" pom.xml | sed  's|scm:git:ssh://||')
echo developerConnection
echo $developerConnection
# Здесь меняем / на : в URL для git_remote_url
git_remote_url=$(echo $developerConnection| sed 's/gitlab.com//gitlab.com:/g')
echo git_remote_url
echo $git_remote_url

git remote set-url origin $git_remote_url

# Если вы не используете ввстроенную возможность Teamcity получения user и email из ~/.gitconfig, то можно указать их здесь
echo 'git config user.name %TEAM_USER%'
git config user.name %TEAM_USER%
echo 'git config user.email %TEAM_USER_EMAIL%'
git config user.email %TEAM_USER_EMAIL%

# Здесь получаем версию из файла pom.xml
echo "Get version package from pom.xml"
version=`python -c "import xml.etree.ElementTree as ET; print(ET.parse(open('pom.xml')).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)"`
echo $version

# Почему-то без fetch выдавало ошибку.
git fetch

if [ `git branch -a | egrep "${version}$"` ]
then
    echo "Branch exists"
    exit 1
fi

# Создаем бранч той версии, который был в файле pom.xml
echo "Create branch"
git checkout -b $version

# Чистый git всегда предлагает настроить политику отправки.
git config --global push.default simple

# Пушим в ветку совпадающую с версией в pom.xml
echo "Push release branch"
git push --set-upstream origin $version

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Maven увеличава корекция на грешка

Задачата се състои от 6 части. Можеше да бъде рефакторирана, но и така работи.

Първата стъпка е проверка дали бранчът не master. Ако бранчът master задачата пада.

BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
  echo 'Бранчът е master';
  echo 'Прекратяване';
  exit 1;
fi

# Тук получаваме версията от файла pom.xml
echo "Вземи версията на пакета от pom.xml"
BRANCH=`python -c "import xml.etree.ElementTree as ET; print(ET.parse(open('pom.xml')).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)"`
# Трябва да направим checkout на необходимия бранч.
# Иначе git status показва detached на необходимия бранч.
# Нужен е git status да показва просто бранч
git checkout $BRANCH
# Изнасяме променливата bash в променлива Teamcity за по-нататъшна употреба.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Втората Maven стъпка променя версията на корекция на грешка в файла pom.xml.

Цели: при maven всичко е в една редица

build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Третата стъпка — извеждане на информация за Git статус и други:

echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Четвъртата стъпка променя схемата за свързване в developerConnection от HTTPS на GIT.

И изпраща промените в бранча, указан в променливата Teamcity %BRANCH_FOR_INCREMENT%

# Здесь получаем developerConnection из файла pom.xml
developerConnection=$(xmllint -xpath "/*[local-name() = 'project' ]//*[local-name() = 'developerConnection']/text()" pom.xml | sed  's|scm:git:ssh://||')
echo developerConnection
# Здесь меняем / на : в URL для git_remote_url
git_remote_url=$(echo $developerConnection| sed 's/gitlab.com//gitlab.com:/g')
echo git_remote_url
echo $git_remote_url

git remote set-url origin $git_remote_url

# Если вы не используете ввстроенную возможность Teamcity получения user и email из ~/.gitconfig, то можно указать их здесь
echo 'git config user.name %TEAM_USER%'
git config user.name %TEAM_USER%
echo 'git config user.email %TEAM_USER_EMAIL%'
git config user.email %TEAM_USER_EMAIL%
echo 'git add .'
git add .
echo 'git commit -m "Increment bugfix"'
git commit -m "Increment bugfix"

git push --set-upstream origin %BRANCH_FOR_INCREMENT%

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Петата стъпка взема от файла pom.xml версията и я задава в Teamcity променлива TAG_FROM_VERSION. Обърнете внимание, че версията от файла pom.xml е без буква v отпред. А етикетът, основан на тази версия, вече е с буква v в началото.

echo "Вземи версията на пакета от pom.xml"
VERSION_AFTER_CHANGE=`python -c "import xml.etree.ElementTree as ET; print(ET.parse(open('pom.xml')).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)"`
echo $VERSION_AFTER_CHANGE
echo "##teamcity[setParameter name='TAG_FROM_VERSION' value='v$VERSION_AFTER_CHANGE']"

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Шестата стъпка — етикетиране bugfix на версията. Това става с помощта на Maven с необходимата опция в Цел.

Опция Goals:

-Dtag=%TAG_FROM_VERSION% scm:tag

Автоматизация на HotFix в проекти на Maven с използване на TeamCity

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster