פוסט זה יתאר את הגדרת האוטומציה של HotFix בפרויקטים של Maven באמצעות Teamcity.
כדי לבצע HotFix, הרבה שלבים ידניים נעשים בדרך כלל:
- צור בראנץ' עבור המהדורה שבה אתה רוצה להפיץ את HotFix
- תקן באג בשחרור
- שנה את גרסת תיקון הבאגים בענף השחרור
- פרסם תג גרסת תיקון באגים
נקודות 1,3,4 יכולות להיות אוטומטיות.
לפני שנעבור לנושא, ברצוני לגעת בנושא חשוב ומורכב - ניהול גרסאות תוֹכנָה. אתה יכול להבין בקצרה את Semver בצילום מסך זה. 
תוכל לקרוא עוד בקישור: .
כל ההגדרות המתוארות בפוסט זה מבוססות על и .
בפיתוח מבוסס Trunk, עליך ליצור סניף משלך עבור כל מהדורה. כל השינויים (התיקונים החמים) בתוך מהדורה זו מחויבים לסניף זה.
כחלק מהפוסט הזה, נהפוך את הדברים הבאים לאוטומטיים:
בניית CI
יצירת מהדורה חדשה
יצירת סניף שחרור
שינוי גרסת תיקוני הבאגים

דרישות:
- מאגר Git לאחסון הקוד שלך. הפוסט ישתמש במאגר .
- שרת וסוכן של Teamcity. אתה יכול להעלות את השרת והסוכן המקומי של Teamcity באמצעות
- היכן שיש לך סוכן Teamcity, יש להתקין java, maven, git
בואו ניצור את פרויקט "התיקון החם של אוטומציה מייבן" ב-Teamcity וניצור שם 4 משימות.
CI Build
צור סניף לשחרור
תיקון באגים של Maven הגדל (שנה גרסת תיקון באגים))
מהדורה של Maven (יצירת מהדורה חדשה)
צילום מסך של הפרויקט:

Общие настройки
בכל המשימות עליך לסמן את התיבה "בנייה נקייה: מחק את כל הקבצים בספריית התשלום לפני הבנייה", כי בלי תיבת הסימון הזו קיבלתי שגיאות.
אנו יוצרים VCS יחיד. תכונות VCS מוקפות בעיגול באדום.

בדרך כלל VCSs משתמשים בסכימת HTTPS. IN מפרט סניף: ציינו לצפות בכל הבראנץ' ובכל התגים:
+: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 Build**.
במשימה CI Build רק צעד אחד בדיקה נקייה של 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: להתכונן עם אפשרות --מצב אצווה

צור סניף לשחרור
כדי ליצור תיקון חם לגרסה, עליך ליצור סניף. זה מה שהטאסה עושה צור סניף לשחרור. יש לה 2 מדרגות.
הצעד הראשון בודק שבראנץ' לא אב, והשני בודק שהגרסה נמצאת בקובץ pom.xml לא הכיל את המילה סנאפצ'וט
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
השלב השני משנה את סכימת החיבור ב-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
תיקון באגים של Maven הגדל
המשימה מורכבת מ-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 הוא שינוי גרסת תיקון הבאגים בקובץ pom.xml.
מטרות: ל-Maven יש הכל בשורה אחת
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. שימו לב שהגרסה מהקובץ pom.xml בלי האות v מלפנים. והתגית, בהתבסס על גרסה זו, כבר כוללת את האות 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']"
שלב שישי - תיוג תיקון באגים גרסאות. זה נעשה באמצעות Maven עם האפשרות הנדרשת ב מטרה.
אפשרות שערים:
-Dtag=%TAG_FROM_VERSION% scm:tag
מקור: www.habr.com
