Automatizarea HotFix-urilor în proiectele Maven folosind TeamCity
Această postare va descrie configurarea automatizării HotFix în proiectele Maven folosind Teamcity.
Pentru a face HotFix, se fac de obicei o mulțime de pași manuali:
Creați un brunch pentru versiunea pentru care doriți să lansați HotFix
Remediați o eroare în lansare
Schimbați versiunea de remediere a erorilor în ramura de lansare
Lansați eticheta versiunii de remediere a erorilor
Punctele 1,3,4 pot fi automatizate.
Înainte de a trece la subiect, aș dori să abordez un subiect important și complex - versiunea software. Puteți înțelege pe scurt Semver în această captură de ecran.
În dezvoltarea bazată pe trunchi, trebuie să vă creați propria ramură pentru fiecare lansare. Toate modificările (remedieri rapide) din această ediție sunt efectuate în această ramură.
Ca parte a acestei postări, vom automatiza următoarele lucruri:
Server și agent Teamcity. Puteți crește serverul și agentul local Teamcity folosind Docker-scriere
Acolo unde aveți Teamcity agent, trebuie să fie instalat java, maven, git
Să creăm proiectul „Automation Maven Hotfix” în Teamcity și să creăm 4 sarcini acolo.
CI Build
Creați ramură pentru lansare
Remediere de erori Maven increment (Schimbați versiunea de remediere a erorilor))
Versiunea Maven (crearea unei noi versiuni)
Captură de ecran a proiectului:
Setări generale
În toate sarcinile trebuie să bifați caseta "Curățare construcție: ștergeți toate fișierele din directorul de finalizare înainte de compilare„, deoarece fără această casetă de selectare am primit erori.
Creăm un singur VCS. Caracteristicile VCS sunt încercuite cu roșu.
De obicei, VCS-urile folosesc schema HTTPS. ÎN Specificații de ramură: indicat să urmăriți toate brunchurile și toate etichetele:
+:refs/heads/*
+:refs/tags/*
Este necesar să creați 4 parametri de configurare.
BRANCH_FOR_INCREMENT
TAG_FROM_VERSION
TEAM_USER
TEAM_USER_EMAIL
Câmpul de valoare din BRANCH_FOR_INCREMENT și TAG_FROM_VERSION trebuie lăsat gol.
Trebuie să încărcați/adăugați o cheie privată. Toate sarcinile, cu excepția CI Build, necesită o cheie privată.
În fiecare sarcină, cu excepția CI Build, în secțiunea Build Features trebuie să conectați o cheie privată.
Exemplu pentru Eliberarea Maven
CI Build**.
Într-o sarcină CI Build doar un pas mvn clean test
Eliberarea Maven
Într-o sarcină Eliberarea Maven 2 pași. Primul pas este să verifici dacă brunch-ul este maestru. Dacă brunch-ul nu este maestru, atunci sarcina cade.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
Al doilea pas este standard mvn release:prepare cu optiune --mod-loc
Creați ramură pentru lansare
Pentru a crea o remediere rapidă pentru o versiune, trebuie să creați o ramură. Asta face Taska Creați ramură pentru lansare. Are 2 trepte.
Primul pas verifică dacă brunch-ul nu este maestru, iar al doilea verifică dacă versiunea este în fișier pom.xml nu conținea cuvântul INSTANTANEU
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
Al doilea pas modifică schema de conectare în developerConnection de la HTTPS la 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
Remedierea erorilor de increment Maven
Sarcina constă din 6 părți. Ar fi putut fi refactorizat, dar încă funcționează.
Primul pas este să verifici dacă brunch-ul nu este maestru. Dacă brunch maestru sarcina cade.
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']"
Al doilea pas Maven este schimbarea versiunii de remediere a erorilor din fișierul pom.xml.
Al patrulea pas modifică schema de conectare în developerConnection de la HTTPS la GIT.
Și împinge modificări la ramura specificată în Teamcity de variabila %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%
Al cincilea pas este obținerea din fișier pom.xml versiune și o instalează în Teamcity variabil TAG_FROM_VERSION. Rețineți că versiunea din fișier pom.xml fără litera v în față. Iar eticheta, bazată pe această versiune, are deja litera v la început.
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']"
Al șaselea pas - etichetarea rezolvarea unei erori versiuni. Acest lucru se face folosind Maven cu opțiunea necesară în Scop.