Automasi HotFix dalam proyek Maven menggunakan TeamCity

Posting ini akan menjelaskan cara mengkonfigurasi otomatisasi HotFix di proyek Maven menggunakan Teamcity.


Untuk melakukan HotFix, banyak tindakan manual biasanya dilakukan:


  1. Buat brunch untuk rilis yang Anda inginkan untuk menggulung HotFix
  2. Perbaiki bug rilis
  3. Ubah versi perbaikan bug di rilis brunch
  4. Luncurkan versi perbaikan bug tag

Item 1,3,4 dapat diotomatisasi.


Sebelum kita beralih ke topik, saya ingin menyentuh pada perangkat lunak versi - topik yang penting dan kompleks. Secara singkat tentang Semver dapat dipahami dalam screenshot ini.


Anda dapat membaca lebih lanjut di tautan: 1 .


Semua pengaturan yang dijelaskan dalam posting ini didasarkan pada Semver dan Pengembangan Berbasis Batang .


Dalam Pengembangan Berbasis Batang, untuk setiap rilis Anda harus membuat brunch sendiri. Semua perubahan (perbaikan terbaru) dalam rilis ini berkomitmen untuk makan siang ini.


Sebagai bagian dari pos ini, kami mengotomatiskan hal-hal berikut:


  • Perakitan CI


  • Buat Rilis Baru


  • Membuat brunch untuk rilis


  • Mengubah versi perbaikan bug




Persyaratan:



Mari kita buat proyek "Perbaikan Otomatis Maven" di Teamcity dan buat 4 tugas di sana.


  • CI Build (CI build)


  • Buat cabang untuk dirilis


  • Perbaikan bug peningkatan Maven (Ubah versi perbaikan bug))


  • Rilis Maven (Membuat rilis baru)



Tangkapan layar proyek:



Pengaturan umum


Dalam semua tugas itu perlu untuk mengatur kotak centang " Bersihkan membangun: Hapus semua file di direktori checkout sebelum membangun ", karena ketika daw ini hilang, saya mendapat kesalahan.


Buat VCS tunggal. Fitur VCS dilingkari merah.



VCS biasanya menggunakan skema HTTPS. Dalam spesifikasi Cabang: diindikasikan untuk menonton semua brunch dan semua tag:


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

Diperlukan untuk membuat 4 Parameter Konfigurasi.


  • BRANCH_FOR_INCREMENT
  • TAG_FROM_VERSION
  • TEAM_USER
  • TEAM_USER_EMAIL

Bidang nilai dalam BRANCH_FOR_INCREMENT dan TAG_FROM_VERSION harus dikosongkan.



Anda harus mengunggah / menambahkan kunci pribadi. Semua tugas kecuali CI Build memerlukan kunci pribadi.



Di setiap tugas kecuali CI Build, di bagian Build Features, Anda perlu menghubungkan kunci pribadi.


Contoh untuk rilis Maven



CI Build **.


Dalam tugas CI Build , hanya satu langkah mvn tes bersih



Rilis Maven


Ada 2 langkah dalam rilis Maven . Langkah pertama adalah memverifikasi bahwa brunch adalah master . Jika makan siang tidak master , maka tugas 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 rilis mvn standar : siapkan dengan opsi --batch-mode



Buat cabang untuk dirilis


Untuk membuat perbaikan terbaru untuk rilis Anda perlu membuat brunch. Ini dilakukan oleh Buat cabang untuk tugas rilis . Dia memiliki 2 langkah.


Langkah pertama memeriksa bahwa brunch tidak master , dan yang kedua memeriksa bahwa versi dalam file pom.xml tidak mengandung kata SNAPSHOT


 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 "******************* WARNING *************************" echo "************ You are create branch for SNAPSHOTS ******************" echo "***********************************************************" exit 1 fi 


Langkah kedua mengubah skema konektivitas 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 peningkatan Maven


Tugas terdiri dari 6 bagian. Itu bisa di refactored, tetapi bisa berfungsi seperti itu.


Langkah pertama adalah memverifikasi bahwa brunch tidak master . Jika tugas master brunch 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 adalah mengubah versi perbaikan bug di file pom.xml.


Tujuan: maven memiliki segalanya dalam satu baris


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


Langkah ketiga adalah menampilkan informasi status Git dan lainnya:


 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 mengubah skema konektivitas developerConnection dari HTTPS ke GIT.


Dan mendorong perubahan ke cabang yang ditentukan dalam variabel Teamcity% 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 mendapatkan versi dari file pom.xml dan menetapkan variabel TAG_FROM_VERSION ke Teamcity . Perhatikan bahwa versi dari file pom.xml tanpa huruf v ada di depan. Dan tag, berdasarkan versi ini sudah dengan 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 adalah menandai versi perbaikan bug . Ini dilakukan menggunakan Maven dengan opsi yang diinginkan di Goal .


Opsi Sasaran :


 -Dtag=%TAG_FROM_VERSION% scm:tag 

Source: https://habr.com/ru/post/id483242/


All Articles