Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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:

  1. Maak een branch voor de release waarvoor je de HotFix wilt uitrollen.
  2. Herstel de fout in de release.
  3. Wijzig de bugfix-versie in de releasebranch.
  4. 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. Automatisering van HotFix in Maven-projecten met behulp van TeamCity

Meer details zijn te lezen via de link: 1.

Alle instellingen die in dit bericht worden beschreven, zijn gebaseerd op Semver en Trunk-Based Development.

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

Vereisten:

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:

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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.

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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.

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Voorbeeld voor Maven release

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

CI Build**.

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

De tweede stap is standaard. mvn release:prepare met de optie —batch-mode

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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%

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

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

Automatisering van HotFix in Maven-projecten met behulp van TeamCity

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster