Automatizimi i HotFix në projektet Maven duke përdorur TeamCity
Ky postim do të përshkruajë vendosjen e automatizimit HotFix në projektet Maven duke përdorur Teamcity.
Për të bërë HotFix, zakonisht bëhen shumë hapa manualë:
Krijo një brunch për versionin ku dëshiron të lëshosh HotFix
Rregulloni një defekt në lëshim
Ndryshoni versionin e korrigjimit të gabimeve në degën e lëshimit
Hap etiketën e versionit të korrigjimit të gabimeve
Pikat 1,3,4 mund të automatizohen.
Para se të kalojmë në temë, do të doja të prekja një temë të rëndësishme dhe komplekse - versionimi software. Ju mund ta kuptoni shkurtimisht Semver në këtë pamje të ekranit.
Në Zhvillimin e Bazuar në Trunk, ju duhet të krijoni degën tuaj për çdo version. Të gjitha ndryshimet (rregullimet e shpejta) brenda këtij versioni janë kryer në këtë degë.
Si pjesë e këtij postimi, ne do të automatizojmë gjërat e mëposhtme:
Serveri dhe agjenti i Teamcity. Ju mund të ngrini serverin dhe agjentin tuaj lokal të Teamcity duke përdorur Docker-Shkruaj
Aty ku keni agjent Teamcity, duhet të instalohet java, maven, git
Le të krijojmë projektin "Automation Maven Hotfix" në Teamcity dhe të krijojmë 4 detyra atje.
Ndërtimi CI
Krijo degë për lirim
Rregullimi i gabimeve në rritje të Maven (Ndrysho versionin e rregullimit të gabimeve))
Publikimi i Maven (Krijimi i një versioni të ri)
Pamja e ekranit të projektit:
Cilësimet e përgjithshme
Në të gjitha detyrat duhet të kontrolloni kutinë "Ndërtimi i pastër: Fshini të gjithë skedarët në drejtorinë e arkës përpara ndërtimit“, sepse pa këtë kuti kontrolli kam pasur gabime.
Ne krijojmë një VCS të vetme. Karakteristikat e VCS janë të rrethuara me të kuqe.
Në mënyrë tipike VCS përdorin skemën HTTPS. NË Specifikimi i degës: tregohet për të parë të gjitha mëngjeset dhe të gjitha etiketat:
+:refs/heads/*
+:refs/tags/*
Është e nevojshme të krijohen 4 parametra të konfigurimit.
BRANCH_FOR_INCREMENT
TAG_FROM_VERSION
TEAM_USER
TEAM_USER_EMAIL
Fusha e vlerës në BRANCH_FOR_INCREMENT dhe TAG_FROM_VERSION duhet të lihet bosh.
Duhet të ngarkoni/shtoni një çelës privat. Të gjitha detyrat përveç CI Build kërkojnë një çelës privat.
Në secilën detyrë, me përjashtim të CI Build, në seksionin Build Features ju duhet të lidhni një çelës privat.
Shembull për Lirimi i Maven
Ndërtimi CI**.
Në një detyrë Ndërtimi CI vetëm një hap test i pastër mvn
Lirimi i Maven
Në një detyrë Lirimi i Maven 2 hapa. Hapi i parë është të kontrolloni se çfarë brunch është mjeshtër. Nëse brunch nuk është mjeshtër, atëherë detyra bie.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
Hapi i dytë është standard lëshimi i mvn: përgatit me opsion ---modaliteti i grupit
Krijo degë për lirim
Për të krijuar një rregullim të drejtpërdrejtë për një version, duhet të krijoni një degë. Kjo është ajo që bën detyra Krijo degë për lirim. Ajo ka 2 hapa.
Hapi i parë kontrollon që brunch nuk është mjeshtër, dhe e dyta kontrollon që versioni është në skedar pom.xml nuk e përmbante fjalën FOTO
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
Hapi i dytë ndryshon skemën e lidhjes në developerConnection nga HTTPS në 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
Rregullimi i gabimeve në rritje të Maven
Detyra përbëhet nga 6 pjesë. Mund të ishte rifaktoruar, por ende funksionon.
Hapi i parë është të kontrolloni që brunch nuk është mjeshtër. Nëse mëngjes i vonë mjeshtër detyra bie.
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']"
Hapi i dytë i Maven është ndryshimi i versionit të korrigjimit të gabimeve në skedarin pom.xml.
Hapi i katërt ndryshon skemën e lidhjes në developerConnection nga HTTPS në GIT.
Dhe shtyn ndryshime në degën e specifikuar në Teamcity nga ndryshorja %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%
Hapi i pestë është marrja nga skedari pom.xml version dhe e instalon atë në Teamcity e ndryshueshme TAG_FROM_VERSION. Vini re se versioni nga skedari pom.xml pa shkronjën v përpara. Dhe etiketa, bazuar në këtë version, ka tashmë shkronjën v në fillim.
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']"
Hapi i gjashtë - etiketimi bugfix versionet. Kjo bëhet duke përdorur Maven me opsionin e kërkuar në Caku.