Automatisering av HotFix i Maven-projekt med TeamCity
Det här inlägget kommer att beskriva hur du ställer in HotFix-automatisering i Maven-projekt med Teamcity.
För att göra HotFix görs vanligtvis många manuella steg:
Skapa en brunch för releasen du vill rulla ut HotFix till
Fixa en bugg i release
Ändra bugfixversionen i releasegrenen
Rulla ut versionstaggen för bugfix
Punkterna 1,3,4 kan automatiseras.
Innan vi går vidare till ämnet skulle jag vilja beröra ett viktigt och komplext ämne - versionshantering programvara. Du kan kortfattat förstå Semver i den här skärmdumpen.
I Trunk-Based Development måste du skapa din egen filial för varje release. Alla ändringar (snabbkorrigeringar) inom den här utgåvan är förpliktade till denna gren.
Som en del av det här inlägget kommer vi att automatisera följande saker:
Teamcity server och agent. Du kan höja din lokala Teamcity-server och agent med hjälp av docker-compose
Där du har Teamcity-agent måste java, maven, git installeras
Låt oss skapa projektet "Automation Maven Hotfix" i Teamcity och skapa 4 uppgifter där.
CI Bygg
Skapa filial för release
Maven inkrementera bugfix (Ändra bugfixversion))
Maven release (Skapar en ny release)
Projektets skärmdump:
Allmänna inställningar
I alla uppgifter måste du markera rutan "Ren bygg: Ta bort alla filer i kassakatalogen före bygget", för utan den här kryssrutan fick jag fel.
Vi skapar en enda VCS. VCS-funktioner är inringade i rött.
Vanligtvis använder VCS:er HTTPS-schemat. I Branschspecifikation: indikerad att titta på alla bruncher och alla taggar:
+:refs/heads/*
+:refs/tags/*
Det är nödvändigt att skapa 4 konfigurationsparametrar.
BRANCH_FOR_INCREMENT
TAG_FROM_VERSION
TEAM_USER
TEAM_USER_EMAIL
Värdefältet i BRANCH_FOR_INCREMENT och TAG_FROM_VERSION måste lämnas tomt.
Du måste ladda upp/lägga till en privat nyckel. Alla uppgifter utom CI Build kräver en privat nyckel.
I varje uppgift, förutom CI Build, i avsnittet Byggfunktioner måste du ansluta en privat nyckel.
Exempel för Maven släpper
CI Build**.
I en uppgift CI Bygg bara ett steg mvn rent test
Maven släpper
I en uppgift Maven släpper 2 steg. Det första steget är att kontrollera att brunch är Master. Om brunch inte är det Master, då faller uppgiften.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
Det andra steget är standard mvn release: förbereda med option --batch-läge
Skapa filial för release
För att skapa en snabbkorrigering för en version måste du skapa en filial. Detta är vad taskan gör Skapa filial för release. Hon har 2 steg.
Det första steget kontrollerar att brunch inte är det Master, och den andra kontrollerar att versionen finns i filen pom.xml innehöll inte ordet STILLBILD
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
Det andra steget ändrar anslutningsschemat i developerConnection från HTTPS till 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 ökar buggfixen
Uppgiften består av 6 delar. Det kunde ha omfaktorts, men det fungerar fortfarande.
Det första steget är att kontrollera att brunchen inte är det Master. Om brunch Master uppgiften faller.
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']"
Det andra Maven-steget är att ändra bugfixversionen i filen pom.xml.
Det fjärde steget ändrar anslutningsschemat i developerConnection från HTTPS till GIT.
Och skjuter ändringar till grenen specificerad i Teamcity av variabeln %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%
Det femte steget är att hämta från filen pom.xml version och installerar den i Teamcity variabel TAG_FROM_VERSION. Observera att versionen från filen pom.xml utan bokstaven v framför. Och taggen, baserat på den här versionen, har redan bokstaven v i början.
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']"
Sjätte steget - taggning buggfix versioner. Detta görs med hjälp av Maven med önskat alternativ i Mål.