HotFix de automação em projetos Maven usando TeamCity

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:


  1. Crie um brunch para a versão para a qual você deseja lançar o HotFix
  2. Corrigir bug de lançamento
  3. Alterar versão do bugfix no brunch de lançamento
  4. 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:


  • Montagem de IC


  • Criar nova versão


  • Criando um brunch para liberação


  • Alterando a versão do bugfix




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.


 #   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 


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


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%


 #   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% 


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 

Source: https://habr.com/ru/post/pt483242/


All Articles