ProHoster > Blog > Bestjoer > Automatisearring fan HotFix yn Maven-projekten mei TeamCity
Automatisearring fan HotFix yn Maven-projekten mei TeamCity
Dizze post sil it ynstellen fan HotFix-automatisearring beskriuwe yn Maven-projekten mei Teamcity.
Om HotFix te dwaan, wurde normaal in protte hânmjittige stappen dien:
Meitsje in brunch foar de release wêrop jo HotFix wolle útrolje
Reparearje in brek yn release
Feroarje de bugfix ferzje yn 'e release branch
Rôlje út bugfix ferzje tag
Пункты 1,3,4 можно автоматизировать.
Foardat wy nei it ûnderwerp gean, wol ik graach in wichtich en kompleks ûnderwerp oanreitsje - ferzje software. Jo kinne Semver koart begripe yn dizze skermôfbylding.
Yn Trunk-Based Development moatte jo jo eigen branch meitsje foar elke release. Alle wizigingen (hotfixes) binnen dizze útjefte binne ynsette foar dizze branch.
As ûnderdiel fan dizze post sille wy de folgjende dingen automatisearje:
Teamcity tsjinner en agent. Jo kinne jo lokale Teamcity-tsjinner en -agent ferheegje mei docker-komponearje
Wêr't jo Teamcity-agent hawwe, java, maven, git moat ynstalleare wurde
Litte wy it projekt "Automation Maven Hotfix" oanmeitsje yn Teamcity en dêr 4 taken oanmeitsje.
CI Bouwe
Meitsje branch foar frijlitting
Maven increment bugfix (feroarje bugfix ferzje))
Maven release (in nije release oanmeitsje)
Projekt skermôfbylding:
Algemiene ynstellings
Во всех тасках необходимо выставить галку «Clean build: wiskje alle bestannen yn 'e kassamap foar it bouwen“, want sûnder dit karfakje krige ik flaters.
Wy meitsje in inkele VCS. VCS-funksjes wurde yn read rûn.
Typysk brûke VCS's it HTTPS-skema. YN Branch spesifikaasje: oanjûn om alle brunches en alle tags te besjen:
+:refs/heads/*
+:refs/tags/*
It is nedich om 4 konfiguraasjeparameters te meitsjen.
BRANCH_FOR_INCREMENT
TAG_FROM_VERSION
TEAM_USER
TEAM_USER_EMAIL
It weardefjild yn BRANCH_FOR_INCREMENT en TAG_FROM_VERSION moat leech bliuwe.
Необходимо закачать/добавить приватный ключ. Во всех тасках кроме CI Build необходим приватный ключ.
Yn elke taak, útsein CI Build, yn 'e Build Features seksje moatte jo in privee kaai ferbine.
Foarbyld foar Maven release
CI Build**.
Yn in taak CI Bouwe mar ien stap mvn skjinne test
Maven release
Yn in taak Maven release 2 stappen. De earste stap is om te kontrolearjen dat brunch is master. As brunch is net master, dan falt 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
De twadde stap is standert mvn release: tariede mei opsje --batch-modus
Meitsje branch foar frijlitting
Foar in meitsje in hotfix foar in release jo moatte meitsje in tûke. Dit is wat de taak docht Meitsje branch foar frijlitting. Se hat 2 stappen.
De earste stap kontrolearret dat brunch net is master, en de twadde kontrolearret dat de ferzje yn it bestân is pom.xml it wurd net befette SNAPSHOT
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 "******************* W A R N I N G *************************"
echo "************ You are create branch for SNAPSHOTS ******************"
echo "***********************************************************"
exit 1
fi
De twadde stap feroaret it ferbiningskema yn developerConnection fan HTTPS nei 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 fergruttet bugfix
De taak bestiet út 6 dielen. It koe wurde refactored, mar it wurket noch.
De earste stap is om te kontrolearjen dat de brunch net is master. As brunch master de taak falt.
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']"
De twadde Maven-stap is it feroarjen fan de bugfix-ferzje yn it pom.xml-bestân.
De fjirde stap feroaret it ferbiningskema yn developerConnection fan HTTPS nei GIT.
En triuwt feroarings oan 'e branch spesifisearre yn Teamcity troch de %BRANCH_FOR_INCREMENT% fariabele
# Здесь получаем 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%
De fyfde stap is it krijen fan it bestân pom.xml ferzje en ynstallearret it yn Teamcity fariabele TAG_FROM_VERSION. Tink derom dat de ferzje fan it bestân pom.xml sûnder de letter v foaryn. En de tag, basearre op dizze ferzje, hat al de letter v oan it begjin.
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']"
Seisde stap - tagging bugfix версии. Делается это с помощью Maven с нужной опцией в Doelpunt.