Selles postituses käsitletakse automaatika seadistamist HotFix'i jaoks Maven projektides, kasutades Teamcity't.
HotFix'i tegemiseks on tavaliselt vajalik teha palju käsitsi toiminguid:
- Loo haru selle väljaande jaoks, kuhu soovid HotFix'i rakendada
- Paranda viga väljaandes
- Muuda bugfix versiooni väljaande harus
- Käivita bugfix versiooni silt
Punktid 1, 3, 4 on automatiseeritavad.
Enne teema juurde minekut tahan käsitleda olulist ja keerulist teemat — versioonihalduse tarkvara. Semver'i kohta saab lühidalt aru sellel ekraanipildil. 
Rohkem infot on võimalik lugeda järgmisel lingil: .
Kõik selles postituses kirjeldatud seadistused toetuvad ja .
Trunk-Based Development'is tuleb iga väljaande jaoks luua oma haru. Kõik muudatused (hotfix) sel väljaandel commititakse sellele harule.
Selles postituses automatiseerime järgnevate asjade:
CI ehitus
Uue väljaande loomine
Väljaande haru loomine
Bugfix versiooni muutmine

Nõuded:
- Git repole, kus on salvestatud sinu kood. Postituses kasutatakse repot .
- Teamcity server ja agent. Sa saad luua oma kohaliku Teamcity serveri ja agendi kasutades
- Seal, kus on sinu Teamcity agent, peavad olema installitud java, maven, git
Loo Teamcity's projekt "Automation Maven Hotfix" ja loo sinna 4 ülesannet.
CI Build (CI ehitus)
Create branch for release (Väljaande haru loomine)
Maven increment bugfix (Bugfix versiooni muutmine)
Maven release (Uue väljaande loomine)
Projekti ekraanipilt:

Üldised seadistused
Kõigis ülesannetes tuleb märkida kast "Clean build: Kustuta kõik failid checkout kataloogist enne ehitust", et vältida vigu.
Loo ainus VCS. VCS'i eripära on tähistatud punasega.

Tavaliselt kasutatakse VCS'i HTTPS skeemi. Siin Branch specification: on määratud vaatama kõiki harusid ja kõiki silte:
+:refs/heads/*
+:refs/tags/*On vajalik luua 4 Konfiguratsiooni Parameetrit.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
Parameetri value BRANCH_FOR_INCREMENT ja TAG_FROM_VERSION peab olema tühi.

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

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

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

Maven release
Ülesandes Maven release 2 sammu. Esimene samm kontrollib, kas haru on master. Kui haru ei ole master, siis ülesanne ebaõnnestub.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Haru ei ole master';
echo 'Katkestamine';
exit 1;
fi
Teine samm on standardne mvn release:prepare valiku --batch-mode

Create branch for release
Hotfix'i loomiseks väljaande jaoks tuleb luua haru. Sellega tegeleb ülesanne Create branch for release. Sellel on 2 sammu.
Esimene samm kontrollib, et haru ei ole 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 "Hangi versioon paketist 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 "Kontrolli SNAPSHOT"
if [[ $version == "*SNAPSHOT*" ]]; then
echo "******************* HOIATUS *************************"
echo "************ Sa lood haru SNAPSHOTS jaoks ******************"
echo "***********************************************************"
exit 1
fi
Teine samm muudab developerConnection'i ühenduse skeemi HTTPS'ist 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
Maven increment bugfix
Ülesanne koosneb 6 osast. Seda oleks saanud refaktoreerida, kuid töötab ka nii.
Esimene samm — kontrollida, et haru ei ole master. Kui haru on master ülesanne ebaõnnestub.
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 "Hangi versioon paketist 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)"`
# Peame tegema checkout vajalikku haru.
# Vastasel juhul git status näitab detached vajalikult haru.
# Peab olema, et git status näitab lihtsalt haru
git checkout $BRANCH
# Ekspordi bash muutuja Teamcity muutujasse, et edasise kasutamise tarbeks.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"
Teine Maven samm bugfix versiooni muutmine failis pom.xml.
Eesmärgid: maven'il kõik ühel real
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
Kolmas samm — väljasta Git status ja teised:
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'i ühenduse skeemi HTTPS'ist GIT'iks.
Ja edastab muudatused harule, mida on määratletud 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 hangib failist pom.xml versiooni ja seab selle Teamcity muutuja TAG_FROM_VERSION. Pane tähele, et versioon failist pom.xml on ilma v-täheta ees. Ja silt selle versiooni põhjal on juba v-tähega ees.
echo "Hangi versioon paketist 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']"
Kuues samm — sildistamine bugfix versioon. Seda tehakse Maven töötava valikuga Eesmärk.
Valik Goals:
-Dtag=%TAG_FROM_VERSION% scm:tag
Allikas: habr.com
