Otomatisasi HotFix di proyek Maven menggunakan TeamCity
Posting ini akan menjelaskan pengaturan otomatisasi HotFix di proyek Maven menggunakan Teamcity.
Untuk melakukan HotFix, biasanya banyak langkah manual yang dilakukan:
Buat sarapan siang untuk rilis yang HotFixnya ingin Anda luncurkan
Perbaiki bug dalam rilis
Ubah versi perbaikan bug di cabang rilis
Luncurkan tag versi perbaikan bug
Poin 1,3,4 dapat diotomatisasi.
Sebelum kita beralih ke topik, saya ingin menyentuh topik yang penting dan kompleks - pembuatan versi perangkat lunak. Anda dapat memahami Semver secara singkat di tangkapan layar ini.
Dalam Pengembangan Berbasis Batang, Anda perlu membuat cabang Anda sendiri untuk setiap rilis. Semua perubahan (perbaikan terbaru) dalam rilis ini dilakukan pada cabang ini.
Sebagai bagian dari postingan ini, kami akan mengotomatiskan hal-hal berikut:
Server dan agen Teamcity. Anda dapat meningkatkan server dan agen Teamcity lokal Anda menggunakan docker-compose
Jika Anda memiliki agen Teamcity, java, maven, git harus diinstal
Mari kita buat proyek "Automation Maven Hotfix" di Teamcity dan buat 4 tugas di sana.
Membangun CI
Buat cabang untuk rilis
Perbaikan bug kenaikan Maven (Ubah versi perbaikan bug))
Rilis Maven (Membuat rilis baru)
Tangkapan layar proyek:
Pengaturan umum
Dalam semua tugas, Anda harus mencentang kotak "Clean build: Hapus semua file di direktori checkout sebelum build“, karena tanpa kotak centang ini saya mendapatkan kesalahan.
Kami membuat satu VCS. Fitur VCS dilingkari merah.
Biasanya VCS menggunakan skema HTTPS. DI DALAM Spesifikasi cabang: diindikasikan untuk menonton semua brunch dan semua tag:
+:refs/heads/*
+:refs/tags/*
Penting untuk membuat 4 Parameter Konfigurasi.
BRANCH_FOR_INCREMENT
TAG_FROM_VERSION
TEAM_USER
TEAM_USER_EMAIL
Bidang nilai di BRANCH_FOR_INCREMENT dan TAG_FROM_VERSION harus dibiarkan kosong.
Anda perlu mengunggah/menambahkan kunci pribadi. Semua tugas kecuali CI Build memerlukan kunci pribadi.
Di setiap tugas, kecuali CI Build, di bagian Fitur Build Anda perlu menghubungkan kunci pribadi.
Contoh untuk Rilis Maven
Pembangunan CI**.
Dalam sebuah tugas Membangun CI hanya satu langkah tes bersih mvn
Rilis Maven
Dalam sebuah tugas Rilis Maven 2 langkah. Langkah pertama adalah memeriksa apakah brunch tersebut menguasai. Jika makan siang tidak menguasai, maka tugasnya gagal.
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 standar rilis mvn: persiapkan dengan opsi --mode batch
Buat cabang untuk rilis
Untuk membuat perbaikan terbaru untuk rilis, Anda perlu membuat cabang. Inilah yang dilakukan tugas Buat cabang untuk rilis. Dia memiliki 2 langkah.
Langkah pertama memeriksa apakah brunch tidak menguasai, dan yang kedua memeriksa apakah versinya ada di file pom.xml tidak mengandung kata tersebut 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
Langkah kedua mengubah skema koneksi di developerConnection dari HTTPS ke 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
Perbaikan bug kenaikan Maven
Tugas terdiri dari 6 bagian. Itu bisa saja difaktorkan ulang, tetapi masih berfungsi.
Langkah pertama adalah memeriksa apakah brunchnya tidak menguasai. Jika makan siang menguasai 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 yang kedua adalah mengubah versi perbaikan bug di file pom.xml.
Langkah keempat mengubah skema koneksi di developerConnection dari HTTPS ke GIT.
Dan mendorong perubahan ke cabang yang ditentukan di Teamcity dengan variabel %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 adalah mendapatkan dari file pom.xml versi dan menginstalnya kota tim variabel TAG_FROM_VERSION. Perhatikan bahwa versi dari file pom.xml tanpa huruf v di depannya. Dan tagnya berdasarkan versi ini sudah ada huruf v di awal.
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 dengan menggunakan Maven dengan opsi yang diperlukan di Tujuan.