この投稿では、Teamcity を使用して Maven プロジェクトで HotFix オートメーションを設定する方法について説明します。
HotFix を実行するには、通常、多くの手動手順が実行されます。
- HotFix を展開するリリースのブランチを作成します。
- リリース時のバグを修正
- リリースブランチでバグ修正バージョンを変更する
- バグ修正バージョンタグをロールアウトする
ポイント 1,3,4、XNUMX、XNUMX は自動化できます。
本題に移る前に、重要かつ複雑なトピックについて触れておきたいと思います。 バージョン管理 ソフトウェア。 このスクリーンショットで Semver を簡単に理解できます。 
詳細はリンク先でご覧いただけます。 .
この投稿で説明されているすべての設定は、 и .
トランクベース開発では、リリースごとに独自のブランチを作成する必要があります。 このリリース内のすべての変更 (ホットフィックス) はこのブランチにコミットされます。
この投稿の一環として、次のことを自動化します。
CI ビルド
新しいリリースの作成
リリースブランチの作成
バグフィックスバージョンの変更

要件:
- コードを保存するための Git リポジトリ。 投稿はリポジトリを使用します .
- Teamcity サーバーおよびエージェント。 次を使用して、ローカルの Teamcity サーバーとエージェントを起動できます。
- Teamcity エージェントがある場合は、Java、Maven、git をインストールする必要があります
Teamcity で「Automation Maven Hotfix」プロジェクトを作成し、そこに 4 つのタスクを作成しましょう。
CI ビルド
リリース用のブランチを作成する
Maven のバグ修正をインクリメントします (バグ修正バージョンの変更))
Maven リリース (新しいリリースの作成)
プロジェクトのスクリーンショット:

一般設定
すべてのタスクで、チェックボックスをオンにする必要があります。クリーン ビルド: ビルド前にチェックアウト ディレクトリ内のすべてのファイルを削除します。このチェックボックスがないとエラーが発生するためです。
単一の 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 ビルドを除くすべてのタスクには秘密キーが必要です。

CI ビルドを除く各タスクの [ビルド機能] セクションで、秘密キーを接続する必要があります。
例 Maven リリース

CI ビルド**。
タスク内で CI ビルド ほんの一歩だけ 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
XNUMX番目のステップは標準です mvn リリース:準備 オプションあり --バッチモード

リリース用のブランチを作成する
リリースのホットフィックスを作成するには、ブランチを作成する必要があります。 これがタスクのやることです リリース用のブランチを作成する。 彼女には2つのステップがあります。
最初のステップでは、ブランチがそうでないことを確認します。 マスター、XNUMX番目はバージョンがファイル内にあるかどうかを確認します 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
XNUMX 番目のステップでは、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 の XNUMX 番目のステップは、pom.xml ファイル内のバグ修正バージョンを変更することです。
目標: Maven にはすべてが XNUMX 行にまとめられています
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
XNUMX 番目のステップは、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
XNUMX 番目のステップでは、developerConnection の接続スキームを 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%
XNUMX番目のステップはファイルから取得することです 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']"
XNUMX 番目のステップ - タグ付け バグ修正 バージョン。 これは次を使用して行われます 達人 必要なオプションを付けて 目標.
オプション 目標:
-Dtag=%TAG_FROM_VERSION% scm:tag
出所: habr.com
