Selles postituses käsitletakse HotFix automaatse seadistamise seadistamist Maven projektides, kasutades Teamcity't.
HotFix'i tegemiseks on tavaliselt palju käsitsi toiminguid:
- Loo haru selle väljaande jaoks, kuhu soovid HotFix'i rakendada
- Paranda vea väli väljaandes
- Muuda bugfix versiooni väljaande harus
- Tõsta esile bugfix versiooni silt
Punktid 1, 3, 4 saab automatiseerida.
Enne kui liigume teema juurde, tahaksin käsitleda ühte olulist ja keerulist teemat — versioonihalduse tarkvaras. Semver'i kohta saab lühidalt aru sellel ekraanipildil. 
Rohkem infot on saadaval lingil: .
Käesolevas postituses kirjeldatud kõik seadistused toetuvad ja .
Trunk-Based Development'is tuleb iga väljaande jaoks luua oma haru. Kõik muudatused (hotfix) selle väljaande raames.commititakse sellele harule.
Käesolevas postituses automatiseerime järgmised asjad:
CI ehitus
Uue väljaande loomine
Väljaande haru loomine
Bugfix versiooni muutmine

Nõuded:
- Git-repositoorium, et teie kood salvestada. Postituses kasutatakse repositooriumi .
- Teamcity server ja agent. Saate üles seada oma kohaliku Teamcity serveri ja agendi abil
- Kohas, kus teil on Teamcity agent, peavad olema installitud java, maven, git
Loo Teamcity's projekt "Automation Maven Hotfix" ja loo seal 4 ülesannet.
CI Build (CI ehitus)
Loo haru väljaande jaoks (Väljaande haru loomine)
Maven increment bugfix (Bugfix versiooni muutmine)
Maven release (Uue väljaande loomine)
Projekti ekraanipilt:

Üldseaded
Kõigis ülesannetes tuleb märkida „Clean build: Kustuta kõik failid allalaadimise kataloogist enne ehitamist“, kuna selle määramata jätmisel tekkisid mul vead.
Loome ainul VCS. VCS-i eripära on joonitud punasega.

Tavaliselt kasutatakse VCS-i HTTPS-i skeemi. Harude spetsifikatsioon: on määratud vaatama kõiki harusid ja kõiki silte:
+:refs/heads/*
+:refs/tags/*Peab looma 4 konfiguratsiooni parameetrit.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
Vali väärtus BRANCH_FOR_INCREMENT ja TAG_FROM_VERSION peab olema tühi.

Peate üles laadima/ lisama privaatse võtme. Kõigis ülesannetes, välja arvatud CI ehitus, on vajalik privaatne võti.

Igas ülesandes, välja arvatud CI ehitus, tuleb jaotises Build Features lisada privaatne võti.
Näide jaoks Maven release

CI Build**.
Ülesandes CI Build on vaid üks samm mvn clean test

Maven release
Ülesandes Maven release 2 sammu. Esimene samm kontrollib, et haru on master. Kui haru ei ole master, siis ülesanne kukub.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
Teine samm on tavaline mvn release:prepare valikuga —batch-mode

Loo haru rollimiseks
Hotfixi loomiseks peab looma haru. Sellega tegeleb ülesanne Loo haru rollimiseks. Sellel on 2 sammu.
Esimene samm kontrollib, et haru ei master, ja teine kontrollib, et versioon failis pom.xml ei sisaldaks sõna SNAPSHOT
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Haru on master';
echo 'Katkestamine';
exit 1;
fi
echo "Saadud versioon pakett pom.xml-st"
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 "Kontrolli SNAPSHOT"
if [[ $version == "*SNAPSHOT*" ]]; then
echo "******************* HOIATUS *************************"
echo "************ Sa lood haru SNAPSHOTS jaoks ******************"
echo "***********************************************************"
exit 1
fi
Teine samm muudab developerConnection ühenduse skeemi HTTPS-st GIT-iks.
# Здесь получаем 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
Maveni increment bugfix
Ülesanne koosneb 6 osast. Oli võimalik refactoring teha, aga niimoodi töötas ka.
Esimene samm — kontroll on see, et haru ei master. Kui haru master ülesanne kukub.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'Haru on master';
echo 'Katkestamine';
exit 1;
fi
# Siin saame versiooni failist pom.xml
echo "Saadud versioon pakett pom.xml-st"
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)"`
# Peab tegema checkout vajaliku haru peale.
# Muidu git status näitab detached haru.
# Peab, et git status näitaks lihtsalt haru
git checkout $BRANCH
# Eksportime bash muutuja Teamcity muutujasse edasiseks kasutuseks.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"
Teine Maveni samm muudab bugfix versiooni failis pom.xml.
Eesmärgid: mavenil kõik ühel real
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
Kolmas samm — Git statusi teabe ja muu väljastamine:
echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch
Neljas samm muudab developerConnection ühenduse skeemi HTTPS-st GIT-iks.
Ja pushib muudatused harusse, mis on märgitud Teamcity muutuja %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%
Viies samm saab failist pom.xml versiooni ja seab selle Teamcity muutuja TAG_FROM_VERSION. Pange tähele, et versioon failist pom.xml ilma v-tähe ees. Ja silt, mille alusel see versioon on, on juba v-tähega alguses.
echo "Saadud versioon pakett pom.xml-st"
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']"
Kuues samm — sildistamine bugfix versioon. Seda tehakse Maven vajaliku valikuga Eesmärk.
Valik Goals:
-Dtag=%TAG_FROM_VERSION% scm:tag
Allikas: habr.com
