Siaran ini akan menerangkan penyediaan automasi HotFix dalam projek Maven menggunakan Teamcity.
Untuk melakukan HotFix, banyak langkah manual biasanya dilakukan:
- Buat makan tengah hari untuk keluaran yang anda mahu gunakan HotFix
- Betulkan pepijat dalam keluaran
- Tukar versi pembetulan pepijat dalam cawangan keluaran
- Keluarkan teg versi pembetulan pepijat
Mata 1,3,4 boleh diautomasikan.
Sebelum kita beralih kepada topik, saya ingin menyentuh topik yang penting dan kompleks - pembuatan versi perisian. Anda boleh memahami Semver secara ringkas dalam tangkapan skrin ini. 
Anda boleh membaca lebih lanjut di pautan: .
Semua tetapan yang diterangkan dalam siaran ini adalah berdasarkan и .
Dalam Pembangunan Berasaskan Batang, anda perlu mencipta cawangan anda sendiri untuk setiap keluaran. Semua perubahan (pembetulan terkini) dalam keluaran ini komited kepada cawangan ini.
Sebagai sebahagian daripada siaran ini, kami akan mengautomasikan perkara berikut:
Binaan CI
Mencipta keluaran baharu
Mencipta cawangan keluaran
Menukar versi pembaikan pepijat

Keperluan:
- Repositori Git untuk menyimpan kod anda. Siaran akan menggunakan repositori .
- Pelayan dan ejen Teamcity. Anda boleh meningkatkan pelayan dan ejen Teamcity tempatan anda menggunakan
- Di mana anda mempunyai ejen Teamcity, java, maven, git mesti dipasang
Mari buat projek "Pembetulan Terkini Automasi Maven" dalam Teamcity dan buat 4 tugasan di sana.
Binaan CI
Buat cawangan untuk keluaran
Pembetulan pepijat kenaikan Maven (Tukar versi pembetulan pepijat))
Keluaran Maven (Mencipta keluaran baharu)
Tangkapan skrin projek:

Tetapan umum
Dalam semua tugas anda mesti tandakan kotak "Binaan bersih: Padam semua fail dalam direktori pembayaran sebelum binaan“, kerana tanpa kotak semak ini saya mendapat ralat.
Kami mencipta satu VCS. Ciri VCS dibulatkan dengan warna merah.

Biasanya VCS menggunakan skema HTTPS. DALAM Spesifikasi cawangan: ditunjukkan untuk menonton semua makan tengah hari dan semua tag:
+:refs/heads/*
+:refs/tags/*Ia adalah perlu untuk mencipta 4 Parameter Konfigurasi.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
Medan nilai dalam BRANCH_FOR_INCREMENT dan TAG_FROM_VERSION mesti dibiarkan kosong.

Anda perlu memuat naik/menambah kunci peribadi. Semua tugas kecuali CI Build memerlukan kunci peribadi.

Dalam setiap tugas, kecuali CI Build, dalam bahagian Build Features anda perlu menyambungkan kunci peribadi.
Contoh untuk pelepasan Maven

CI Build**.
Dalam sesuatu tugasan Binaan CI hanya satu langkah ujian bersih mvn

pelepasan Maven
Dalam sesuatu tugasan pelepasan Maven 2 langkah. Langkah pertama ialah menyemak sarapan tengah hari itu master. Jika tidak makan tengah hari master, maka tugas itu jatuh.
BRANCH=$(git branch | grep * | cut -d ' ' -f2)
echo "$BRANCH"
if [[ "$BRANCH" != "master" ]]; then
echo 'Branch is not master';
echo 'Aborting';
exit 1;
fi
Langkah kedua adalah standard mvn release:prepare dengan pilihan --mod-batch

Buat cawangan untuk keluaran
Untuk mencipta hotfix untuk keluaran anda perlu membuat cawangan. Inilah yang dilakukan oleh taska Buat cawangan untuk keluaran. Dia mempunyai 2 langkah.
Langkah pertama menyemak bahawa makan tengah hari tidak master, dan yang kedua menyemak bahawa versi ada dalam fail pom.xml tidak mengandungi perkataan GAMBAR GAMBAR
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
Langkah kedua menukar skema sambungan dalam developerConnection daripada HTTPS kepada 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
Pembetulan pepijat peningkatan Maven
Tugasan terdiri daripada 6 bahagian. Ia mungkin telah difaktorkan semula, tetapi ia masih berfungsi.
Langkah pertama adalah untuk memeriksa sama ada makan tengah hari tidak master. Jika makan tengah hari master tugas itu jatuh.
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']"
Langkah Maven kedua ialah menukar versi pembaikan pepijat dalam fail pom.xml.
Matlamat: Maven mempunyai segala-galanya dalam satu baris
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
Langkah ketiga ialah untuk memaparkan maklumat status Git dan lain-lain:
echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch
Langkah keempat menukar skema sambungan dalam developerConnection daripada HTTPS kepada GIT.
Dan menolak perubahan pada cawangan yang ditentukan dalam Teamcity dengan pembolehubah %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%
Langkah kelima ialah mendapatkan daripada fail pom.xml versi dan memasangnya Teamcity pembolehubah TAG_FROM_VERSION. Ambil perhatian bahawa versi daripada fail pom.xml tanpa huruf v di hadapan. Dan teg, berdasarkan versi ini, sudah mempunyai huruf v pada permulaannya.
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']"
Langkah keenam - penandaan bugfix versi. Ini dilakukan menggunakan Maven dengan pilihan yang diperlukan dalam Matlamat.
Pilihan Anda:
-Dtag=%TAG_FROM_VERSION% scm:tag
Sumber: www.habr.com
