Automatisierung von HotFix in Maven-Projekten mit TeamCity
In diesem Beitrag wird die Einrichtung der HotFix-Automatisierung in Maven-Projekten mit Teamcity beschrieben.
Um HotFix durchzuführen, sind normalerweise viele manuelle Schritte erforderlich:
Erstellen Sie einen Brunch für die Version, für die Sie HotFix einführen möchten
Beheben Sie einen Fehler in der Veröffentlichung
Ändern Sie die Bugfix-Version im Release-Zweig
Bugfix-Versions-Tag einführen
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. In diesem Screenshot können Sie Semver kurz verstehen.
Bei der Trunk-basierten Entwicklung müssen Sie für jede Version einen eigenen Zweig erstellen. Alle Änderungen (Hotfixes) in dieser Version werden in diesen Zweig übernommen.
Im Rahmen dieses Beitrags werden wir die folgenden Dinge automatisieren:
Teamcity-Server und -Agent. Sie können Ihren lokalen Teamcity-Server und -Agenten nutzen Docker-komponieren
Wenn Sie einen Teamcity-Agenten haben, müssen Java, Maven und Git installiert sein
Lassen Sie uns das Projekt „Automation Maven Hotfix“ in Teamcity erstellen und dort 4 Aufgaben erstellen.
CI-Build
Zweig zur Veröffentlichung erstellen
Maven-Inkrement-Bugfix (Bugfix-Version ändern))
Maven-Release (Erstellen einer neuen Version)
Projekt-Screenshot:
Allgemeine Einstellungen
Bei allen Aufgaben müssen Sie das Kästchen „Clean Build: Löschen Sie vor dem Build alle Dateien im Checkout-Verzeichnis„, denn ohne dieses Kontrollkästchen habe ich Fehler bekommen.
Wir erstellen ein einzelnes VCS. VCS-Funktionen sind rot eingekreist.
Typischerweise verwenden VCSs das HTTPS-Schema. IN Filialspezifikation: angezeigt, um alle Brunches und alle Tags anzusehen:
+:refs/heads/*
+:refs/tags/*
Es müssen 4 Konfigurationsparameter erstellt werden.
BRANCH_FOR_INCREMENT
TAG_FROM_VERSION
TEAM_USER
TEAM_USER_EMAIL
Das Wertfeld in BRANCH_FOR_INCREMENT und TAG_FROM_VERSION muss leer bleiben.
Sie müssen einen privaten Schlüssel hochladen/hinzufügen. Alle Aufgaben außer CI Build erfordern einen privaten Schlüssel.
Bei jeder Aufgabe außer CI Build müssen Sie im Abschnitt „Build Features“ einen privaten Schlüssel verbinden.
Beispiel für Maven-Veröffentlichung
CI-Build**.
In einer Aufgabe CI-Build nur ein Schritt MVN-Clean-Test
Maven-Veröffentlichung
In einer Aufgabe Maven-Veröffentlichung 2 Schritte. Der erste Schritt besteht darin, zu überprüfen, ob es einen Brunch gibt Master. Wenn es keinen Brunch gibt Master, dann fällt die Aufgabe.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
Der zweite Schritt ist Standard MVN-Release: Vorbereiten mit Option --batch-mode
Zweig zur Veröffentlichung erstellen
Um einen Hotfix für eine Version zu erstellen, müssen Sie einen Zweig erstellen. Das ist es, was die Taska tut Zweig zur Veröffentlichung erstellen. Sie hat 2 Stufen.
Im ersten Schritt wird überprüft, ob Brunch nicht möglich ist Masterund der zweite prüft, ob die Version in der Datei vorhanden ist pom.xml enthielt das Wort nicht SCHNAPPSCHUSS
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
Im zweiten Schritt wird das Verbindungsschema in DeveloperConnection von HTTPS auf GIT geändert.
# Здесь получаем 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-Inkrement-Bugfix
Die Aufgabe besteht aus 6 Teilen. Es hätte umgestaltet werden können, aber es funktioniert immer noch.
Der erste Schritt besteht darin, zu überprüfen, ob der Brunch nicht erfolgt Master. Wenn Brunch Master die Aufgabe 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']"
Der zweite Maven-Schritt besteht darin, die Bugfix-Version in der Datei pom.xml zu ändern.
Der vierte Schritt ändert das Verbindungsschema in DeveloperConnection von HTTPS zu GIT.
Und überträgt Änderungen an den in Teamcity durch die Variable %BRANCH_FOR_INCREMENT% angegebenen Zweig
# Здесь получаем 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 besteht darin, aus der Datei zu holen pom.xml Version und installiert sie in Teamstadt Variable TAG_FROM_VERSION. Beachten Sie, dass die Version aus der Datei pom.xml ohne den Buchstaben v davor. Und das Tag, das auf dieser Version basiert, hat am Anfang bereits den Buchstaben v.
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']"
Sechster Schritt – Tagging Bugfix Versionen. Dies geschieht mit Maven mit der erforderlichen Option in Ziel.