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:

  1. Erstellen Sie einen Brunch für die Version, für die Sie HotFix einführen möchten
  2. Beheben Sie einen Fehler in der Veröffentlichung
  3. Ändern Sie die Bugfix-Version im Release-Zweig
  4. 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. Automatisierung von HotFix in Maven-Projekten mit TeamCity

Mehr können Sie unter folgendem Link lesen: 1.

Alle in diesem Beitrag beschriebenen Einstellungen basieren auf Semver и Trunk-basierte Entwicklung.

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:

  • CI-Build

  • Erstellen einer neuen Version

  • Erstellen eines Release-Zweigs

  • Bugfix-Version ändern

Automatisierung von HotFix in Maven-Projekten mit TeamCity

Anforderungen:

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:

Automatisierung von HotFix in Maven-Projekten mit TeamCity

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.

Automatisierung von HotFix in Maven-Projekten mit TeamCity

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.

Automatisierung von HotFix in Maven-Projekten mit TeamCity

Sie müssen einen privaten Schlüssel hochladen/hinzufügen. Alle Aufgaben außer CI Build erfordern einen privaten Schlüssel.

Automatisierung von HotFix in Maven-Projekten mit TeamCity

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

Automatisierung von HotFix in Maven-Projekten mit TeamCity

CI-Build**.

In einer Aufgabe CI-Build nur ein Schritt MVN-Clean-Test

Automatisierung von HotFix in Maven-Projekten mit TeamCity

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

Automatisierung von HotFix in Maven-Projekten mit TeamCity

Der zweite Schritt ist Standard MVN-Release: Vorbereiten mit Option --batch-mode

Automatisierung von HotFix in Maven-Projekten mit TeamCity

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

Automatisierung von HotFix in Maven-Projekten mit TeamCity

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

Automatisierung von HotFix in Maven-Projekten mit TeamCity

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']"

Automatisierung von HotFix in Maven-Projekten mit TeamCity

Der zweite Maven-Schritt besteht darin, die Bugfix-Version in der Datei pom.xml zu ändern.

Ziele: Maven hat alles in einer Zeile

build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit

Automatisierung von HotFix in Maven-Projekten mit TeamCity

Der dritte Schritt besteht darin, Git-Statusinformationen und andere anzuzeigen:

echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch

Automatisierung von HotFix in Maven-Projekten mit TeamCity

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%

Automatisierung von HotFix in Maven-Projekten mit TeamCity

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']"

Automatisierung von HotFix in Maven-Projekten mit TeamCity

Sechster Schritt – Tagging Bugfix Versionen. Dies geschieht mit Maven mit der erforderlichen Option in Ziel.

Option Ziele:

-Dtag=%TAG_FROM_VERSION% scm:tag

Automatisierung von HotFix in Maven-Projekten mit TeamCity

Source: habr.com

Kommentar hinzufügen