Аўтаматызацыя HotFix у Maven праектах з выкарыстаннем TeamCity
У гэтым пасце будзе апісана налада аўтаматызацыі HotFix у Maven праектах з выкарыстаннем Teamcity.
Каб зрабіць HotFix звычайна робіцца шмат ручных дзеянняў:
Стварыць бранч для рэлізу, на які вы жадаеце выкочваць HotFix
Выправіць памылку ў рэлізе
Змяніць bugfix версію ў рэлізным бранч
Выкаціць тэг bugfix версіі
Пункты 1,3,4 можна аўтаматызаваць.
Перад тым як пяройдзем да тэмы, хочацца закрануць важную і складаную тэму. версіявання праграмнага забеспячэння. Коратка аб Semver можна зразумець на гэтым скрыншоце.
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 (Стварэнне новага рэлізу)
Скрыншот праекта:
агульныя налады
Ва ўсіх цягах неабходна выставіць галкуClean build: Delete all files in the checkout directory before the build«, бо пры адсутнасці гэтай галкі ў мяне з'яўляліся памылкі.
Ствараем адзіны VCS. Асаблівасці VCS абведзены чырвоным.
Звычайна 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 трэба пакінуць пустым.
Неабходна запампаваць/дадаць прыватны ключ. Ва ўсіх цягах акрамя CI Build неабходзен прыватны ключ.
У кожнай цяглі акрамя CI Build у падзеле Build Features трэба падлучыць прыватны ключ.
Прыклад для Maven release
CI Build**.
У цяге CI Build усяго толькі адзін крок mvn clean test
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
Другі крок гэта стандартны mvn release:prepare з опцыяй -batch-mode
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
Другі крок змяняе ў 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
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']"
Другі Maven крок змена bugfix версіі ў файле pom.xml.
Чацвёрты крок змяняе ў 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%
Пяты крок атрымлівае з файла 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']"
Шосты крок - тэгіраванне выпраўленне версіі. Робіцца гэта з дапамогай Спецыяліст з патрэбнай опцыяй у Мэта.