Automatización de HotFix en proyectos Maven usando TeamCity

Esta publicación describirá la configuración de la automatización HotFix en proyectos Maven usando Teamcity.

Para realizar HotFix, generalmente se realizan muchos pasos manuales:

  1. Cree un brunch para el lanzamiento en el que desea implementar HotFix
  2. Corregir un error en el lanzamiento
  3. Cambiar la versión de corrección de errores en la rama de lanzamiento
  4. Implementar etiqueta de versión de corrección de errores

Los puntos 1,3,4 se pueden automatizar.

Antes de pasar al tema, me gustaría tocar un tema importante y complejo: versionando software. Puedes entender brevemente a Semver en esta captura de pantalla. Automatización de HotFix en proyectos Maven usando TeamCity

Puedes leer más en el enlace: 1.

Todas las configuraciones descritas en esta publicación se basan en semver и Desarrollo basado en troncales.

En el desarrollo basado en troncales, debe crear su propia rama para cada versión. Todos los cambios (revisiones) dentro de esta versión están comprometidos en esta rama.

Como parte de esta publicación, automatizaremos las siguientes cosas:

  • construcción de CI

  • Creando una nueva versión

  • Creando una rama de lanzamiento

  • Cambiar la versión de corrección de errores

Automatización de HotFix en proyectos Maven usando TeamCity

requisitos:

Creemos el proyecto "Automation Maven Hotfix" en Teamcity y creemos 4 tareas allí.

  • Construcción de CI

  • Crear rama para lanzamiento

  • Corrección de errores de incremento de Maven (Cambiar versión de corrección de errores))

  • Versión de Maven (Creación de una nueva versión)

Captura de pantalla del proyecto:

Automatización de HotFix en proyectos Maven usando TeamCity

Configuraciones generales

En todas las tareas deberás marcar la casilla "Compilación limpia: elimine todos los archivos en el directorio de pago antes de la compilación“, porque sin esta casilla de verificación recibí errores.

Creamos un único VCS. Las funciones de VCS están rodeadas de un círculo rojo.

Automatización de HotFix en proyectos Maven usando TeamCity

Normalmente, los VCS utilizan el esquema HTTPS. EN Especificación de sucursal: indicado para ver todos los brunch y todas las etiquetas:

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

Es necesario crear 4 Parámetros de Configuración.

  • BRANCH_FOR_INCREMENT
  • TAG_FROM_VERSION
  • EQUIPO_USUARIO
  • EQUIPO_USUARIO_EMAIL

El campo de valor en BRANCH_FOR_INCREMENT y TAG_FROM_VERSION debe dejarse vacío.

Automatización de HotFix en proyectos Maven usando TeamCity

Necesita cargar/agregar una clave privada. Todas las tareas excepto CI Build requieren una clave privada.

Automatización de HotFix en proyectos Maven usando TeamCity

En cada tarea, excepto CI Build, en la sección Funciones de compilación debe conectar una clave privada.

Ejemplo para Lanzamiento de Maven

Automatización de HotFix en proyectos Maven usando TeamCity

Construcción de CI**.

en una tarea Construcción de CI solo un paso prueba limpia mvn

Automatización de HotFix en proyectos Maven usando TeamCity

Lanzamiento de Maven

en una tarea Lanzamiento de Maven 2 pasos. El primer paso es comprobar que el brunch sea dominar. Si el brunch no es dominar, entonces la tarea cae.

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

Automatización de HotFix en proyectos Maven usando TeamCity

El segundo paso es estándar. lanzamiento de mvn: preparar con opción --por lotes

Automatización de HotFix en proyectos Maven usando TeamCity

Crear rama para lanzamiento

Para crear una revisión para una versión, necesita crear una rama. Esto es lo que hace el taska. Crear rama para lanzamiento. Ella tiene 2 pasos.

El primer paso comprueba que el brunch no sea dominar, y el segundo comprueba que la versión esté en el archivo pom.xml no contenía la palabra INSTANTÁNEA

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

Automatización de HotFix en proyectos Maven usando TeamCity

El segundo paso cambia el esquema de conexión en DeveloperConnection de HTTPS a 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

Automatización de HotFix en proyectos Maven usando TeamCity

Corrección de errores de incremento de Maven

La tarea consta de 6 partes. Podría haber sido refactorizado, pero aún funciona.

El primer paso es comprobar que el brunch no está dominar. si brunch dominar la tarea cae.

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

Automatización de HotFix en proyectos Maven usando TeamCity

El segundo paso de Maven es cambiar la versión de corrección de errores en el archivo pom.xml.

Metas: Maven tiene todo en una sola línea

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

Automatización de HotFix en proyectos Maven usando TeamCity

El tercer paso es mostrar información de estado de Git y otros:

echo 'cat pom.xml'
cat pom.xml
echo 'git status'
git status
echo 'git remote -v'
git remote -v
echo 'git branch'
git branch

Automatización de HotFix en proyectos Maven usando TeamCity

El cuarto paso cambia el esquema de conexión en DeveloperConnection de HTTPS a GIT.

Y envía cambios a la rama especificada en Teamcity mediante la variable %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%

Automatización de HotFix en proyectos Maven usando TeamCity

El quinto paso es obtener del archivo. pom.xml versión y la instala en Ciudad del equipo variable TAG_FROM_VERSION. Tenga en cuenta que la versión del archivo pom.xml sin la letra v delante. Y la etiqueta, basada en esta versión, ya tiene la letra v al principio.

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

Automatización de HotFix en proyectos Maven usando TeamCity

Sexto paso: etiquetado de corrección de errores versiones. Esto se hace usando Maven con la opción requerida en Objetivo.

Opcion Goals:

-Dtag=%TAG_FROM_VERSION% scm:tag

Automatización de HotFix en proyectos Maven usando TeamCity

Fuente: habr.com

Añadir un comentario