Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Ovaj post će opisati postavljanje automatizacije HotFix-a u Maven projektima koristeći Teamcity.

Da biste izvršili HotFix, obično se radi mnogo ručnih koraka:

  1. Napravite marendu za izdanje za koje želite da uvedete HotFix
  2. Ispravite grešku u izdanju
  3. Promijenite verziju popravke grešaka u grani izdanja
  4. Ubacite oznaku verzije za popravku grešaka

Tačke 1,3,4 se mogu automatizirati.

Pre nego što pređemo na temu, želeo bih da se dotaknem jedne važne i složene teme - verzijama softver. Na ovom snimku ekrana možete ukratko razumjeti Semvera. Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Više možete pročitati na linku: 1.

Sve postavke opisane u ovom postu su zasnovane na Semver и Razvoj zasnovan na deblu.

U razvoju zasnovanom na deblu, morate kreirati vlastitu granu za svako izdanje. Sve promjene (hitne popravke) unutar ovog izdanja su predane ovoj grani.

Kao dio ovog posta, automatizirat ćemo sljedeće stvari:

  • CI build

  • Kreiranje novog izdanja

  • Kreiranje grane izdanja

  • Promjena verzije ispravke grešaka

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Uslovi:

Kreirajmo projekt "Automation Maven Hotfix" u Teamcityju i kreirajmo 4 zadatka tamo.

  • CI Build

  • Kreirajte granu za izdavanje

  • Maven increment bugfix (Promijeni verziju ispravke grešaka))

  • Maven izdanje (Kreiranje novog izdanja)

Snimak ekrana projekta:

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Opće postavke

U svim zadacima morate označiti kućicu "Čista izrada: Izbrišite sve datoteke u direktoriju preuzimanja prije izgradnje“, jer bez ovog checkbox-a dobijam greške.

Mi kreiramo jedan VCS. VCS karakteristike su zaokružene crvenom bojom.

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Obično VCS-ovi koriste HTTPS šemu. IN Specifikacija grane: naznačeno da gledate sve marende i sve oznake:

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

Potrebno je kreirati 4 konfiguraciona parametra.

  • BRANCH_FOR_INCREMENT
  • TAG_FROM_VERSION
  • TEAM_USER
  • TEAM_USER_EMAIL

Polje vrijednosti u BRANCH_FOR_INCREMENT i TAG_FROM_VERSION mora ostati prazno.

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Morate učitati/dodati privatni ključ. Svi zadaci osim CI Build-a zahtijevaju privatni ključ.

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

U svakom zadatku, osim CI Build-a, u odjeljku Build Features morate povezati privatni ključ.

Primjer za Maven izdanje

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

CI Build**.

U zadatku CI Build samo jedan korak mvn clean test

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Maven izdanje

U zadatku Maven izdanje 2 koraka. Prvi korak je provjera da je marenda majstor. Ako branč nije majstor, tada zadatak pada.

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

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Drugi korak je standardan mvn release:prepare sa opcijom --batch-mode

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Kreirajte granu za izdavanje

Da biste kreirali hitnu ispravku za izdanje, morate kreirati granu. To je ono što taska radi Kreirajte granu za izdavanje. Ona ima 2 koraka.

Prvi korak provjerava da marenda nije majstor, a drugi provjerava da li je verzija u datoteci pom.xml nije sadržavao tu riječ SNAPHOT

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

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Drugi korak mijenja šemu povezivanja u developerConnection iz HTTPS u 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

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Maven inkrement ispravka greške

Zadatak se sastoji od 6 dijelova. Moglo je biti prepravljeno, ali i dalje radi.

Prvi korak je da provjerite da marenda nije majstor. Ako ručak majstor zadatak pada.

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

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Drugi korak Mavena je promjena verzije popravke grešaka u datoteci pom.xml.

Ciljevi: Maven ima sve u jednom redu

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

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Treći korak je prikazivanje informacija o statusu Gita i drugih:

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

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Četvrti korak mijenja šemu povezivanja u developerConnection iz HTTPS u GIT.

I gura promjene u granu navedenu u Teamcity-u pomoću varijable %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%

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Peti korak je preuzimanje iz datoteke pom.xml verziju i instalira je Teamcity varijabla TAG_FROM_VERSION. Imajte na umu da je verzija iz datoteke pom.xml bez slova v ispred. A oznaka, zasnovana na ovoj verziji, već ima slovo v na početku.

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

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

Šesti korak - označavanje bugfix verzije. Ovo se radi pomoću Maven sa potrebnom opcijom u cilj.

Opcija Ciljevi:

-Dtag=%TAG_FROM_VERSION% scm:tag

Automatizacija HotFix-a u Maven projektima koristeći TeamCity

izvor: www.habr.com

Dodajte komentar