TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

이 게시물에서는 Teamcity를 사용하여 Maven 프로젝트에서 HotFix 자동화를 설정하는 방법을 설명합니다.

HotFix를 수행하려면 일반적으로 많은 수동 단계가 수행됩니다.

  1. HotFix를 출시하려는 릴리스에 대한 브런치를 만듭니다.
  2. 릴리스 버그 수정
  3. 릴리스 브랜치에서 bugfix 버전을 변경하세요.
  4. 버그 수정 버전 태그 롤아웃

포인트 1,3,4는 자동화될 수 있습니다.

주제를 다루기 전에 중요하고 복잡한 주제를 다루고 싶습니다. 버전 관리 소프트웨어. 이 스크린샷에서 Semver를 간략하게 이해할 수 있습니다. TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

다음 링크에서 자세한 내용을 읽을 수 있습니다. 1.

이 게시물에 설명된 모든 설정은 다음을 기반으로 합니다. 셈버 и 트렁크 기반 개발.

트렁크 기반 개발에서는 각 릴리스마다 고유한 분기를 만들어야 합니다. 이 릴리스의 모든 변경 사항(핫픽스)은 이 분기에 커밋됩니다.

이 게시물의 일부로 다음 사항을 자동화합니다.

  • CI 빌드

  • 새 릴리스 만들기

  • 릴리스 브랜치 생성

  • 버그수정 버전 변경

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

요구 사항 :

  • 코드를 저장하기 위한 Git 저장소입니다. 게시물은 저장소를 사용합니다 https://gitlab.com/anton_patsev/automation-maven-hotfix.
  • Teamcity 서버 및 에이전트. 다음을 사용하여 로컬 Teamcity 서버와 에이전트를 키울 수 있습니다. 도커 작성
  • Teamcity 에이전트가 있는 곳에 java, maven, git이 설치되어 있어야 합니다.

Teamcity에서 "Automation Maven Hotfix" 프로젝트를 생성하고 거기에 4개의 작업을 생성해 보겠습니다.

  • CI 빌드

  • 릴리스용 브랜치 생성

  • Maven 증분 버그 수정(버그 수정 버전 변경))

  • Maven 릴리스(새 릴리스 생성)

프로젝트 스크린샷:

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

일반 설정

모든 작업에서 " 확인란을 선택해야 합니다.클린 빌드: 빌드 전 체크아웃 디렉터리의 모든 파일을 삭제합니다.“, 이 확인란이 없으면 오류가 발생하기 때문입니다.

단일 VCS를 생성합니다. VCS 기능은 빨간색 원으로 표시됩니다.

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

일반적으로 VCS는 HTTPS 체계를 사용합니다. 안에 지점 사양: 모든 브런치와 모든 태그를 시청하도록 표시되었습니다.

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

4개의 구성 매개변수를 생성해야 합니다.

  • BRANCH_FOR_INCREMENT
  • TAG_FROM_VERSION
  • TEAM_USER
  • TEAM_USER_EMAIL

BRANCH_FOR_INCREMENT 및 TAG_FROM_VERSION의 값 필드는 비워 두어야 합니다.

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

개인 키를 업로드/추가해야 합니다. CI 빌드를 제외한 모든 작업에는 개인 키가 필요합니다.

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

CI 빌드를 제외한 각 작업의 빌드 기능 섹션에서 개인 키를 연결해야 합니다.

메이븐 릴리스

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

CI 빌드**.

작업에서 CI 빌드 한 걸음만 mvn 클린 테스트

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

메이븐 릴리스

작업에서 메이븐 릴리스 2단계. 첫 번째 단계는 브런치가 다음과 같은지 확인하는 것입니다. 석사. 브런치가 아니라면 석사, 그러면 작업이 중단됩니다.

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

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

두 번째 단계는 표준입니다. mvn 릴리스:준비 옵션 포함 --배치 모드

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

릴리스용 브랜치 생성

릴리스에 대한 핫픽스를 생성하려면 분기를 생성해야 합니다. 이것이 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

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

두 번째 단계에서는 개발자 연결의 연결 체계를 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

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

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

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

두 번째 Maven 단계는 pom.xml 파일의 bugfix 버전을 변경하는 것입니다.

목표 : Maven은 한 줄에 모든 것을 담고 있습니다.

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

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

세 번째 단계는 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

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

네 번째 단계에서는 개발자 연결의 연결 체계를 HTTPS에서 GIT로 변경합니다.

그리고 %BRANCH_FOR_INCREMENT% 변수로 Teamcity에 지정된 분기에 변경 사항을 푸시합니다.

# Здесь получаем 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%

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

다섯 번째 단계는 파일에서 가져오는 것입니다. 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']"

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

여섯 번째 단계 - 태그 지정 버그 수정 버전. 이는 다음을 사용하여 수행됩니다. 메이븐 필수 옵션이 포함된 목표.

옵션 목표:

-Dtag=%TAG_FROM_VERSION% scm:tag

TeamCity를 사용하여 Maven 프로젝트에서 HotFix 자동화

출처 : habr.com

코멘트를 추가