Esta postagem descreverá como configurar a automação do HotFix em projetos Maven usando o Teamcity.
Para executar o HotFix, muitas ações manuais geralmente são realizadas:
- Crie um brunch para a versão para a qual você deseja lançar o HotFix
- Corrigir bug de lançamento
- Alterar versão do bugfix no brunch de lançamento
- Rollout tag bugfix version
Os itens 1,3,4 podem ser automatizados.
Antes de avançarmos para o tópico, quero abordar um software importante e complexo de controle de versão . Brevemente sobre Semver pode ser entendido nesta imagem. 
Você pode ler mais no link: 1 .
Todas as configurações descritas nesta postagem são baseadas no Semver e no desenvolvimento baseado em tronco .
No desenvolvimento baseado em tronco, para cada versão, você precisa criar seu próprio brunch. Todas as alterações (hotfix) nesta versão estão comprometidas com este brunch.
Como parte desta postagem, automatizamos o seguinte:

Requisitos:
Vamos criar o projeto "Automation Maven Hotfix" no Teamcity e criar 4 tarefas lá.
Construção de IC (construção de IC)
Criar ramificação para liberação
Correção de bug do incremento do Maven (Alterar versão da correção de bug)
Versão do Maven (Criando uma nova versão)
Captura de tela do projeto:

Configurações gerais
Em todas as tarefas, é necessário definir a caixa de seleção " Compilação limpa: exclua todos os arquivos no diretório de check-out antes da compilação ", porque quando esta perda está ausente, eu tenho erros.
Crie um único VCS. Recursos VCS circulados em vermelho.

VCS normalmente usam o esquema HTTPS. Na especificação Branch: é indicado assistir a todos os brunches e todas as tags:
+:refs/heads/* +:refs/tags/*
É necessário criar 4 parâmetros de configuração.
- BRANCH_FOR_INCREMENT
- TAG_FROM_VERSION
- TEAM_USER
- TEAM_USER_EMAIL
O campo de valor em BRANCH_FOR_INCREMENT e TAG_FROM_VERSION deve ser deixado em branco.

Você deve carregar / adicionar uma chave privada. Todas as tarefas, exceto a criação de IC, exigem uma chave privada.

Em todas as tarefas, exceto na compilação de IC, na seção Recursos de compilação, você precisa conectar uma chave privada.
Exemplo para liberação do Maven

Construção de CI **.
Na tarefa de criação de IC , apenas uma etapa mvn clean test

Liberação do Maven
Existem 2 etapas na liberação do Maven . O primeiro passo é verificar se o brunch é principal . Se o brunch não for mestre , a tarefa será encerrada.
BRANCH=$(git branch | grep \* | cut -d ' ' -f2) echo "$BRANCH" if [[ "$BRANCH" != "master" ]]; then echo 'Branch is not master'; echo 'Aborting'; exit 1; fi

O segundo passo é o release mvn padrão : prepare com a opção --batch-mode

Criar ramificação para liberação
Para criar um hotfix para lançamento, você precisa criar um brunch. Isso é feito pelo Criar ramo para a tarefa de liberação . Ela tem 2 passos.
A primeira etapa verifica se o brunch não é mestre e a segunda verifica se a versão no arquivo pom.xml não continha a palavra INSTANTÂNEO
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 "******************* WARNING *************************" echo "************ You are create branch for SNAPSHOTS ******************" echo "***********************************************************" exit 1 fi

A segunda etapa altera o esquema de conectividade do developerConnection de HTTPS para GIT.

Correção de incremento do Maven
Tarefa consiste em 6 partes. Pode ser refatorado, mas funciona assim.
O primeiro passo é verificar se o brunch não é mestre . Se a tarefa principal do brunch cair.
BRANCH=$(git branch | grep \* | cut -d ' ' -f2) echo "$BRANCH" if [[ "$BRANCH" == "master" ]]; then echo 'Branch is master'; echo 'Aborting'; exit 1; fi

A segunda etapa do Maven é modificar a versão do bugfix no arquivo pom.xml.
Objetivos: maven tem tudo em uma linha
build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit

A terceira etapa é exibir informações de status do Git e outras:
echo 'cat pom.xml' cat pom.xml echo 'git status' git status echo 'git remote -v' git remote -v echo 'git branch' git branch

A quarta etapa altera o esquema de conectividade do developerConnection de HTTPS para GIT.
E envia as alterações para o ramo especificado na variável% Team BRANCH_FOR_INCREMENT%

A quinta etapa obtém a versão do arquivo pom.xml e define a variável TAG_FROM_VERSION como Teamcity . Observe que a versão do arquivo pom.xml sem a letra v está na frente. E a etiqueta, com base nesta versão, já com a letra v no início.
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']"

O sexto passo é marcar a versão do bugfix . Isso é feito usando o Maven com a opção desejada em Objetivo .
Opção de metas :
-Dtag=%TAG_FROM_VERSION% scm:tag
