Dëse Post beschreift d'Opstellung vun HotFix Automatioun a Maven Projeten mat Teamcity.
Fir HotFix ze maachen, gi vill manuell Schrëtt normalerweis gemaach:
- Erstellt e Brunch fir d'Verëffentlechung op déi Dir HotFix wëllt ausrollen
- Fix e Feeler an der Verëffentlechung
- Ännert d'Bugfix Versioun an der Verëffentlechungszweig
- Roll eraus Bugfix Versioun Tag
Punkten 1,3,4 kënnen automatiséiert ginn.
Ier mer op d'Thema weidergoen, wëll ech op e wichtegt a komplext Thema beréieren - Versiounen Software. Dir kënnt Semver kuerz an dësem Screenshot verstoen. 
Dir kënnt méi um Link liesen: .
All Astellungen, déi an dësem Post beschriwwe sinn, baséieren op и .
An Trunk-Based Entwécklung musst Dir Är eege Filial fir all Verëffentlechung erstellen. All Ännerungen (Hotfixes) bannent dëser Verëffentlechung sinn fir dës Branche engagéiert.
Als Deel vun dësem Post wäerte mir déi folgend Saachen automatiséieren:
CI bauen
Schafen eng nei Verëffentlechung
Eng Verëffentlechungszweig erstellen
D'Bugfix Versioun änneren

Ufuerderunge:
- Git Repository fir Äre Code ze späicheren. De Post wäert de Repository benotzen .
- Teamcity Server an Agent. Dir kënnt Äre lokalen Teamcity Server an Agent erhéijen andeems Dir
- Wou Dir Teamcity Agent hutt, Java, Maven, Git muss installéiert ginn
Loosst eis de Projet "Automation Maven Hotfix" an Teamcity erstellen an do 4 Aufgaben erstellen.
CI Bauen
Erstellt Branche fir Verëffentlechung
Maven Inkrement Bugfix (Bugfix Versioun änneren))
Maven Verëffentlechung (Eng nei Verëffentlechung erstellen)
Project Screenshot:

Allgemeng Astellunge
An all Aufgaben musst Dir d'Këscht markéieren "Clean Build: Läschen all Dateien am Kasseverzeechnes virum Build", well ouni dës Checkbox hunn ech Feeler.
Mir schafen eng eenzeg VCS. VCS Fonctiounen sinn am rout ëmkreest.

Typesch benotzen VCSs den HTTPS Schema. IN Branch Spezifizéierung: uginn fir all Brunchen an all Tags ze kucken:
+:refs/heads/*
+:refs/tags/*Et ass néideg fir 4 Konfiguratiounsparameter ze kreéieren.
- BRANCH_FIR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
D'Wäertfeld an BRANCH_FOR_INCREMENT an TAG_FROM_VERSION muss eidel gelooss ginn.

Dir musst e private Schlëssel eropluede / derbäi. All Aufgaben ausser CI Build erfuerderen e private Schlëssel.

An all Aufgab, ausser CI Build, an der Build Features Sektioun musst Dir e private Schlëssel verbannen.
Beispill fir Maven Fräisetzung

CI Build**.
An enger Aufgab CI Bauen just ee Schrëtt mvn propper Test

Maven Fräisetzung
An enger Aufgab Maven Fräisetzung 2 Schrëtt. Den éischte Schrëtt ass ze kontrolléieren ob de Brunch ass Meeschtesch. Wann Brunch net ass Meeschtesch, da fällt d'Aufgab.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
Den zweete Schrëtt ass Standard mvn Verëffentlechung: virbereeden mat Optioun --Batch-Modus

Erstellt Branche fir Verëffentlechung
Fir e Hotfix fir eng Verëffentlechung ze kreéieren musst Dir eng Branche erstellen. Dëst ass wat d'Taska mécht Erstellt Branche fir Verëffentlechung. Si huet 2 Schrëtt.
Den éischte Schrëtt kontrolléiert datt Brunch net ass Meeschtesch, an déi zweet kontrolléiert datt d'Versioun an der Datei ass pom.xml huet d'Wuert net enthalen 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
Den zweete Schrëtt ännert d'Verbindungsschema am EntwécklerConnection vun HTTPS op 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 erhéijen Bugfix
D'Aufgab besteet aus 6 Deeler. Et kéint refactored ginn, mä et funktionnéiert nach.
Den éischte Schrëtt ass ze kontrolléieren ob de Brunch net ass Meeschtesch. Wann Brunch Meeschtesch d'Aufgab fällt.
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']"
Den zweete Maven Schrëtt ännert d'Bugfix Versioun an der pom.xml Datei.
Goaler: Maven huet alles an enger Linn
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
Den drëtte Schrëtt ass Git Statusinformatioun an anerer ze weisen:
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 véierte Schrëtt ännert d'Verbindungsschema am EntwécklerConnection vun HTTPS op GIT.
A dréckt d'Ännerungen un d'Branche spezifizéiert an Teamcity vun der %BRANCH_FOR_INCREMENT% Variabel
# Здесь получаем 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 fënnefte Schrëtt ass aus der Datei ze kommen pom.xml Versioun an installéiert se an Teamcity variabel TAG_FROM_VERSION. Bedenkt datt d'Versioun vun der Datei pom.xml ouni de Buschtaf v virun. An den Tag, baséiert op dëser Versioun, huet schonn de Buschtaf v am Ufank.
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']"
Sechste Schrëtt - Tagging bugfix Versiounen. Dëst gëtt gemaach mat Maven mat der néideg Optioun an Zil.
Optioun Zieler:
-Dtag=%TAG_FROM_VERSION% scm:tag
Source: will.com
