In diesem Beitrag wird die Einrichtung der HotFix-Automatisierung in Maven-Projekten mit Teamcity beschrieben.
Um einen HotFix durchzuführen, sind normalerweise viele manuelle Schritte erforderlich:
- Einen Branch für die Version erstellen, auf die Sie den HotFix anwenden möchten
- Den Fehler in der Version beheben
- Die Bugfix-Version im Release-Branch ändern
- Den Tag der Bugfix-Version erstellen
Die Punkte 1, 3, 4 können automatisiert werden.
Bevor wir zum Thema übergehen, möchte ich ein wichtiges und komplexes Thema ansprechen — Versionierung Software. Eine kurze Erklärung zu Semver kann auf diesem Screenshot verstanden werden. 
Detailiertere Informationen finden Sie unter folgendem Link: .
Alle in diesem Beitrag beschriebenen Einstellungen basieren auf und .
Im Trunk-Based Development muss für jedes Release ein eigener Branch erstellt werden. Alle Änderungen (Hotfixes) innerhalb dieses Releases werden in diesen Branch eingecheckt.
In diesem Beitrag automatisieren wir die folgenden Dinge:
CI-Bau
Erstellen eines neuen Releases
Erstellen eines Branches für das Release
Ändern der Bugfix-Version

Anforderungen:
- Git-Repository zur Speicherung Ihres Codes. Im Beitrag wird das Repository verwendet .
- Teamcity-Server und Agent. Sie können Ihren lokalen Teamcity-Server und Agenten mit Hilfe von
- Dort, wo Ihr Teamcity-Agent ist, müssen Java, Maven, Git installiert sein.
Wir erstellen in Teamcity das Projekt „Automation Maven Hotfix“ und erstellen darin 4 Aufgaben.
CI-Bau (CI Build)
Branch für Release erstellen (Create branch for release)
Maven Bugfix-Version erhöhen (Maven increment bugfix)
Maven Release (Erstellen eines neuen Releases)
Screenshot des Projekts:

Allgemeine Einstellungen
In allen Aufgaben muss das Kontrollkästchen „Clean build: Löschen Sie alle Dateien im Checkout-Verzeichnis vor dem Build„ aktiviert werden, da ohne dieses Kontrollkästchen bei mir Fehler auftraten.
Wir erstellen ein einziges VCS. Die Eigenschaften des VCS sind rot umrandet.

In der Regel verwenden VCS das HTTPS-Schema. In Branch-Spezifikation: wird angegeben, dass alle Branches und Tags angezeigt werden sollen:
+:refs/heads/*
+:refs/tags/*Es müssen 4 Konfigurationsparameter erstellt werden.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
Das Feld value in BRANCH_FOR_INCREMENT und TAG_FROM_VERSION muss leer bleiben.

Es ist notwendig, einen privaten Schlüssel hochzuladen/hinzuzufügen. In allen Aufgaben außer CI Build ist ein privater Schlüssel erforderlich.

In jeder Aufgabe außer CI Build muss im Abschnitt Build Features der private Schlüssel aktiviert werden.
Beispiel für Maven Release

CI Build**.
In der Aufgabe CI Build gibt es nur einen Schritt mvn clean test

Maven Release
In der Aufgabe Maven Release 2 Schritte. Der erste Schritt prüft, ob der Branch master. Wenn der Branch nicht master, schlägt die Aufgabe fehl.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch ist nicht master';
echo 'Abbruch';
exit 1;
fi
Der zweite Schritt ist das Standard- mvn release:prepare mit der Option —Batch-Modus

Release-Zweig erstellen
Um einen Hotfix für den Release zu erstellen, muss ein Branch erstellt werden. Dies übernimmt die Task Release-Zweig erstellen. Sie hat 2 Schritte.
Der erste Schritt überprüft, ob der Branch nicht master, und der zweite überprüft, ob die Version in der Datei pom.xml das Wort SNAPSHOT
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Branch ist master';
echo 'Abbruch';
exit 1;
fi
echo "Version aus pom.xml abrufen"
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 "SNAPSHOT überprüfen"
if [[ $version == "*SNAPSHOT*" ]]; then
echo "******************* W A R N U N G *************************"
echo "************ Sie erstellen einen Branch für SNAPSHOTS ******************"
echo "***********************************************************"
exit 1
fi
Der zweite Schritt ändert im developerConnection das Verbindungsschema von HTTPS auf 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 Fehlerbehebung Increment
Die Aufgabe besteht aus 6 Teilen. Man hätte refaktorisieren können, aber so funktioniert es auch.
Der erste Schritt — Überprüfung, dass der Branch nicht master. Wenn der Branch master bricht die Task.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Branch ist master';
echo 'Abbruch';
exit 1;
fi
# Hier erhalten wir die Version aus der Datei pom.xml
echo "Version aus pom.xml abrufen"
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)"`
# Es ist notwendig, auf den benötigten Branch zu wechseln.
# Andernfalls zeigt git status detached zum benötigten Branch an.
# Es ist notwendig, dass git status einfach den Branch anzeigt
git checkout $BRANCH
# Wir exportieren die Bash-Variable in die Teamcity-Variable für die weitere Verwendung.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"
Der zweite Maven-Schritt ändert die Bugfix-Version in der Datei pom.xml.
Ziele: bei maven alles in einer Zeile
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
Der dritte Schritt — Ausgabe von Informationen zu Git-Status und anderen:
echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch
Der vierte Schritt ändert im developerConnection das Verbindungsschema von HTTPS auf GIT.
Und pusht die Änderungen in den auf Teamcity angegebenen Branch %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%
Der fünfte Schritt ruft aus der Datei pom.xml die Version ab und setzt sie auf Teamcity Variable TAG_FROM_VERSION. Beachten Sie, dass die Version aus der Datei pom.xml ohne das Zeichen v davor lautet. Und das Tag, welches auf dieser Version basiert, hat bereits ein v am Anfang.
echo "Version aus pom.xml abrufen"
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']"
Der sechste Schritt — Tagging bugfix der Version. Dies erfolgt mit Maven mit der erforderlichen Option in Ziel.
Option Ziele:
-Dtag=%TAG_FROM_VERSION% scm:tag
Quelle: habr.com
