Automatització de HotFix en projectes Maven mitjançant TeamCity
Aquesta publicació descriurà la configuració de l'automatització HotFix en projectes Maven amb Teamcity.
Per fer HotFix, normalment es fan molts passos manuals:
Creeu un brunch per a la versió a la qual voleu implementar HotFix
Arreglar un error al llançament
Canvieu la versió de correcció d'errors a la branca de llançament
Desplegueu l'etiqueta de versió de correcció d'errors
Els punts 1,3,4 es poden automatitzar.
Abans de passar al tema, m'agradaria tocar un tema important i complex: versionar programari. Podeu entendre breument Semver en aquesta captura de pantalla.
Al desenvolupament basat en troncs, heu de crear la vostra pròpia branca per a cada llançament. Tots els canvis (correccions) d'aquesta versió estan compromesos amb aquesta branca.
Com a part d'aquesta publicació, automatitzarem les coses següents:
Servidor i agent de Teamcity. Podeu augmentar el vostre servidor i agent local de Teamcity fent servir docker-compose
Quan tingueu l'agent de Teamcity, cal instal·lar java, maven i git
Creem el projecte "Automation Maven Hotfix" a Teamcity i creem-hi 4 tasques.
Construcció CI
Crea una branca per al llançament
Correcció d'errors d'increment de Maven (Canviar la versió de correcció d'errors))
Versió de Maven (creació d'una versió nova)
Captura de pantalla del projecte:
Configuració general
En totes les tasques heu de marcar la casella "Construcció neta: suprimiu tots els fitxers del directori de pagament abans de la compilació", perquè sense aquesta casella de selecció he rebut errors.
Creem un únic VCS. Les característiques VCS estan encerclades en vermell.
Normalment, els VCS utilitzen l'esquema HTTPS. EN Especificació de la branca: indicat per veure tots els brunchs i totes les etiquetes:
+:refs/heads/*
+:refs/tags/*
Cal crear 4 paràmetres de configuració.
BRANCH_FOR_INCREMENT
TAG_FROM_VERSION
TEAM_USER
TEAM_USER_EMAIL
El camp de valor a BRANCH_FOR_INCREMENT i TAG_FROM_VERSION s'ha de deixar buit.
Heu de pujar/afegir una clau privada. Totes les tasques, excepte CI Build, requereixen una clau privada.
A cada tasca, excepte CI Build, a la secció Build Features cal connectar una clau privada.
Exemple per Alliberament de Maven
CI Build**.
En una tasca Construcció CI només un pas prova de neteja mvn
Alliberament de Maven
En una tasca Alliberament de Maven 2 passos. El primer pas és comprovar que el dinar és mestre. Si el brunch no ho és mestre, llavors la tasca cau.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
El segon pas és estàndard mvn release:preparar amb opció --mode per lots
Crea una branca per al llançament
Per crear una correcció ràpida per a una versió, heu de crear una branca. Això és el que fa la taska Crea una branca per al llançament. Té 2 passos.
El primer pas comprova que el brunch no ho sigui mestre, i el segon comprova que la versió estigui al fitxer pom.xml no contenia la paraula Instantània
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
El segon pas canvia l'esquema de connexió a developerConnection d'HTTPS a 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
Correcció d'errors d'increment de Maven
La tasca consta de 6 parts. Es podria haver refactoritzat, però encara funciona.
El primer pas és comprovar que el brunch no ho sigui mestre. Si brunch mestre la tasca cau.
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']"
El segon pas de Maven és canviar la versió de correcció d'errors al fitxer pom.xml.
El quart pas canvia l'esquema de connexió a developerConnection d'HTTPS a GIT.
I envia canvis a la branca especificada a Teamcity per la variable %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%
El cinquè pas és obtenir des del fitxer pom.xml versió i l'instal·la Teamcity variable TAG_FROM_VERSION. Tingueu en compte que la versió del fitxer pom.xml sense la lletra v al davant. I l'etiqueta, basada en aquesta versió, ja té la lletra v al principi.
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']"
Sisè pas: etiquetatge de correcció d'errors versions. Això es fa utilitzant Maven amb l'opció requerida a Objectiu.