ProHoster > Blog > uprava > Automatizacija HotFixa u Maven projektima pomoću TeamCityja
Automatizacija HotFixa u Maven projektima pomoću TeamCityja
Ovaj će post opisati postavljanje HotFix automatizacije u Maven projektima pomoću Teamcityja.
Da biste izvršili HotFix, obično se poduzimaju mnogi ručni koraci:
Stvorite užinu za izdanje na koje želite uvesti HotFix
Ispravite grešku u izdanju
Promijenite verziju ispravka pogrešaka u grani izdanja
Uvedite oznaku verzije ispravka programske pogreške
Točke 1,3,4 mogu se automatizirati.
Prije nego što prijeđemo na temu, želio bih se dotaknuti jedne važne i složene teme - verziranje softver. Na ovoj snimci zaslona možete ukratko razumjeti Semvera.
Teamcity server i agent. Možete podići svoj lokalni Teamcity server i agent koristeći doker-nove poruke
Gdje imate Teamcity agenta, mora biti instalirana java, maven, git
Kreirajmo projekt "Automation Maven Hotfix" u Teamcityju i tamo stvorimo 4 zadatka.
CI Build
Stvorite granu za izdanje
Maven povećanje ispravka programske pogreške (promjena verzije ispravka programske pogreške))
Maven izdanje (stvaranje novog izdanja)
Snimka zaslona projekta:
Opće postavke
U svim zadacima morate označiti kućicu "Čista izrada: Izbrišite sve datoteke u direktoriju za naplatu prije izrade“, jer bez ovog potvrdnog okvira dobivam pogreške.
Stvaramo jedan VCS. Značajke VCS-a zaokružene su crvenom bojom.
Obično VCS-ovi koriste HTTPS shemu. U Specifikacija grane: označeno za gledanje svih užina i svih oznaka:
+:refs/heads/*
+:refs/tags/*
Potrebno je kreirati 4 konfiguracijska parametra.
GRANKA_ZA_POVEĆANJE
TAG_FROM_VERSION
TEAM_USER
TEAM_USER_EMAIL
Polje vrijednosti u BRANCH_FOR_INCREMENT i TAG_FROM_VERSION mora ostati prazno.
Morate prenijeti/dodati privatni ključ. Svi zadaci osim CI Build zahtijevaju privatni ključ.
U svakom zadatku, osim CI Build-a, u odjeljku Build Features potrebno je povezati privatni ključ.
Primjer za Mavenovo izdanje
CI Build**.
U zadatku CI Build samo jedan korak mvn čisti test
Mavenovo izdanje
U zadatku Mavenovo izdanje 2 koraka. Prvi korak je provjera je li užina majstor. Ako marenda nije majstor, onda zadatak pada.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
Drugi korak je standardan mvn otpuštanje:priprema s opcijom --batch-mode
Stvorite granu za izdanje
Za izradu hitnog popravka za izdanje morate stvoriti granu. To je ono što taska radi Stvorite granu za izdanje. Ona ima 2 koraka.
Prvi korak provjerava da marenda nije majstor, a drugi provjerava je li verzija u datoteci pom.xml nije sadržavao riječ SNIMAK
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
Drugi korak mijenja shemu povezivanja u developerConnection iz HTTPS u 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
Mavenov popravak bugova
Zadatak se sastoji od 6 dijelova. Moglo se refaktorirati, ali još uvijek radi.
Prvi korak je provjeriti da marenda nije majstor. Ako marenda majstor zadatak pada.
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']"
Drugi Maven korak je promjena verzije ispravka grešaka u datoteci pom.xml.
Četvrti korak mijenja shemu veze u developerConnection iz HTTPS u GIT.
I gura promjene u granu navedenu u Teamcityju pomoću varijable %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%
Peti korak je dobivanje iz datoteke pom.xml verziju i instalira je u Teamcity varijabla TAG_FROM_VERSION. Imajte na umu da je verzija iz datoteke pom.xml bez slova v ispred. A oznaka, temeljena na ovoj verziji, već ima slovo v na početku.
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']"
Šesti korak - označavanje Bugfix verzije. To se radi pomoću Maven sa traženom opcijom u Cilj.