Tämä viesti kuvaa HotFix-automaation määrittämistä Maven-projekteissa Teamcityn avulla.
HotFixin tekemiseen tehdään yleensä monia manuaalisia vaiheita:
- Luo brunssi julkaisulle, johon haluat ottaa HotFixin käyttöön
- Korjaa julkaisussa oleva bugi
- Vaihda virheenkorjausversio julkaisuhaarassa
- Ota bugikorjausversiotagi käyttöön
Pisteet 1,3,4 voidaan automatisoida.
Ennen kuin siirrymme aiheeseen, haluaisin käsitellä tärkeää ja monimutkaista aihetta - versiointi ohjelmisto. Voit ymmärtää Semveriä lyhyesti tässä kuvakaappauksessa. 
Voit lukea lisää linkistä: .
Kaikki tässä viestissä kuvatut asetukset perustuvat и .
Runkopohjaisessa kehityksessä sinun on luotava oma haara jokaiselle julkaisulle. Kaikki tämän julkaisun muutokset (hotfix-korjaukset) on sitoutunut tähän haaraan.
Osana tätä viestiä automatisoimme seuraavat asiat:
CI-rakenne
Uuden julkaisun luominen
Luodaan julkaisuhaara
Bugikorjausversion vaihtaminen

vaatimukset:
- Git-arkisto koodisi tallentamista varten. Viesti käyttää arkistoa .
- Teamcity-palvelin ja agentti. Voit nostaa paikallista Teamcity-palvelinta ja agenttia käyttämällä
- Jos sinulla on Teamcity-agentti, java, maven, git on asennettava
Luodaan "Automation Maven Hotfix" -projekti Teamcityyn ja luodaan sinne 4 tehtävää.
CI Build
Luo haara julkaisua varten
Maven increment bugikorjaus (Vaihda bugikorjausversio)
Maven-julkaisu (uuden julkaisun luominen)
Projektin kuvakaappaus:

Yleiset asetukset
Kaikissa tehtävissä sinun on valittava ruutu "Clean build: Poista kaikki tiedostot kassahakemistosta ennen koontiversiota", koska ilman tätä valintaruutua sain virheitä.
Luomme yhden VCS:n. VCS-ominaisuudet on ympyröity punaisella.

Tyypillisesti VCS:t käyttävät HTTPS-mallia. SISÄÄN Toimialan erittely: tarkoitettu katsomaan kaikki brunssit ja kaikki tagit:
+:refs/heads/*
+:refs/tags/*On tarpeen luoda 4 konfigurointiparametria.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
Arvokentän BRANCH_FOR_INCREMENT ja TAG_FROM_VERSION on jätettävä tyhjäksi.

Sinun on ladattava/lisättävä yksityinen avain. Kaikki tehtävät paitsi CI Build vaativat yksityisen avaimen.

Jokaisessa tehtävässä, paitsi CI Buildissa, Build Features -osiossa sinun on yhdistettävä yksityinen avain.
Esimerkki varten Mavenin julkaisu

CI Build**.
Tehtävässä CI Build vain yksi askel mvn puhdas testi

Mavenin julkaisu
Tehtävässä Mavenin julkaisu 2 askelta. Ensimmäinen askel on tarkistaa, että brunssi on mestari. Jos brunssi ei ole mestari, niin tehtävä kaatuu.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
Toinen vaihe on vakio mvn release:prepare vaihtoehdon kanssa -- erätila

Luo haara julkaisua varten
Jos haluat luoda hotfix-korjauksen julkaisulle, sinun on luotava haara. Tätä tehtävä tekee Luo haara julkaisua varten. Hänellä on 2 askelmaa.
Ensimmäinen askel tarkistaa, että brunssi ei ole mestari, ja toinen tarkistaa, että versio on tiedostossa pom.xml ei sisältänyt sanaa PIKAKUVA
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
Toinen vaihe muuttaa yhteysmallin developerConnectionissa HTTPS:stä GIT:ksi.
# Здесь получаем 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 bugikorjaus
Tehtävä koostuu 6 osasta. Se olisi voitu tehdä uudelleen, mutta se toimii edelleen.
Ensimmäinen askel on tarkistaa, ettei brunssi ole mestari. Jos brunssi mestari tehtävä kaatuu.
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']"
Toinen Maven-vaihe on virheenkorjausversion muuttaminen pom.xml-tiedostossa.
Maalit: Mavenilla on kaikki yhdellä rivillä
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
Kolmas vaihe on näyttää Git-tilatiedot ja muut:
echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch
Neljäs vaihe muuttaa yhteysmallin developerConnectionissa HTTPS:stä GIT:ksi.
Ja työntää muutokset Teamcityssä määritettyyn haaraan %BRANCH_FOR_INCREMENT% muuttujalla
# Здесь получаем 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%
Viides vaihe on hakeminen tiedostosta pom.xml versio ja asentaa sen sisään Teamcity muuttuja TAG_FROM_VERSION. Huomaa, että versio tiedostosta pom.xml ilman v-kirjainta edessä. Ja tähän versioon perustuvassa tagissa on jo v-kirjain alussa.
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']"
Kuudes vaihe - merkintä bugfix versiot. Tämä tehdään käyttämällä Maven jossa vaadittu vaihtoehto Tavoite.
Vaihtoehto Tavoitteet:
-Dtag=%TAG_FROM_VERSION% scm:tag
Lähde: will.com
