Automatisierung HotFix in Maven-Projekten mit TeamCity

In diesem Beitrag wird beschrieben, wie Sie die HotFix-Automatisierung in Maven-Projekten mithilfe von Teamcity konfigurieren.


Um HotFix auszuführen, werden normalerweise viele manuelle Aktionen ausgeführt:


  1. Erstellen Sie einen Brunch für das Release, auf das Sie HotFix rollen möchten
  2. Release Bug behoben
  3. Ändern Sie die Bugfix-Version im Release-Brunch
  4. Roll-out-Tag-Bugfix-Version

Die Punkte 1,3,4 können automatisiert werden.


Bevor wir zum Thema übergehen, möchte ich auf eine wichtige und komplexe Themaversionssoftware eingehen . Kurz über Semver kann in diesem Screenshot verstanden werden.


Sie können mehr unter dem Link lesen: 1 .


Alle in diesem Beitrag beschriebenen Einstellungen basieren auf Semver- und Trunk-basierter Entwicklung .


In der stammbasierten Entwicklung müssen Sie für jedes Release einen eigenen Brunch erstellen. Alle Änderungen (Hotfix) in dieser Version sind diesem Brunch vorbehalten.


Im Rahmen dieses Beitrags automatisieren wir die folgenden Dinge:


  • CI-Versammlung


  • Neues Release erstellen


  • Erstellen Sie einen Brunch für die Veröffentlichung


  • Ändern der Bugfix-Version




Anforderungen:



Lassen Sie uns das Projekt "Automation Maven Hotfix" in Teamcity erstellen und dort 4 Aufgaben erstellen.


  • CI-Build (CI-Build)


  • Zweig zur Freigabe anlegen


  • Maven-Inkrement-Bugfix (Bugfix-Version ändern)


  • Maven-Release (Erstellen eines neuen Releases)



Projekt-Screenshot:



Allgemeine Einstellungen


In allen Tasks muss das Kontrollkästchen " Clean Build: Alle Dateien im Checkout-Verzeichnis vor dem Build löschen" aktiviert sein, da bei Fehlen dieser Dämmerung Fehler aufgetreten sind.


Erstellen Sie ein einzelnes VCS. Merkmale VCS rot eingekreist.



VCS verwenden normalerweise das HTTPS-Schema. In der Branchenspezifikation: Es ist angezeigt, alle Brunchs und alle Tags zu beobachten:


+:refs/heads/* +:refs/tags/* 

Es müssen 4 Konfigurationsparameter erstellt werden.


  • BRANCH_FOR_INCREMENT
  • TAG_FROM_VERSION
  • TEAM_USER
  • TEAM_USER_EMAIL

Das Wertefeld in BRANCH_FOR_INCREMENT und TAG_FROM_VERSION muss leer bleiben.



Sie müssen einen privaten Schlüssel hochladen / hinzufügen. Für alle Aufgaben mit Ausnahme von CI Build ist ein privater Schlüssel erforderlich.



In jeder Task mit Ausnahme von CI Build müssen Sie im Abschnitt Build-Funktionen einen privaten Schlüssel verbinden.


Beispiel für die Veröffentlichung von Maven



CI Build **.


In der CI-Erstellungsaufgabe nur ein Schritt für einen sauberen Test



Maven-Veröffentlichung


Es gibt 2 Schritte in Maven Release . Der erste Schritt ist zu überprüfen, ob der Brunch der Meister ist . Wenn der Brunch kein Meister ist , 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 das Standard- MVN- Release: Bereiten Sie sich mit der Option --batch-mode vor



Zweig zur Freigabe anlegen


Um einen Hotfix für die Veröffentlichung zu erstellen, müssen Sie einen Brunch erstellen. Dies erfolgt über Zweig für Freigabeaufgabe erstellen . Sie hat 2 Stufen.


Im ersten Schritt wird überprüft, ob der Brunch kein Master ist , und im zweiten Schritt, ob die Version in der Datei pom.xml nicht das Wort SNAPSHOT enthält


 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 "******************* WARNING *************************" echo "************ You are create branch for SNAPSHOTS ******************" echo "***********************************************************" exit 1 fi 


Im zweiten Schritt wird das Konnektivitätsschema von 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


Aufgabe besteht aus 6 Teilen. Es könnte überarbeitet werden, aber es funktioniert so.


Der erste Schritt besteht darin, zu überprüfen, ob der Brunch kein Meister ist . Wenn die Brunch- Master- 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.


Ziele: Maven hat alles in einer Zeile


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


Der dritte Schritt besteht darin, Git-Statusinformationen und andere Informationen 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 


Im vierten Schritt wird das Konnektivitätsschema von developerConnection von HTTPS auf GIT geändert.


Und überträgt Änderungen an den Zweig, der in der Teamcity-Variablen% BRANCH_FOR_INCREMENT% angegeben ist.


 #   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% 


Im fünften Schritt wird die Version aus der Datei pom.xml abgerufen und die Variable TAG_FROM_VERSION auf Teamcity festgelegt . Beachten Sie, dass die Version aus der Datei pom.xml ohne den Buchstaben v vorangestellt ist. Und das Tag, basierend auf dieser Version bereits mit dem Buchstaben v am Anfang.


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


Der sechste Schritt ist das Markieren der Bugfix- Version. Dies geschieht mit Maven mit der gewünschten Option in Goal .


Zieloption:


 -Dtag=%TAG_FROM_VERSION% scm:tag 

Source: https://habr.com/ru/post/de483242/


All Articles