แแก แแแกแขแ แแฆแฌแแ แก HotFix แแแขแแแแขแแแแชแแแก แแแงแแแแแแก Maven แแ แแแฅแขแแแจแ Teamcity-แแก แแแแแงแแแแแแ.
HotFix-แแก แแแกแแแแแแแแแ, แฉแแแฃแแแแ แแ แแแแแแแ แแ แแแแแ แฎแแแแ แแแแแฏแ:
- แจแแฅแแแแแ แแ แแแฉแ แแ แแแแแจแแแแแกแแแแก, แ แแแแแแแช แแกแฃแ แ HotFix-แแก แแแจแแแแ
- แจแแแกแฌแแ แแ แแแแแจแแแแแก แฎแแ แแแแ
- แจแแชแแแแแ bugfix แแแ แกแแ แแแแแจแแแแแก แคแแแแแแจแ
- แแแแคแแ แแแแแ bugfix แแแ แกแแแก แขแแแ
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 increment bugfix (bugfix-แแก แแแ แกแแแก แจแแชแแแ))
-
Maven-แแก แแแแแจแแแแ (แแฎแแแ แแแแแจแแแแแก แจแแฅแแแ)
แแ แแแฅแขแแก แกแแ แแแจแแขแ:
แแแแแแ แแแ แแแแขแ แแแ
แงแแแแ แแแแชแแแแจแ แแฅแแแ แฃแแแ แแแแแจแแแ แงแฃแแ "Clean build: แฌแแจแแแแ แงแแแแ แคแแแแ แจแแแแแแแก แแแ แแฅแขแแ แแแจแ แแจแแแแแแแแโ, แ แแแแแ แแ แฉแแแ แแแแแแก แแแ แแจแ แแ แแแแแฆแ แจแแชแแแแแแ.
แฉแแแ แแฅแแแแ แแ แ 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 แแแแแจแแแแ: แแแแแแแแแ แแแ แแแแขแแ -- แแแ แขแแฃแแ แ แแแแแ
แจแแฅแแแแแ แคแแแแแแ แแแกแแแแแแกแฃแคแแแแแแ
แแแแแจแแแแแกแแแแก แชแฎแแแ แจแแกแฌแแ แแแแก แจแแกแแฅแแแแแแ, แแฅแแแ แฃแแแ แจแแฅแแแแ แคแแแแแแ. แแก แแ แแก แแก, แ แแกแแช แแแแชแแแ แแแแแแแก แจแแฅแแแแแ แคแแแแแแ แแแกแแแแแแกแฃแคแแแแแแ. แแแก แแฅแแก 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 increment bugfix
แแแแแแแแ แจแแแแแแ 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 แคแแแแจแ.
แแแแแแแ: แแแแแแก แงแแแแแคแแ แ แแ แ แฎแแแแ แแฅแแก
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