Dizze post sil it ynstellen fan HotFix-automatisearring beskriuwe yn Maven-projekten mei Teamcity.
Om HotFix te dwaan, wurde normaal in protte hânmjittige stappen dien:
- Meitsje in brunch foar de release wêrop jo HotFix wolle útrolje
- Reparearje in brek yn release
- Feroarje de bugfix ferzje yn 'e release branch
- Rôlje út bugfix ferzje tag
Punten 1,3,4 kinne wurde automatisearre.
Foardat wy nei it ûnderwerp gean, wol ik graach in wichtich en kompleks ûnderwerp oanreitsje - ferzje software. Jo kinne Semver koart begripe yn dizze skermôfbylding. 
Jo kinne mear lêze op de link: .
Alle ynstellingen beskreaun yn dizze post binne basearre op и .
Yn Trunk-Based Development moatte jo jo eigen branch meitsje foar elke release. Alle wizigingen (hotfixes) binnen dizze útjefte binne ynsette foar dizze branch.
As ûnderdiel fan dizze post sille wy de folgjende dingen automatisearje:
CI bouwe
It meitsjen fan in nije release
It meitsjen fan in release branch
It feroarjen fan de bugfix ferzje

Easken:
- Git repository foar it bewarjen fan jo koade. De post sil it repository brûke .
- Teamcity tsjinner en agent. Jo kinne jo lokale Teamcity-tsjinner en -agent ferheegje mei
- Wêr't jo Teamcity-agent hawwe, java, maven, git moat ynstalleare wurde
Litte wy it projekt "Automation Maven Hotfix" oanmeitsje yn Teamcity en dêr 4 taken oanmeitsje.
CI Bouwe
Meitsje branch foar frijlitting
Maven increment bugfix (feroarje bugfix ferzje))
Maven release (in nije release oanmeitsje)
Projekt skermôfbylding:

Algemiene ynstellings
Yn alle taken moatte jo it fakje "Clean build: wiskje alle bestannen yn 'e kassamap foar it bouwen“, want sûnder dit karfakje krige ik flaters.
Wy meitsje in inkele VCS. VCS-funksjes wurde yn read rûn.

Typysk brûke VCS's it HTTPS-skema. YN Branch spesifikaasje: oanjûn om alle brunches en alle tags te besjen:
+:refs/heads/*
+:refs/tags/*It is nedich om 4 konfiguraasjeparameters te meitsjen.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
It weardefjild yn BRANCH_FOR_INCREMENT en TAG_FROM_VERSION moat leech bliuwe.

Jo moatte in privee kaai uploade / taheakje. Alle taken útsein CI Build fereaskje in privee kaai.

Yn elke taak, útsein CI Build, yn 'e Build Features seksje moatte jo in privee kaai ferbine.
Foarbyld foar Maven release

CI Build**.
Yn in taak CI Bouwe mar ien stap mvn skjinne test

Maven release
Yn in taak Maven release 2 stappen. De earste stap is om te kontrolearjen dat brunch is master. As brunch is net master, dan falt de taak.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
De twadde stap is standert mvn release: tariede mei opsje --batch-modus

Meitsje branch foar frijlitting
Foar in meitsje in hotfix foar in release jo moatte meitsje in tûke. Dit is wat de taak docht Meitsje branch foar frijlitting. Se hat 2 stappen.
De earste stap kontrolearret dat brunch net is master, en de twadde kontrolearret dat de ferzje yn it bestân is pom.xml it wurd net befette SNAPSHOT
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
De twadde stap feroaret it ferbiningskema yn developerConnection fan HTTPS nei 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 fergruttet bugfix
De taak bestiet út 6 dielen. It koe wurde refactored, mar it wurket noch.
De earste stap is om te kontrolearjen dat de brunch net is master. As brunch master de taak falt.
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']"
De twadde Maven-stap is it feroarjen fan de bugfix-ferzje yn it pom.xml-bestân.
doelen: Maven hat alles yn ien rigel
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
De tredde stap is om Git-statusynformaasje en oaren te werjaan:
echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch
De fjirde stap feroaret it ferbiningskema yn developerConnection fan HTTPS nei GIT.
En triuwt feroarings oan 'e branch spesifisearre yn Teamcity troch de %BRANCH_FOR_INCREMENT% fariabele
# Здесь получаем 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%
De fyfde stap is it krijen fan it bestân pom.xml ferzje en ynstallearret it yn Teamcity fariabele TAG_FROM_VERSION. Tink derom dat de ferzje fan it bestân pom.xml sûnder de letter v foaryn. En de tag, basearre op dizze ferzje, hat al de letter v oan it begjin.
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']"
Seisde stap - tagging bugfix ferzjes. Dit wurdt dien mei help fan Maven mei de fereaske opsje yn Doelpunt.
Opsje Doel:
-Dtag=%TAG_FROM_VERSION% scm:tag
Boarne: www.habr.com
