Automazione HotFix nei progetti Maven utilizzando TeamCity

In questo post verrà descritta la configurazione dell'automazione HotFix nei progetti Maven utilizzando Teamcity.

Per creare un HotFix, di solito si effettuano molte operazioni manuali:

  1. Creare un branch per il rilascio su cui si desidera implementare l'HotFix
  2. Correggere l'errore nel rilascio
  3. Modificare la versione bugfix nel branch di rilascio
  4. Rilasciare il tag della versione bugfix

I punti 1, 3, e 4 possono essere automatizzati.

Prima di entrare nel tema, vorrei toccare un argomento importante e complesso — versioning software. Una breve spiegazione su Semver può essere compresa in questo screenshot. Automazione HotFix nei progetti Maven utilizzando TeamCity

Puoi leggere di più al link: 1.

Tutte le impostazioni descritte in questo post si basano su Semver e Trunk-Based Development.

Nel Trunk-Based Development, per ogni rilascio è necessario creare un proprio branch. Tutte le modifiche (hotfix) relative a questo rilascio vengono committate in questo branch.

In questo post automatizzeremo le seguenti operazioni:

  • CI build

  • Creazione di un nuovo rilascio

  • Creazione di un branch per il rilascio

  • Modifica della versione bugfix

Automazione HotFix nei progetti Maven utilizzando TeamCity

Requisiti:

Creeremo in Teamcity un progetto "Automation Maven Hotfix" e lì creeremo 4 task.

  • CI Build (CI build)

  • Create branch for release (Creazione di un branch per il rilascio)

  • Maven increment bugfix (Modifica della versione bugfix)

  • Maven release (Creazione di un nuovo rilascio)

Screenshot del progetto:

Automazione HotFix nei progetti Maven utilizzando TeamCity

Impostazioni generali

In tutti i task è necessario abilitare l'opzione "Clean build: Elimina tutti i file nella directory di checkout prima della build", poiché senza questa opzione avevo errori.

Creiamo un'unica VCS. Le caratteristiche della VCS sono evidenziate in rosso.

Automazione HotFix nei progetti Maven utilizzando TeamCity

Di solito la VCS utilizza lo schema HTTPS. In Branch specification: è specificato di guardare tutti i branch e tutti i tag:

+:refs/heads/*
+:refs/tags/*

È necessario creare 4 Configuration Parameters.

  • BRANCH_FOR_INCREMENT
  • TAG_FROM_VERSION
  • TEAM_USER
  • TEAM_USER_EMAIL

Il campo value in BRANCH_FOR_INCREMENT e TAG_FROM_VERSION deve rimanere vuoto.

Automazione HotFix nei progetti Maven utilizzando TeamCity

Devi caricare/aggiungere una chiave privata. In tutti i task tranne CI Build è necessaria la chiave privata.

Automazione HotFix nei progetti Maven utilizzando TeamCity

In ogni task tranne CI Build, nella sezione Build Features, è necessario collegare la chiave privata.

Esempio per Maven release

Automazione HotFix nei progetti Maven utilizzando TeamCity

CI Build.

Nel task CI Build c'è solo un passo mvn clean test

Automazione HotFix nei progetti Maven utilizzando TeamCity

Maven release

Nel task Maven release 2 passi. Il primo passo verifica che il branch sia master. Se il branch non è master, il task fallisce.

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

Automazione HotFix nei progetti Maven utilizzando TeamCity

Il secondo passo è il standard mvn release:prepare con l'opzione --batch-mode

Automazione HotFix nei progetti Maven utilizzando TeamCity

Create branch for release

Per creare un hotfix per il rilascio, è necessario creare un branch. Questo è gestito dal task Create branch for release. Ha 2 passi.

Il primo passo verifica che il branch non sia master, e il secondo verifica che nella versione nel file pom.xml non contenga la parola 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 "******************* AV V I S O *************************"
    echo "************ Stai creando un branch per SNAPSHOTS ******************"
    echo "***********************************************************"
    exit 1
fi

Automazione HotFix nei progetti Maven utilizzando TeamCity

Il secondo passo modifica nello developerConnection lo schema di connessione da 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

Automazione HotFix nei progetti Maven utilizzando TeamCity

Maven increment bugfix

Il task consiste di 6 parti. Si poteva rifattorizzare, ma funziona così.

Il primo passo — verifica che il branch non sia master. Se il branch master il task fallisce.

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

# Qui otteniamo la versione dal file 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)"`
# Dobbiamo fare checkout sul branch desiderato.
# Altrimenti git status mostra detached sul branch desiderato.
# Serve che git status mostri solo il branch
git checkout $BRANCH
# Esportiamo la variabile bash in una variabile Teamcity per usi futuri.
echo "##teamcity[setParameter name='BRANCH_FOR_INCREMENT' value='$BRANCH']"

Automazione HotFix nei progetti Maven utilizzando TeamCity

Il secondo passo di Maven modifica la versione bugfix nel file pom.xml.

Goals: in maven tutto in una riga

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

Automazione HotFix nei progetti Maven utilizzando TeamCity

Il terzo passo — output delle informazioni Git status e altro:

echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch

Automazione HotFix nei progetti Maven utilizzando TeamCity

Il quarto passo modifica nello developerConnection lo schema di connessione da HTTPS a GIT.

E push le modifiche nel branch specificato nella variabile 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%

Automazione HotFix nei progetti Maven utilizzando TeamCity

Il quinto passo ottiene dal file pom.xml la versione e la imposta in Teamcity variabile TAG_FROM_VERSION. Nota che la versione dal file pom.xml è senza la lettera v davanti. E il tag, basato su questa versione, inizia già con la lettera v.

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

Automazione HotFix nei progetti Maven utilizzando TeamCity

Il sesto passo — tagging bugfix della versione. Viene fatto utilizzando Maven con l'opzione necessaria in Goal.

Opzione Goals:

-Dtag=%TAG_FROM_VERSION% scm:tag

Automazione HotFix nei progetti Maven utilizzando TeamCity

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster