In dit bericht wordt de configuratie van HotFix-automatisering in Maven-projecten met Teamcity beschreven.
Om een HotFix te maken, worden doorgaans veel handmatige handelingen uitgevoerd:
- Maak een branch voor de release waarvoor je de HotFix wilt uitrollen.
- Herstel de fout in de release.
- Wijzig de bugfix-versie in de releasebranch.
- Breng de tag van de bugfix-versie uit.
Punten 1, 3, 4 kunnen worden geautomatiseerd.
Voordat we naar het onderwerp gaan, willen we een belangrijke en complexe kwestie aansteken — versiebeheer van software. Een kort overzicht van Semver kun je begrijpen met behulp van deze screenshot. 
Meer details zijn te lezen via de link: .
Alle instellingen die in dit bericht worden beschreven, zijn gebaseerd op en .
In Trunk-Based Development moet voor elke release een eigen branch worden aangemaakt. Alle wijzigingen (hotfix) binnen deze release worden in deze branch gecommit.
In dit bericht automatiseren we de volgende zaken:
CI-build
Nieuwe release maken
Branch voor release aanmaken
Wijziging van de bugfix-versie

Vereisten:
- Git-repository voor het opslaan van je code. In het bericht wordt de repository gebruikt. .
- Teamcity-server en agent. Je kunt je eigen lokale Teamcity-server en agent opzetten met behulp van
- Waar je de Teamcity-agent hebt, moeten java, maven, git zijn geïnstalleerd.
We creëren een project in Teamcity genaamd 'Automation Maven Hotfix' en maken daar 4 taken aan.
CI Build (CI-build)
Maak een branch aan voor release (Branch voor release aanmaken)
Maven increment bugfix (Wijziging van de bugfix-versie)
Maven release (Nieuwe release maken)
Screenshot van het project:

Algemene instellingen
In alle taken moet de optie "Clean build: Verwijder alle bestanden in de checkout-directory voordat de build wordt uitgevoerd" zijn aangevinkt, want zonder deze optie kwamen er fouten voor.
We creëren één enkele VCS. De bijzonderheden van de VCS zijn rood omcirkeld.

Gewoonlijk gebruikt VCS het HTTPS-schema. In Branch-specificatie: is aangegeven om alle branches en alle tags te bekijken:
+:refs/heads/*
+:refs/tags/*Er moeten 4 configuratieparameters worden aangemaakt.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
Het value-veld in BRANCH_FOR_INCREMENT en TAG_FROM_VERSION moet leeg blijven.

Het is noodzakelijk om een privé-sleutel te uploaden/toe te voegen. In alle taken behalve CI Build is een privé-sleutel nodig.

In elke taak behalve CI Build moet in het gedeelte Build Features de privé-sleutel worden aangesloten.
Voorbeeld voor Maven release

CI Build**.
In de taak CI Build is er slechts één stap mvn clean test

Maven release
In de taak Maven release 2 stappen. De eerste stap controleert of de branch master. Als de branch niet master, dan faalt 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 tweede stap is standaard. mvn release:prepare met de optie —batch-mode

Maak branch voor release aan
Om een hotfix voor de release te maken, moet je een branch aanmaken. Dit wordt afgehandeld door de taak Maak branch voor release aan. Deze heeft 2 stappen.
De eerste stap controleert of de branch niet master, en de tweede controleert of de versie in het bestand pom.xml het woord SNAPSHOT
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Branch is master';
echo 'Aborting';
exit 1;
fi
echo "Haal versiepakket uit 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 "Controleer SNAPSHOT"
if [[ $version == "*SNAPSHOT*" ]]; then
echo "******************* W A R N I N G *************************"
echo "************ U maakt een branch voor SNAPSHOTS ******************"
echo "***********************************************************"
exit 1
fi
De tweede stap verandert in developerConnection het verbindingsschema van HTTPS naar 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
De taak bestaat uit 6 delen. Het kon herschreven worden, maar het werkt zo ook.
De eerste stap is een controle of de branch niet master. Als de branch master valt de taak.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Branch is master';
echo 'Aborting';
exit 1;
fi
# Hier halen we de versie uit het bestand pom.xml
echo "Haal versiepakket uit 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)"`
# We moeten checkout doen naar de juiste branch.
# Anders geeft git status een detached status naar de gewenste branch.
# Het is nodig dat git status gewoon de branch weergeeft
git checkout $BRANCH
# Exporteer de bash-variabele naar de Teamcity-variabele voor verder gebruik.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"
De tweede Maven-stap verandert de bugfix versie in het bestand pom.xml.
Doelen: bij maven alles in één regel
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
De derde stap — geeft informatie over Git status en andere:
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 vierde stap verandert in developerConnection het verbindingsschema van HTTPS naar GIT.
En pusht de wijzigingen naar de branch, zoals aangegeven in de Teamcity-variabele %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%
De vijfde stap haalt uit het bestand pom.xml de versie en stelt deze in op de Teamcity variabele TAG_FROM_VERSION. Merk op dat de versie uit het bestand pom.xml zonder de letter v ervoor. En het label, op basis van deze versie, begint al met de letter v.
echo "Haal versiepakket uit 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']"
De zesde stap — tagging bugfix van de versie. Dit gebeurt met behulp van Maven met de juiste optie in Doel.
Optie Doelen:
-Dtag=%TAG_FROM_VERSION% scm:tag
Bron: habr.com
