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
- 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
- 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
- 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
- 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.