TeamCity を使用した Maven プロジェクトでの HotFix の自動化

この投稿では、Teamcity を使用して Maven プロジェクトで HotFix オートメーションを設定する方法について説明します。

HotFix を実行するには、通常、多くの手動手順が実行されます。

  1. HotFix を展開するリリースのブランチを作成します。
  2. リリース時のバグを修正
  3. リリースブランチでバグ修正バージョンを変更する
  4. バグ修正バージョンタグをロールアウトする

ポイント 1,3,4、XNUMX、XNUMX は自動化できます。

本題に移る前に、重要かつ複雑なトピックについて触れておきたいと思います。 バージョン管理 ソフトウェア。 このスクリーンショットで 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 ビルドを除く各タスクの [ビルド機能] セクションで、秘密キーを接続する必要があります。

Maven リリース

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

CI ビルド**。

タスク内で CI ビルド ほんの一歩だけ mvnクリーンテスト

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

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

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

XNUMX番目のステップは標準です mvn リリース:準備 オプションあり --バッチモード

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

リリース用のブランチを作成する

リリースのホットフィックスを作成するには、ブランチを作成する必要があります。 これがタスクのやることです リリース用のブランチを作成する。 彼女には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

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

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

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 の XNUMX 番目のステップは、pom.xml ファイル内のバグ修正バージョンを変更することです。

目標: Maven にはすべてが XNUMX 行にまとめられています

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

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

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

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

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%

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

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

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

XNUMX 番目のステップ - タグ付け バグ修正 バージョン。 これは次を使用して行われます 達人 必要なオプションを付けて 目標.

オプション 目標:

-Dtag=%TAG_FROM_VERSION% scm:tag

TeamCity を使用した Maven プロジェクトでの HotFix の自動化

出所: habr.com

コメントを追加します