Në këtë postim do të përshkruhet konfigurimi i automatizimit HotFix në projektet Maven duke përdorur Teamcity.
Për të bërë një HotFix zakonisht bëhen shumë veprime manuale:
- Krijoni një degë për versionin, në të cilin dëshironi të bëni HotFix.
- Rregulloni gabimin në version.
- Modifikoni versionin e bugfix në degën e versionit.
- Nxirrni etiketën e versionit bugfix.
Pikat 1, 3, 4 mund të automatizohen.
Para se të kalojmë në temë, është e rëndësishme të diskutojmë një temë të rëndësishme dhe të ndërlikuar — semanik softuerin. Kratësisht në lidhje me Semver mund të kuptohet në këtë skrinshot. 
Më shumë mund të lexoni në lidhje me lidhjen: .
Të gjitha konfigurimet e përshkruara në këtë postim mbështeten në dhe .
Në Zhvillimin mbi Trunk për çdo version duhet të krijoni degën tuaj. Të gjitha ndryshimet (hotfix) në këtë version komitohen në këtë degë.
Në këtë postim do të automatizojmë gjërat e mëposhtme:
ND Build
Krijimi i një versioni të ri
Krijimi i degës për versionin
Modifikimi i versionit bugfix

Kërkesat:
- Repo git për ruajtjen e kodit tuaj. Në postim do të përdoret repo .
- Serveri dhe agjenti i Teamcity. Mund të ngrini serverin tuaj lokal Teamcity dhe agjentin me ndihmën e
- Aty ku keni agjentin Teamcity, duhet të jenë të instaluar java, maven, git.
Do të krijojmë në Teamcity projektin "Automatizimi Maven Hotfix" dhe do të krijojmë aty 4 detyra.
CI Build (ND Build)
Krijo degë për version (Krijimi i degës për versionin)
Maven rrit bugfix (Modifikimi i versionit bugfix)
Maven lëshim (Krijimi i versionit të ri)
Skrinshoti i projektit:

Konfigurimet e përgjithshme
Në të gjitha detyrat është e nevojshme të vendosni shenjën "Ndiqni ndërtimin: Fshini të gjitha skedarët në direktoriumin e kontrollit përpara ndërtimit." sepse nëse nuk ka këtë shenjë, kam pasur gabime.
Krijoni një VCS të vetëm. Karakteristikat e VCS janë të markuara me të kuqe.

Zakonisht përdorim skemën HTTPS për VCS. Në Specifikimi i degëve: duhet të shikohet të gjitha degët dhe të gjitha etiketat:
+:refs/heads/*
+:refs/tags/*Duhet të krijohen 4 Parametra Konfigurimi.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
Fusha value në BRANCH_FOR_INCREMENT dhe TAG_FROM_VERSION duhet të lihet bosh.

Duhet ngarkuar/shtuar çelësi privat. Në të gjitha detyrat përveç CI Build kërkohet çelësi privat.

Në çdo detyrë përveç CI Build në seksionin e Veçorive të Ndërtimit duhet të bashkëngjitet çelësi privat.
Shembulli për Maven lëshim

CI Build**.
Në detyrën CI Build ka vetëm një hap mvn clean test

Maven lëshim
Në detyrën Maven lëshim 2 hapa. Hapi i parë kontrollon nëse dega është master. Nëse dega nuk është master, atëherë detyra bie.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Dega nuk është master';
echo 'Anulohet';
exit 1;
fi
Hapi i dytë është standardi mvn release:prepare me opsion —mode-rrjedhës

Krijo degë për publikimin
Për të krijuar një hotfix për publikimin, është e nevojshme të krijohet një degë. Kjo bëhet nga një detyrë Krijo degë për publikimin. Ajo ka 2 hapa.
Hapi i parë kontrollon që dega nuk është master, dhe e dyta kontrollon që versioni në skedarin pom.xml nuk përmbante fjalën SNAPSHOT
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Dega është master';
echo 'Ndërprerja';
exit 1;
fi
echo "Merr versionin nga 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 "Kontrollo SNAPSHOT"
if [[ $version == "*SNAPSHOT*" ]]; then
echo "******************* K O N S T A T I M *************************"
echo "************ Po krijoni degë për SNAPSHOTS ******************"
echo "***********************************************************"
exit 1
fi
Hapi i dytë ndryshon në developerConnection skemën e lidhjes nga HTTPS në 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 rregullimi i gabimeve
Detyra përbëhet nga 6 pjesë. Mund të ishte refaktorizuar, por edhe kështu punon.
Hapi i parë — kontrolli që dega nuk është master. Nëse dega master detyra dështoi.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Dega është master';
echo 'Ndërprerja';
exit 1;
fi
# Këtu marrim versionin nga skedari pom.xml
echo "Merr versionin nga 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)"`
# Duhet të bëhet checkout në degën e nevojshme.
# Përndryshe git status tregon detached në degën e nevojshme.
# Nevojitet që git status të tregojë thjesht dega
git checkout $BRANCH
# Eksporto variablin bash në variablin Teamcity për përdorim të mëtejshëm.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"
Hapi i dytë Maven ndryshimi i versionit të rregullimit në skedarin pom.xml.
Qëllimet: në maven të gjitha në një rresht
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
Hapi i tretë — shfaqja e informacionit Git status dhe të tjera:
echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch
Hapi i katërt ndryshon në developerConnection skemën e lidhjes nga HTTPS në GIT.
Dhe shpërndan ndryshimet në degën e specifikuar nga variabli i 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%
Hapi i pestë merr nga skedari pom.xml versionin dhe e vendos atë në Teamcity variablin TAG_FROM_VERSION. Vini re se versioni nga skedari pom.xml pa shkronjën v para. Ndërsa etiketa, mbi këtë version, tashmë ka shkronjën v në fillim.
echo "Merr versionin nga 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']"
Hapi i gjashtë — etiketimi bugfix versioneve. Kjo bëhet me ndihmën e Maven opsionit të duhur në Qëllimi.
Opcioni Qëllimet:
-Dtag=%TAG_FROM_VERSION% scm:tag
Burimi: habr.com
