Cet article décrira la configuration de l'automatisation HotFix dans les projets Maven à l'aide de Teamcity.
Pour réaliser un HotFix, il y a généralement beaucoup d'actions manuelles à effectuer :
- Créer une branche pour la version sur laquelle vous souhaitez déployer le HotFix
- Corriger l'erreur dans la version
- Modifier la version de correction de bug dans la branche de la version
- Déployer l'étiquette de la version de correction de bug
Les points 1, 3 et 4 peuvent être automatisés.
Avant de plonger dans le sujet, il est important de toucher à un point crucial et complexe — versionning les logiciels. Un aperçu de la Semver peut être trouvé sur cette capture d'écran. 
Vous pouvez lire plus en suivant ce lien : .
Tous les réglages décrits dans cet article reposent sur et .
Dans le Développement basé sur le Trunk, pour chaque version, une branche doit être créée. Tous les changements (hotfix) dans cette version sont committés dans cette branche.
Dans cet article, nous allons automatiser les éléments suivants :
CI Build
Créer une nouvelle version
Créer une branche pour la version
Modifier la version de correction de bug

Exigences :
- Dépôt Git pour stocker votre code. Dans cet article, le dépôt utilisé sera .
- Serveur et agent Teamcity. Vous pouvez configurer votre propre serveur Teamcity local et agent avec
- Là où vous avez l'agent Teamcity, Java, Maven et Git doivent être installés.
Créons dans Teamcity le projet « Automation Maven Hotfix » et y ajoutons 4 tâches.
CI Build
Créer une branche pour la version
Maven incrémenter la version de correction de bug
Maven release
Capture d'écran du projet :

Réglages généraux
Dans toutes les tâches, il est nécessaire de cocher la case «Clean build: Supprimer tous les fichiers dans le répertoire de checkout avant la compilation», car sans cette case cochée, des erreurs apparaissaient.
Créons un seul VCS. Les particularités du VCS sont entourées en rouge.

Normalement, le VCS utilise le schéma HTTPS. Dans Spécification de la Branche : il est indiqué de regarder toutes les branches et toutes les étiquettes :
+:refs/heads/*
+:refs/tags/*Il est nécessaire de créer 4 paramètres de configuration.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
Le champ value dans BRANCH_FOR_INCREMENT et TAG_FROM_VERSION doit rester vide.

Il est nécessaire de télécharger/ajouter une clé privée. Dans toutes les tâches sauf CI Build, la clé privée est nécessaire.

Dans chaque tâche, sauf CI Build, dans la section des fonctionnalités de construction, vous devez connecter la clé privée.
Exemple pour Maven release

CI Build**.
Dans la tâche CI Build il n'y a qu'un seul pas mvn clean test

Maven release
Dans la tâche Maven release 2 étapes. La première étape vérifie que la branche est master. Si la branche n'est pas master, la tâche échoue.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'La branche n'est pas master';
echo 'Abandon';
exit 1;
fi
La deuxième étape est standard mvn release:prepare avec l'option —mode par lot

Créer une branche pour la version
Pour créer un hotfix pour la version, il est nécessaire de créer une branche. Cela est géré par la tâche Créer une branche pour la version. Elle comporte 2 étapes.
La première étape vérifie que la branche n'est pas master, et la seconde vérifie que la version dans le fichier pom.xml ne contient pas le mot SNAPSHOT
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'La branche est master';
echo 'Abandon';
exit 1;
fi
echo "Obtenir la version du package à partir de 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 "Vérifier SNAPSHOT"
if [[ $version == "*SNAPSHOT*" ]]; then
echo "******************* A V I S *************************"
echo "************ Vous créez une branche pour les SNAPSHOTS ******************"
echo "***********************************************************"
exit 1
fi
La deuxième étape modifie dans developerConnection le schéma de connexion de HTTPS à 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
Correction de bug Maven
La tâche consiste en 6 parties. Il aurait été possible de la refactoriser, mais elle fonctionne comme ça.
La première étape consiste à vérifier que la branche n'est pas master. Si la branche master la tâche échoue.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" == "master" ]]; then
echo 'La branche est master';
echo 'Abandon';
exit 1;
fi
# Ici, nous obtenons la version à partir du fichier pom.xml
echo "Obtenir la version du package à partir de 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)"`
# Nous devons faire un checkout de la branche appropriée.
# Sinon, git status affiche détaché par rapport à la branche souhaitée.
# Il faut que git status affiche simplement la branche
git checkout $BRANCH
# Exporte la variable bash dans la variable Teamcity pour une utilisation ultérieure.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"
La deuxième étape Maven modifie la version bugfix dans le fichier pom.xml.
Objectifs : maven tout en une ligne
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
La troisième étape consiste à afficher des informations sur l'état de Git et d'autres :
echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch
La quatrième étape modifie dans developerConnection le schéma de connexion de HTTPS à GIT.
Et pousse les modifications dans la branche indiquée par la variable Teamcity %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%
La cinquième étape obtient à partir du fichier pom.xml la version et la définit à Teamcity variable TAG_FROM_VERSION. Notez que la version du fichier pom.xml sans la lettre v devant. Et le tag, basé sur cette version, commence déjà par la lettre v.
echo "Obtenir la version du package à partir de 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']"
La sixième étape consiste à taguer bugfix la version. Cela se fait avec l'option Maven avec l'option appropriée dans Objectif.
L'option Objectifs:
-Dtag=%TAG_FROM_VERSION% scm:tag
Source : habr.com
