Π’Π°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ ΠΎΠΏΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° HotFix Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π² ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π½Π° Maven Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Teamcity.
ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ HotFix, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ½ΠΈ ΡΡΡΠΏΠΊΠΈ:
- Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ Π±ΡΡΠ½Ρ Π·Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ, ΠΊΡΠΌ ΠΊΠΎΠ΅ΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ HotFix
- ΠΠΎΡΠΈΠ³ΠΈΡΠ°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠ° Π² ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ
- ΠΡΠΎΠΌΠ΅Π½Π΅ΡΠ΅ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΡΠ΅ΠΊΡΠΈΡΡΠ° Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π² ΠΊΠ»ΠΎΠ½Π° Π½Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ
- Π Π°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅ΡΠ΅ ΠΌΠ°ΡΠΊΠ΅ΡΠ° Π·Π° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΊΠΎΡΠ΅ΠΊΡΠΈΡ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ
Π’ΠΎΡΠΊΠΈ 1,3,4 ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ.
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΡΠ΅ΠΌΠ°ΡΠ°, Π±ΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° Π·Π°ΡΠ΅Π³Π½Π° Π΅Π΄Π½Π° Π²Π°ΠΆΠ½Π° ΠΈ ΡΠ»ΠΎΠΆΠ½Π° ΡΠ΅ΠΌΠ° - ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π²Π΅ΡΡΠΈΠΈ ΡΠΎΡΡΡΠ΅Ρ. ΠΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ Semver Π² ΡΠ°Π·ΠΈ Π΅ΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ°.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π° Π»ΠΈΠ½ΠΊΠ°:
ΠΡΠΈΡΠΊΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ, ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π°Ρ Π½Π°
Π Trunk-Based Development ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΊΠ»ΠΎΠ½ Π·Π° Π²ΡΡΠΊΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. ΠΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ (Π°ΠΊΡΡΠ°Π»Π½ΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠΈΠΈ) Π² ΡΠ°Π·ΠΈ Π²Π΅ΡΡΠΈΡ ΡΠ° Π°Π½Π³Π°ΠΆΠΈΡΠ°Π½ΠΈ ΠΊΡΠΌ ΡΠΎΠ·ΠΈ ΠΊΠ»ΠΎΠ½.
ΠΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΡΠ°Π·ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½Π΅ΡΠ°:
-
CI ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅
-
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ
-
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΠΎΠ½ Π·Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅
-
ΠΡΠΎΠΌΡΠ½Π° Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΡΠ΅ΠΊΡΠΈΡ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ
ΠΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡ:
- Git Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π²Π°ΡΠΈΡ ΠΊΠΎΠ΄. ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
https://gitlab.com/anton_patsev/automation-maven-hotfix . - Teamcity ΡΡΡΠ²ΡΡ ΠΈ Π°Π³Π΅Π½Ρ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ²Π΄ΠΈΠ³Π½Π΅ΡΠ΅ Π²Π°ΡΠΈΡ Π»ΠΎΠΊΠ°Π»Π΅Π½ ΡΡΡΠ²ΡΡ ΠΈ Π°Π³Π΅Π½Ρ Π½Π° Teamcity, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅
Π΄ΠΎΠΊΠ΅Ρ-Π½ΠΎΠ²ΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ - Π’Π°ΠΌ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠΌΠ°ΡΠ΅ Π°Π³Π΅Π½Ρ Π½Π° Teamcity, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ java, maven, git
ΠΠ΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° βAutomation Maven Hotfixβ Π² Teamcity ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ 4 Π·Π°Π΄Π°ΡΠΈ ΡΠ°ΠΌ.
-
CI Build
-
Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠ»ΠΎΠ½ Π·Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅
-
Maven ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΠΊΠΎΡΠ΅ΠΊΡΠΈΡ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ (ΠΡΠΎΠΌΡΠ½Π° Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΡΠ΅ΠΊΡΠΈΡ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ))
-
ΠΠ΅ΡΡΠΈΡ Π½Π° Maven (Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ)
ΠΠΊΡΠ°Π½Π½Π° ΡΠ½ΠΈΠΌΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
ΠΠ±ΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
ΠΡΠ² Π²ΡΠΈΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΎΡΠΌΠ΅ΡΠΊΠ° Π² ΠΊΠ²Π°Π΄ΡΠ°ΡΡΠ΅ΡΠΎ "Π§ΠΈΡΡΠ° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ: ΠΠ·ΡΡΠΈΠΉΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π·Π° ΠΏΠ»Π°ΡΠ°Π½Π΅ ΠΏΡΠ΅Π΄ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΡΠ°β, Π·Π°ΡΠΎΡΠΎ Π±Π΅Π· ΡΠΎΠ²Π° ΠΊΠ²Π°Π΄ΡΠ°ΡΡΠ΅ Π·Π° ΠΎΡΠΌΠ΅ΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌ Π³ΡΠ΅ΡΠΊΠΈ.
Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π΅Π΄ΠΈΠ½ VCS. Π₯Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ Π½Π° VCS ΡΠ° ΠΎΠ³ΡΠ°Π΄Π΅Π½ΠΈ Π² ΡΠ΅ΡΠ²Π΅Π½ΠΎ.
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ VCS ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ 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 ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠ΅Π½ ΠΊΠ»ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Maven
CI Build**.
Π Π·Π°Π΄Π°ΡΠ° CI Build ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΠΊΡΠ°ΡΠΊΠ° mvn ΡΠΈΡΡ ΡΠ΅ΡΡ
ΠΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Maven
Π Π·Π°Π΄Π°ΡΠ° ΠΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Maven 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 ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅: ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Ρ ΠΎΠΏΡΠΈΡ --ΠΏΠ°ΡΡΠΈΠ΄Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ
Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠ»ΠΎΠ½ Π·Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅
ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π°ΠΊΡΡΠ°Π»Π½Π° ΠΊΠΎΡΠ΅ΠΊΡΠΈΡ Π·Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅, ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΊΠ»ΠΎΠ½. Π’ΠΎΠ²Π° ΠΏΡΠ°Π²ΠΈ taska Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠ»ΠΎΠ½ Π·Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅. Π’Ρ ΠΈΠΌΠ° 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 Π²Π΅ΡΡΠΈΡ ΠΈ Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π² Teamcity ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° 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