Automatización de construcción y despliegue continuo con Subversion y Maven

El siguiente flujo automatiza la actualización del repositorio Subversion, la compilación mediante Maven y la entrega de un artefacto ejecutable a un entorno de proudcción. Todo el proceso se orquesta mediante scripts Bash que se ejecuten en un servidor Linux.

Requisitos previos

  • Maven 3.5.2 o superior: mvn -v
  • Subversion 1.4.0 o superior: svn --version
  • Java 8 configurado en /opt/jdk1.8.0_91
  • rsync instalado para la transferencia de archivos
  1. Actualización del código y generación del artefacto

El script sync_and_build.sh sincroniza el repositorio y ejecuta el ciclo de vida de Maven según el parámetro recibido.

#!/bin/bash
# Uso: ./sync_and_build.sh [test|install|package|clean|compile]

TARGET_DIR="/opt/apps/backend"
REPO_URL="svn://svn.company.com/backend/trunk"

if [[ $# -ne 1 ]]; then
  echo "Modo de empleo:"
  echo "  test     – ejecuta las pruebas unitarias"
  echo "  install  – limpia, compila y empaqueta sin tests"
  echo "  package  – genera el jar saltando los tests"
  echo "  clean    – elimina carpetas target"
  echo "  compile  – compila las fuentes"
  exit 1
fi

echo "[INFO] Iniciando actualización de fuentes..."
cd "$TARGET_DIR"
svn update --non-interactive --trust-server-cert

case "$1" in
  test)
    mvn test
    ;;
  install)
    mvn clean package -DskipTests
    ;;
  package)
    mvn package -DskipTests
    ;;
  clean)
    mvn clean
    ;;
  compile)
    mvn compile
    ;;
  *)
    echo "Parámetro desconocido: $1"
    exit 2
    ;;
esac

  1. Despliegue y arranque del serviico

El script deploy_service.sh copia el jar generado al directorio de versiones, detiene el proceso anterior y levanta la nueva instancia.

#!/bin/bash
# deploy_service.sh update 20240610

ACTION=$1
BUILD_DATE=${2:-$(date +%Y%m%d)}
JAR_NAME="backend-1.0.0.jar"
SRC_PATH="/opt/apps/backend/target"
DST_PATH="/opt/releases/backend/$BUILD_DATE"
RUNTIME_PATH="/opt/runtime/backend"

if [[ "$ACTION" != "update" ]]; then
  echo "Acción no válida. Use: $0 update [fecha]"
  exit 3
fi

mkdir -p "$DST_PATH"
rsync -avz --delete "$SRC_PATH/$JAR_NAME" "$DST_PATH/"
cp -f "$DST_PATH/$JAR_NAME" "$RUNTIME_PATH/$JAR_NAME"

/opt/runtime/backend/bin/stop.sh
sleep 2
/opt/runtime/backend/bin/start.sh
tail -n 50 /opt/runtime/backend/logs/app.log

  1. Detención segura del proceso Java

#!/bin/sh
# stop.sh – mata el proceso que ejecuta el jar

APP_JAR="backend-1.0.0.jar"
PID=$(pgrep -f "$APP_JAR")

if [[ -n "$PID" ]]; then
  echo "Finalizando proceso $PID..."
  kill -9 "$PID"
  sleep 1
else
  echo "No se encontró ningún proceso activo para $APP_JAR"
fi

  1. Arranque con configuración externa

#!/bin/sh
# start.sh – arranca el servicio con propiedades externas

JAVA_HOME="/opt/jdk1.8.0_91"
JAVA_BIN="$JAVA_HOME/bin/java"
APP_JAR="/opt/runtime/backend/backend-1.0.0.jar"
CONFIG_DIR="/opt/runtime/backend/config"

nohup "$JAVA_BIN" \
  -jar "$APP_JAR" \
  --spring.config.name=application-prod \
  --spring.config.location="$CONFIG_DIR/application-prod.properties" \
  --logging.config="$CONFIG_DIR/log4j2.xml" \
  > /opt/runtime/backend/logs/app.log 2>&1 &

echo "Servicio iniciado en segundo plano. Logs en app.log"

Con estos cuatro scripts se cubre todo el flujo: desde la actualización del código hasta la puesta en marcha del artefacto en producción, permitiendo además ejecutar distintas fases del ciclo de vida de Maven según necesidad.

Etiquetas: Subversion maven bash java Spring Boot

Publicado el 9-29 01:02