Ĉi tiu afiŝo priskribos agordi HotFix-aŭtomatigon en Maven-projektoj uzante Teamcity.
Por fari HotFix, multaj manaj paŝoj estas kutime faritaj:
- Kreu brunĉon por la eldono, al kiu vi volas elŝuti HotFix
- Ripari cimon en liberigo
- Ŝanĝu la version de eraro en la eldonbranĉo
- Elŝutu etikedon de versio de bugfix
La punktoj 1,3,4 povas esti aŭtomatigitaj.
Antaŭ ol ni transiru al la temo, mi ŝatus tuŝi gravan kaj kompleksan temon - versionado programaro. Vi povas mallonge kompreni Semver en ĉi tiu ekrankopio. 
Vi povas legi pli ĉe la ligilo: .
Ĉiuj agordoj priskribitaj en ĉi tiu afiŝo baziĝas sur и .
En Trunk-Bazita Disvolviĝo, vi devas krei vian propran branĉon por ĉiu eldono. Ĉiuj ŝanĝoj (reparadoj) en ĉi tiu eldono estas faritaj al ĉi tiu branĉo.
Kiel parto de ĉi tiu afiŝo, ni aŭtomatigos la jenajn aferojn:
CI-konstruo
Kreante novan eldonon
Kreante eldonbranĉon
Ŝanĝante la version de bugfix

Postuloj:
- Git-deponejo por stoki vian kodon. La afiŝo uzos la deponejon .
- Teamcity servilo kaj agento. Vi povas altigi vian lokan servilon kaj agenton de Teamcity uzante
- Kie vi havas Teamcity-agenton, java, maven, git devas esti instalitaj
Ni kreu la projekton "Automation Maven Hotfix" en Teamcity kaj kreu 4 taskojn tie.
CI Konstruo
Kreu branĉon por liberigo
Maven-inkrementa eraro-korekto (Ŝanĝi cimkorektan version))
Maven-eldono (Kreante novan eldonon)
Projekta ekrankopio:

Ĝeneralaj agordoj
En ĉiuj taskoj vi devas marki la skatolon "Pura konstruo: Forigu ĉiujn dosierojn en la kasa dosierujo antaŭ la konstruo", ĉar sen ĉi tiu markobutono mi ricevis erarojn.
Ni kreas ununuran VCS. VCS-ecoj estas ruĝe rondigitaj.

Tipe VCSoj uzas la HTTPS-skemon. EN Specifo de branĉo: indikis rigardi ĉiujn brunĉojn kaj ĉiujn etikedojn:
+:refs/heads/*
+:refs/tags/*Necesas krei 4 Agordajn Parametrojn.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
La valorkampo en BRANCH_FOR_INCREMENT kaj TAG_FROM_VERSION devas esti malplena.

Vi devas alŝuti/aldoni privatan ŝlosilon. Ĉiuj taskoj krom CI Build postulas privatan ŝlosilon.

En ĉiu tasko, krom CI-Konstruo, en la sekcio Konstruaj Trajtoj vi devas konekti privatan ŝlosilon.
Ekzemplo por Maven liberigo

CI Konstruo**.
En tasko CI Konstruo nur unu paŝon mvn pura testo

Maven liberigo
En tasko Maven liberigo 2 paŝoj. La unua paŝo estas kontroli, ke brunĉo estas majstro. Se brunĉo ne estas majstro, tiam la tasko falas.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
La dua paŝo estas norma mvn release:prepari kun opcio --batch-mode

Kreu branĉon por liberigo
Por krei varmigon por eldono, vi devas krei branĉon. Jen kion faras la tasko Kreu branĉon por liberigo. Ŝi havas 2 paŝojn.
La unua paŝo kontrolas, ke brunĉo ne estas majstro, kaj la dua kontrolas, ke la versio estas en la dosiero pom.xml ne enhavis la vorton FOTO
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
La dua paŝo ŝanĝas la konekton en developerConnection de HTTPS al 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
Riparo de eraro de Maven-incremento
La tasko konsistas el 6 partoj. Ĝi povus esti refaktorita, sed ĝi ankoraŭ funkcias.
La unua paŝo estas kontroli, ke la brunĉo ne estas majstro. Se brunĉo majstro la tasko falas.
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 dua paŝo de Maven ŝanĝas la version de bugfix en la dosiero pom.xml.
Celoj: Maven havas ĉion en unu linio
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
La tria paŝo estas montri informojn pri Git-statuso kaj aliajn:
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 kvara paŝo ŝanĝas la konektoskemon en developerConnection de HTTPS al GIT.
Kaj puŝas ŝanĝojn al la branĉo specifita en Teamcity per la variablo %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 kvina paŝo estas ricevi de la dosiero pom.xml versio kaj instalas ĝin en Teamcity variablo TAG_FROM_VERSION. Notu ke la versio de la dosiero pom.xml sen la litero v antaŭe. Kaj la etikedo, bazita sur ĉi tiu versio, jam havas la literon v komence.
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']"
Sesa paŝo - etikedado cimo de eraroj versioj. Ĉi tio estas farita uzante Maven kun la postulata opcio en celon.
Opcio celoj:
-Dtag=%TAG_FROM_VERSION% scm:tag
fonto: www.habr.com
