HotFix أتمتة في مشاريع Maven باستخدام TeamCity

يصف هذا المنشور كيفية تكوين أتمتة HotFix في مشاريع Maven باستخدام Teamcity.


للقيام بـ HotFix ، عادة ما يتم تنفيذ الكثير من الإجراءات اليدوية:


  1. قم بإنشاء وجبة فطور للإصدار الذي تريد تطبيق HotFix عليه
  2. إصلاح خلل الإصدار
  3. تغيير نسخة bugfix في الافراج عن الغداء
  4. طرح إصدار علامة bugfix

البنود 1،3،4 يمكن أن يكون آليا.


قبل أن ننتقل إلى الموضوع ، أريد أن أتطرق إلى برنامج مهم لتعقيد المواضيع. لفترة وجيزة عن Semver يمكن فهمها في هذه الصورة.


يمكنك قراءة المزيد على الرابط: 1 .


تستند جميع الإعدادات الموضحة في هذا المنشور إلى تطوير يستند إلى جذع .


في Trunk-Based Development ، لكل إصدار تحتاج إلى إنشاء وجبة غداء خاصة بك. جميع التغييرات (الإصلاح) ضمن هذا الإصدار ملتزمون بهذا الغداء.


كجزء من هذا المنشور ، نقوم بأتمتة الأشياء التالية:


  • CI التجمع


  • إنشاء الإصدار الجديد


  • خلق غداء للإفراج


  • تغيير إصدار bugfix




متطلبات:


  • بوابة مستودع لتخزين التعليمات البرمجية الخاصة بك. سيستخدم المنشور https://gitlab.com/anton_patsev/automation-maven-hotfix مستودع.
  • خادم و Teamcity. يمكنك رفع خادم Teamcity المحلي والوكيل باستخدام عامل إنشاء
  • عندما يكون لديك وكيل Teamcity ، يجب تثبيت java ، maven ، git

دعونا إنشاء مشروع "أتمتة Maven Hotfix" في Teamcity وإنشاء 4 مهام هناك.


  • CI Build (CI build)


  • إنشاء فرع للإفراج


  • مخضرمة الزيادة بوجفيكس (تغيير إصدار بوجفيكس))


  • إصدار Maven (إنشاء إصدار جديد)



لقطة شاشة للمشروع:



الإعدادات العامة


في جميع المهام ، من الضروري تعيين مربع الاختيار "بنية نظيفة: حذف جميع الملفات في دليل الخروج قبل الإنشاء " ، لأنه عندما يكون هذا daw مفقودًا ، حصلت على أخطاء.


إنشاء VCS واحد. ميزات VCS دائري باللون الأحمر.



عادةً ما يستخدم نظام VCS نظام HTTPS. في مواصفات الفرع: يشار إلى مشاهدة جميع وجبات الغداء الخفيفة وجميع العلامات:


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

من الضروري إنشاء 4 معلمات تكوين.


  • BRANCH_FOR_INCREMENT
  • TAG_FROM_VERSION
  • TEAM_USER
  • TEAM_USER_EMAIL

يجب ترك حقل القيمة في BRANCH_FOR_INCREMENT و TAG_FROM_VERSION فارغًا.



يجب عليك تحميل / إضافة مفتاح خاص. تتطلب كل المهام باستثناء CI Build مفتاحًا خاصًا.



في كل مهمة باستثناء CI Build ، في قسم Build Features ، تحتاج إلى توصيل مفتاح خاص.


مثال لإطلاق سراح مخضرم



بناء CI **.


في مهمة بناء CI ، مجرد خطوة واحدة اختبار mvn نظيفة



الافراج عن مخضرم


هناك 2 خطوات في الافراج عن مخضرم . الخطوة الأولى هي التحقق من أن الغداء هو سيد . إذا لم يكن البرنش سيدًا ، فسوف تسقط المهمة.


 BRANCH=$(git branch | grep \* | cut -d ' ' -f2) echo "$BRANCH" if [[ "$BRANCH" != "master" ]]; then echo 'Branch is not master'; echo 'Aborting'; exit 1; fi 


والخطوة الثانية هي إصدار mvn القياسي : الاستعداد باستخدام خيار --batch-mode



إنشاء فرع للإفراج


لإنشاء الإصلاح العاجل للإصدار تحتاج إلى إنشاء وجبة غداء. يتم ذلك عن طريق إنشاء فرع لمهمة الإصدار . لديها 2 خطوات.


تقوم الخطوة الأولى بالتحقق من أن وجبة الغداء غير رئيسية ، بينما تتحقق الخطوة الثانية من أن الإصدار الموجود في ملف pom.xml لم يحتوي على كلمة 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 


تغيّر الخطوة الثانية نظام اتصال developerConnection من HTTPS إلى 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 


مخضرم زيادة بوجفيكس


المهمة تتكون من 6 أجزاء. يمكن إعادة تشكيلها ، لكنها تعمل من هذا القبيل.


الخطوة الأولى هي التحقق من أن الغداء ليس سيدًا . إذا سقطت مهمة سيد الغداء.


 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']" 


الخطوة Maven الثانية هي تعديل إصدار bugfix في ملف pom.xml.


الأهداف: مخضرم لديه كل شيء في سطر واحد


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


الخطوة الثالثة هي عرض معلومات حالة Git وغيرها:


 echo 'cat pom.xml' cat pom.xml echo 'git status' git status echo 'git remote -v' git remote -v echo 'git branch' git branch 


تغيّر الخطوة الرابعة نظام اتصال developerConnection من HTTPS إلى GIT.


ويدفع التغييرات إلى الفرع المحدد في 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% 


الخطوة الخامسة تحصل على الإصدار من ملف pom.xml وتعيين المتغير TAG_FROM_VERSION على Teamcity . لاحظ أن الإصدار من ملف pom.xml بدون الحرف v هو في المقدمة. والعلامة ، استنادا إلى هذا الإصدار بالفعل مع الحرف الخامس في البداية.


 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']" 


الخطوة السادسة هي وضع علامة على إصدار bugfix . يتم ذلك باستخدام Maven مع الخيار المطلوب في الهدف .


أهداف الأهداف :


 -Dtag=%TAG_FROM_VERSION% scm:tag 

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


All Articles