Automatisation de HotFix dans les projets Maven avec TeamCity

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 :

  1. Créer une branche pour la version sur laquelle vous souhaitez déployer le HotFix
  2. Corriger l'erreur dans la version
  3. Modifier la version de correction de bug dans la branche de la version
  4. 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. Automatisation de HotFix dans les projets Maven avec TeamCity

Vous pouvez lire plus en suivant ce lien : 1.

Tous les réglages décrits dans cet article reposent sur Semver et Développement basé sur le Trunk.

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

Automatisation de HotFix dans les projets Maven avec TeamCity

Exigences :

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 :

Automatisation de HotFix dans les projets Maven avec TeamCity

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.

Automatisation de HotFix dans les projets Maven avec TeamCity

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.

Automatisation de HotFix dans les projets Maven avec TeamCity

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.

Automatisation de HotFix dans les projets Maven avec TeamCity

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

Automatisation de HotFix dans les projets Maven avec TeamCity

CI Build**.

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

Automatisation de HotFix dans les projets Maven avec TeamCity

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

Automatisation de HotFix dans les projets Maven avec TeamCity

La deuxième étape est standard mvn release:prepare avec l'option —mode par lot

Automatisation de HotFix dans les projets Maven avec TeamCity

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

Automatisation de HotFix dans les projets Maven avec TeamCity

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

Automatisation de HotFix dans les projets Maven avec TeamCity

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']"

Automatisation de HotFix dans les projets Maven avec TeamCity

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

Automatisation de HotFix dans les projets Maven avec TeamCity

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

Automatisation de HotFix dans les projets Maven avec TeamCity

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%

Automatisation de HotFix dans les projets Maven avec TeamCity

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']"

Automatisation de HotFix dans les projets Maven avec TeamCity

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

Automatisation de HotFix dans les projets Maven avec TeamCity

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster