HotFix d'automatisation dans les projets Maven utilisant TeamCity

Cet article décrira comment configurer l'automatisation HotFix dans les projets Maven à l'aide de Teamcity.


Pour faire HotFix, de nombreuses actions manuelles sont généralement effectuées:


  1. Créez un brunch pour la version sur laquelle vous souhaitez utiliser HotFix
  2. Correction d'un bug de libération
  3. Changer la version du correctif dans le brunch de la version
  4. Déployer la version de correction de bug

Les articles 1, 3, 4 peuvent être automatisés.


Avant de passer au sujet, je voudrais aborder un sujet important et complexe - le logiciel de versioning . Brièvement sur Semver peut être compris dans cette capture d'écran.


Vous pouvez en savoir plus sur le lien: 1 .


Tous les paramètres décrits dans cet article sont basés sur Semver et Trunk-Based Development .


Dans le développement basé sur le tronc, pour chaque version, vous devez créer votre propre brunch. Toutes les modifications (correctif) de cette version sont validées pour ce brunch.


Dans le cadre de ce post, nous automatisons les choses suivantes:


  • Assemblage CI


  • Créer une nouvelle version


  • Créer un brunch pour la sortie


  • Changer la version du correctif




Prérequis:



Créons le projet "Automation Maven Hotfix" dans Teamcity et créons-y 4 tâches.


  • Construction CI (construction CI)


  • Créer une branche pour publication


  • Maven increment bugfix (Changer la version du correctif)


  • Version Maven (Création d'une nouvelle version)



Capture d'écran du projet:



Paramètres généraux


Dans toutes les tâches, il est nécessaire de cocher la case " Nettoyer la build: supprimer tous les fichiers du répertoire de checkout avant la build ", car lorsque ce daw manquait, j'ai eu des erreurs.


Créez un seul VCS. Caractéristiques VCS cerclées de rouge.



VCS utilise généralement le schéma HTTPS. Dans la spécification de branche: il est indiqué de regarder tous les brunchs et tous les tags:


+: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 de valeur dans BRANCH_FOR_INCREMENT et TAG_FROM_VERSION doit être laissé vide.



Vous devez télécharger / ajouter une clé privée. Toutes les tâches à l'exception de CI Build nécessitent une clé privée.



Dans chaque tâche à l'exception de CI Build, dans la section Build Features, vous devez connecter une clé privée.


Exemple pour la version Maven



Construction CI **.


Dans la tâche CI Build , un test de nettoyage mvn en une seule étape



Sortie de Maven


La version Maven comporte 2 étapes. La première étape consiste à vérifier que le brunch est maître . Si le brunch n'est pas maître , la tâche tombe.


 BRANCH=$(git branch | grep \* | cut -d ' ' -f2) echo "$BRANCH" if [[ "$BRANCH" != "master" ]]; then echo 'Branch is not master'; echo 'Aborting'; exit 1; fi 


La deuxième étape est la version mvn standard : préparez-vous avec l'option --batch-mode



Créer une branche pour publication


Pour créer un correctif pour la libération, vous devez créer un brunch. Cela se fait par Créer une branche pour la tâche de publication . Elle a 2 étapes.


La première étape vérifie que le brunch n'est pas maître et la seconde vérifie que la version du fichier pom.xml ne contient pas le mot SNAPSHOT


 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 "******************* WARNING *************************" echo "************ You are create branch for SNAPSHOTS ******************" echo "***********************************************************" exit 1 fi 


La deuxième étape change le schéma de connectivité de developerConnection 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 


Maven increment bugfix


La tâche se compose de 6 parties. Il pourrait être refactorisé, mais cela fonctionne comme ça.


La première étape consiste à vérifier que le brunch n'est pas maître . Si la tâche principale du brunch tombe.


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


La deuxième étape Maven consiste à modifier la version du correctif dans le fichier pom.xml.


Objectifs: maven a tout en une seule ligne


 build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit 


La troisième étape consiste à afficher les informations d'état Git et 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 change le schéma de connectivité de developerConnection de HTTPS à GIT.


Et envoie les modifications à la branche spécifiée dans 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 la version du fichier pom.xml et définit la variable TAG_FROM_VERSION sur Teamcity . Notez que la version du fichier pom.xml sans la lettre v est devant. Et le tag, basé sur cette version déjà avec la lettre v au début.


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


La sixième étape consiste à baliser la version du correctif . Cela se fait en utilisant Maven avec l'option souhaitée dans Goal .


Option de buts :


 -Dtag=%TAG_FROM_VERSION% scm:tag 

Source: https://habr.com/ru/post/fr483242/


All Articles