Аўтаматызацыя 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 сервер і агент з дапамогай докер-Compose
  • Там дзе ў вас Teamcity агент, павінны быць устаноўлены java, maven, git

Створым у Teamcity праект Automation Maven Hotfix і створым там 4 цягі.

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

  • Create branch for release (Стварэнне бранч для рэлізу)

  • Maven increment bugfix (Змена bugfix версіі)

  • Maven release (Стварэнне новага рэлізу)

Скрыншот праекта:

Аўтаматызацыя HotFix у Maven праектах з выкарыстаннем TeamCity

агульныя налады

Ва ўсіх цягах неабходна выставіць галкуClean build: Delete all files in the checkout directory before the build«, бо пры адсутнасці гэтай галкі ў мяне з'яўляліся памылкі.

Ствараем адзіны VCS. Асаблівасці VCS абведзены чырвоным.

Аўтаматызацыя HotFix у Maven праектах з выкарыстаннем TeamCity

Звычайна VCS выкарыстоўваюць схему HTTPS. У Branch specification: паказана глядзець усе бранчы і ўсе тэгі:

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

Неабходна стварыць 4 Configuration Parameters.

  • 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 release

Аўтаматызацыя HotFix у Maven праектах з выкарыстаннем TeamCity

CI Build**.

У цяге CI Build усяго толькі адзін крок mvn clean test

Аўтаматызацыя HotFix у Maven праектах з выкарыстаннем TeamCity

Maven release

У цяге Maven release 2 крокі. Першы крок правярае што бранч гэта майстар. Калі бранч не майстар, то цяга падае.

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

Create branch for release

Каб стварыць hotfix для рэлізу трэба стварыць бранч. Гэтым займаецца цяга Create branch for release. У яе 2 крокі.

Першы крок правярае што бранч не майстар, і другое правярае што версія ў файле pom.xml не змяшчала слова СНАПШОТ

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

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 "Check SNAPSHOT"
if [[ $version == "*SNAPSHOT*" ]]; then
    echo "******************* W A R N I N G *************************"
    echo "************ You are create branch for 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 increment bugfix

Таска складаецца з 6 частак. Можна было адрэфактарыць, але і так працуе.

Першы крок - праверка што бранч не майстар. Калі бранч майстар цяга падае.

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

# Здесь получаем версию из файла pom.xml
echo "Get version package from 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 крок змена bugfix версіі ў файле pom.xml.

Галы: у maven усё адным радком

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

Аўтаматызацыя HotFix у Maven праектах з выкарыстаннем TeamCity

Трэці крок - выснова інфармацыі Git status і іншыя:

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 "Get version package from 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

Шосты крок - тэгіраванне выпраўленне версіі. Робіцца гэта з дапамогай Спецыяліст з патрэбнай опцыяй у Мэта.

опцыя Мэтаў:

-Dtag=%TAG_FROM_VERSION% scm:tag

Аўтаматызацыя HotFix у Maven праектах з выкарыстаннем TeamCity

Крыніца: habr.com

Дадаць каментар