I dette indlæg vil opsætningen af automatisering af HotFix i Maven-projekter ved brug af TeamCity blive beskrevet.
For at lave en HotFix udføres der normalt mange manuelle handlinger:
- Opret en gren til den version, som du vil implementere HotFixet til.
- Reparer fejlen i versionen.
- Ændr bugfix-versionen i release-grenen.
- Udrul tagget for bugfix-versionen.
Punkterne 1, 3 og 4 kan automatiseres.
Inden vi går videre til emnet, vil jeg gerne berøre et vigtigt og komplekst emne — versionsstyring software. Kort sagt kan man forstå Semver ud fra dette screenshot. 
Yderligere oplysninger kan findes på linket: .
Alle indstillinger, der er beskrevet i dette indlæg, er baseret på og .
I Trunk-Based Development skal der oprettes en gren for hver release. Alle ændringer (hotfix) inden for denne release bliver committet til denne gren.
I forbindelse med dette indlæg automatiserer vi følgende ting:
CI build.
Oprettelse af en ny release.
Oprettelse af en gren til releasen.
Ændring af bugfix-versionen.

Krav:
- Git-repositoriet til opbevaring af din kode. I indlægget vil der blive brugt et repository. .
- TeamCity-server og agent. Du kan opsætte din egen lokale TeamCity-server og agent ved hjælp af
- Hvor du har TeamCity-agenten, skal Java, Maven og Git være installeret.
Lad os oprette et projekt i TeamCity kaldet „Automation Maven Hotfix“ og dernæst oprette 4 opgaver.
CI Build.
Opret gren til release.
Maven increment bugfix.
Maven release.
Screenshot af projektet:

Generelle indstillinger.
I alle opgaver skal afkrydsningsfeltet „Rens bygning: Slet alle filer i checkout-mappen før bygningen.“ være markeret, da jeg fik fejl uden dette afkrydsningsfelt.
Opretter det eneste VCS. Funktionerne ved VCS er markeret med rødt.

Normalt bruger VCS HTTPS-skemaet. I Gren-specifikation: står det at se på alle grene og alle tags:
+:refs/heads/*
+:refs/tags/*Det er nødvendigt at oprette 4 konfigurationsparametre.
- BRANCH_FOR_INCREMENT.
- TAG_FROM_VERSION.
- TEAM_USER.
- TEAM_USER_EMAIL.
Feltet value i BRANCH_FOR_INCREMENT og TAG_FROM_VERSION skal efterlades tomt.

Det er nødvendigt at uploade/tilføje den private nøgle. I alle opgaver bortset fra CI Build er den private nøgle nødvendig.

I hver opgave bortset fra CI Build i sektionen Byg-funktioner skal den private nøgle tilsluttes.
Eksempel for Maven release.

CI Build.
I opgaven CI Build. er der kun ét trin: mvn clean test.

Maven release.
I opgaven Maven release. 2 trin. Første trin kontrollerer om grenen er master. Hvis grenen ikke er master, fejler opgaven.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Grenen er ikke master';
echo 'Annullerer';
exit 1;
fi
Andet trin er standard mvn release:prepare. med optionen. —batch-mode

Opret gren til udgivelse
For at oprette en hotfix til udgivelsen skal der oprettes en gren. Dette håndteres af opgaven Opret gren til udgivelse. Den har 2 trin.
Det første trin kontrollerer, at grenen ikke er master, og det andet kontrollerer, at versionen i filen pom.xml ikke indeholdt ordet SNAPSHOT
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Grenen er master';
echo 'Annullerer';
exit 1;
fi
echo "Hent versionspakke fra 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 "Tjek SNAPSHOT"
if [[ $version == "*SNAPSHOT*" ]]; then
echo "******************* A D V A R S L E* *******************"
echo "************ Du opretter gren til SNAPSHOTS ******************"
echo "***********************************************************"
exit 1
fi
Det andet trin ændrer developerConnection-forbindelsen fra HTTPS til 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 increment bugfix
Opgaven består af 6 dele. Det kunne være blevet refaktoreret, men det fungerer også.
Det første trin — kontrol af, at grenen ikke er master. Hvis grenen master fejler opgaven.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Grenen er master';
echo 'Annullerer';
exit 1;
fi
# Her henter vi versionen fra pom.xml-filen
echo "Hent versionspakke fra 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)"`
# Vi må lave checkout til den ønskede gren.
# Ellers viser git status detached til den ønskede gren.
# Det skal være sådan, at git status viser bare grenen
git checkout $BRANCH
# Eksportér bash-variablen til Teamcity-variablen til senere brug.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"
Det andet Maven trin ændrer bugfix-versionen i pom.xml-filen.
Mål: hos maven er alt på én linje
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
Det tredje trin — visning af oplysninger om Git-status og andre:
echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch
Det fjerde trin ændrer developerConnection-forbindelsen fra HTTPS til GIT.
Og pusher ændringerne til den gren, der er angivet i Teamcity-variablen %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%
Det femte trin henter fra filen pom.xml versionen og sætter den i Teamcity variabel TAG_FROM_VERSION.. Bemærk, at versionen fra filen pom.xml uden bogstavet v foran. Og tagget, baseret på denne version, har allerede bogstavet v i starten.
echo "Hent versionspakke fra 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']"
Det sjette trin — taggning bugfix versioner. Dette gøres ved hjælp af Maven med den ønskede indstilling i Mål.
Mulighed Mål:
-Dtag=%TAG_FROM_VERSION% scm:tag
Kilde: habr.com
