Skip to contentSaltar al contenido
All projectsTodos los proyectosPlatform EngineeringIngeniería de plataforma

Modernising CI/CD for 17 legacy Java applicationsModernización de CI/CD para 17 aplicaciones Java legacy

Turning a Jenkins Freestyle and WebLogic 11g deployment process into a reusable architecture built on Jenkins Pipeline, Shared Libraries, Nexus and WebLogic 14c — without touching the applications' code.Transformar un proceso de despliegue basado en Jenkins Freestyle y WebLogic 11g en una arquitectura reutilizable con Jenkins Pipeline, Shared Libraries, Nexus y WebLogic 14c, sin tocar el código de las aplicaciones.

ClientCliente
ERHARDT Serikat
DurationDedicación
120h of work120h de trabajo
Initial scopeAlcance inicial
17 Java apps17 apps Java
StatusEstado
ValidatedValidado
Jenkins PipelineGroovyJenkins Shared LibraryMavenNexusWebLogic 14cGitLabSSH / SCP
Direct clientCliente directoERHARDT Serikat
End clientCliente finalConfidentialConfidencial
Project typeTipo de proyectoArchitecture and implementation of a CI/CD platformArquitectura e implementación de una plataforma CI/CD
Initial scopeAlcance inicial17 Java enterprise applications, architected to absorb future migrations17 aplicaciones Java enterprise, con arquitectura preparada para nuevas migraciones
Delivered implementationImplementación realizada17 main pipelines, 5 additional variants and one central orchestrator17 pipelines principales, 5 variantes adicionales y un orquestador central
DedicationDedicación120 hours of work120 horas de trabajo
ResponsibilityResponsabilidadAnalysis, design, implementation, testing and technical coordinationAnálisis, diseño, implementación, pruebas y coordinación técnica
Validated environmentEntorno validadoDevelopment, with the legacy platform running in parallelDesarrollo, con la plataforma legacy operativa en paralelo
Delivery statusEstado de la entregaValidated solution, ready for transition to productionSolución validada y preparada para su transición a producción

"The goal wasn't to replace what was old with something more modern. It was to reduce the risk of a complex migration, and turn a process that was hard to maintain into something reusable, traceable and understandable.""El objetivo no era sustituir lo antiguo por algo técnicamente más moderno. Era reducir el riesgo de una migración compleja y convertir un proceso difícil de mantener en una base reutilizable, trazable y comprensible."

A working system that no one could safely change quickly.Un sistema funcional que nadie podía cambiar rápido con seguridad.

Seventeen interdependent Java enterprise applications, deployed through Jenkins Freestyle jobs and application-specific scripts on a legacy WebLogic platform. The brief wasn't just to keep these 17 running — the architecture had to let the client add new migrations over time without a redesign.17 aplicaciones Java enterprise interdependientes, desplegadas mediante jobs Jenkins Freestyle y scripts específicos por aplicación sobre una plataforma WebLogic legacy. El encargo no era solo mantener esas 17 en marcha: la arquitectura debía permitir incorporar nuevas migraciones sin rediseñarla.

What the old process costLo que costaba el proceso anterior
  • Logic duplicated across every application.La lógica estaba duplicada entre aplicaciones.
  • Changes had to be applied job by job.Los cambios debían aplicarse job por job.
  • Configuration, paths and behaviour tightly coupled.Configuración, rutas y comportamiento fuertemente acoplados.
  • Part of the process depended on tacit knowledge and unconventional filesystem structures.Parte del funcionamiento dependía de conocimiento tácito y estructuras de filesystem poco convencionales.
  • A full deployment meant running multiple jobs manually, in a specific order.El despliegue completo exigía ejecutar manualmente varios jobs en un orden concreto.
  • Processes were hard to version, review and evolve safely.Los procesos eran difíciles de versionar, revisar y evolucionar con seguridad.
The hard constraintLa restricción clave

Modernisation had to happen without touching the applications' pom.xml files or code — ruling out an idealised migration where every project adopted one uniform structure.La modernización debía hacerse sin modificar los pom.xml ni el código de las aplicaciones, descartando una migración idealizada con una estructura uniforme para todos los proyectos.

  • Application-specific Maven profiles and filters.Perfiles y filtros Maven específicos.
  • JAR, WAR, EAR and multi-module projects.Proyectos JAR, WAR, EAR y multimódulo.
  • Historic web.xml structures.Estructuras históricas de web.xml.
  • External configuration generated during the build.Configuración externa generada durante el build.
  • Static resources published to Apache.Recursos estáticos publicados en Apache.
  • Different paths, targets and deployment variants.Distintas rutas, targets y variantes de despliegue.

Separate what's common from what's specific — without ignoring real constraints.Separar lo común de lo específico, sin ignorar las restricciones reales.

The core of the solution combined three elements, plus a central orchestrator to run applications in the required order.La pieza central combinó tres elementos, más un orquestador central para ejecutar las aplicaciones en el orden requerido.

Pipeline flow, per applicationFlujo del pipeline, por aplicación
Checkout by branch or tagCheckout por branch o tag
Maven buildBuild Maven
Adaptations for legacy structuresAdaptaciones de estructuras legacy
External configuration generationGeneración de configuración externa
Publication and validation in NexusPublicación y validación en Nexus
Transfer via SSH/SCPTransferencia por SSH/SCP
Optional static-resource publishingPublicación opcional de recursos estáticos
Deployment on WebLogic 14c, with validationDespliegue sobre WebLogic 14c, con validación
LogicLógica

Versioned once in the Shared Library, instead of duplicated across 17+ Freestyle jobs.Versionada una sola vez en la Shared Library, en lugar de duplicada en más de 17 jobs Freestyle.

ConfigurationConfiguración

Externalised via Jenkins Managed Files — changeable without touching pipeline logic.Externalizada mediante Jenkins Managed Files: se puede cambiar sin tocar la lógica de los pipelines.

SecretsSecretos

Stored in Jenkins Credentials, referenced by the pipelines instead of hardcoded.Almacenados en Jenkins Credentials, referenciados por los pipelines en lugar de estar hardcodeados.

Wrapping old scripts isn't modernisation. Absorbing their behaviour is.Envolver scripts antiguos no es modernizar. Absorber su comportamiento, sí.

Normalising web.xmlNormalización de web.xml

Some WAR modules kept their web.xml in non-standard locations. The pipeline split the build into phases — compile, detect WAR modules and their effective paths, normalise the descriptor at the right point in the Maven lifecycle, then continue packaging without a later clean undoing the fix.Algunas aplicaciones WAR mantenían el descriptor web.xml en ubicaciones distintas de las esperadas. La pipeline dividía el build en fases: compilar, detectar los módulos WAR y sus rutas efectivas, normalizar el descriptor en el momento correcto del ciclo Maven, y continuar el empaquetado sin que un clean posterior deshiciera la adaptación.

Externally generated configurationConfiguración externa generada durante el build

Several applications consumed configuration files external to the deployable artefact. The new pipeline preserved this via controlled temp directories: Maven handled filtering and transformation, and the result was distributed to the correct remote filesystem — no config baked into the WAR/EAR.Varias aplicaciones consumían configuración externa al artefacto desplegable. La nueva pipeline mantuvo este comportamiento con directorios temporales controlados: Maven filtraba y transformaba, y el resultado se distribuía al filesystem remoto correspondiente, sin meter configuración dentro del WAR o EAR.

Resolving artefacts in NexusResolución de artefactos en Nexus

Deployment stopped depending on the local build result. Nexus became the source of truth, supporting three modes: build + publish + deploy, build only, or deploy an already-published version — decoupling the build cycle from the deploy cycle.El despliegue dejó de depender del resultado local del build. Nexus pasó a ser la fuente de verdad, con tres modos posibles: build + publicación + despliegue, solo build, o despliegue de una versión ya publicada — desacoplando construcción y despliegue.

Orchestrating dependent applicationsOrquestar aplicaciones dependientes

Applications had to run in a specific sequence. The new orchestrator:Las aplicaciones debían ejecutarse en una secuencia concreta. El nuevo orquestador:

  • Loaded execution order from a Managed File.Cargaba el orden de ejecución desde un Managed File.
  • Ran pipelines sequentially, by the selected variant.Ejecutaba los pipelines secuencialmente, según la variante seleccionada.
  • Accepted branch, tag or version.Aceptaba branch, tag o versión.
  • Allowed starting or stopping at a specific point.Permitía empezar o detener la secuencia en un punto concreto.
  • Stopped on the first failure.Interrumpía la ejecución ante el primer fallo.

A base built to extend, not a closed solution for 17 apps.Una base preparada para crecer, no una solución cerrada para 17 apps.

The first phase considered 34 potential pipelines — 17 applications with two operational variants each. The architecture was designed as an extensible base, not a closed set.La primera fase contemplaba 34 pipelines potenciales: 17 aplicaciones con dos variantes operativas cada una. La arquitectura se diseñó como una base extensible, no como un conjunto cerrado.

17
Main pipelinesPipelines principales
5
Secondary variantsVariantes adicionales
1
Central orchestratorOrquestador central

Tested against real applications in development while the legacy platform stayed available in parallel.Probada sobre aplicaciones reales en desarrollo, mientras la plataforma legacy seguía disponible en paralelo.

  • Maven buildBuild Maven

  • Artefact publication and retrievalPublicación y recuperación de artefactos

  • Configuration transformationsTransformaciones de configuración

  • Apps with and without static resourcesAplicaciones con y sin recursos estáticos

  • Transfers to remote serversTransferencias a servidores remotos

  • Deploy and redeploy on WebLogic 14cDeploy y redeploy sobre WebLogic 14c

  • Technical verification of deploymentsVerificación técnica de los despliegues

  • Sequential execution via the orchestratorEjecución secuencial mediante el orquestador

  • Functional comparison against prior behaviourComparación funcional con el comportamiento anterior

From a collection of one-off jobs to a common, extensible platform.De una colección de jobs específicos a una plataforma común y extensible.

BeforeAntes

Independent Freestyle jobsJobs Freestyle independientes

Hardcoded scriptsScripts hardcodeados

Duplicated logicLógica duplicada

Configuration and secrets coupled togetherConfiguración y secretos acoplados

Manual, per-application changesCambios manuales por aplicación

Sequential deploys run job by jobDespliegues secuenciales ejecutados job a job

Dependence on undocumented knowledgeDependencia de conocimiento no documentado

AfterDespués

Minimal, versioned JenkinsfilesJenkinsfiles mínimos y versionados

One common Shared LibraryUna Shared Library común

Centralised configurationConfiguración centralizada

Secrets managed via CredentialsSecretos gestionados mediante Credentials

Traceable artefacts in NexusArtefactos trazables en Nexus

Build and deploy decoupledBuild y deploy desacoplados

Deploys by branch, tag or published versionDespliegues por branch, tag o versión publicada

Central orchestration with partial executionOrquestación central con ejecución parcial

A pattern ready for new apps, variants and future migrationsPatrón preparado para nuevas apps, variantes y futuras migraciones

Client feedbackFeedback del cliente

Celia is collaborating with us on a complex CI/CD implementation with Jenkins for one of our main clients. Her performance has been excellent — very proactive in proposing alternatives and resolving problems. From the very start she understood the project's needs perfectly. The team values her involvement highly; in fact, the initial scope was expanded because of the trust her work has earned. Highly recommended.Celia está colaborando con nosotros en una compleja implantación de un entorno de CI/CD con Jenkins para uno de nuestros principales clientes. Su desempeño ha sido estupendo, siendo muy proactiva proponiendo alternativas y resolutiva ante los problemas. Desde el primer momento ha comprendido perfectamente las necesidades del proyecto. El equipo de trabajo valora muy positivamente su participación en el proyecto. De hecho, el alcance inicial se ha ampliado por la confianza que han tenido en su trabajo. Recomendable totalmente.

— Director of Projects, ERHARDT Serikat— Directora de Proyectos, ERHARDT Serikat

I owned analysis, design and implementation individually, coordinating with dev and admin teams where access, permissions or behaviour needed validating.Asumí de forma individual el análisis, diseño e implementación, coordinándome con los equipos de desarrollo y administración cuando había que validar accesos, permisos o comportamiento.

  • Reconstructed the system's behaviour with no closed specification.Reconstruir el funcionamiento del sistema sin una especificación cerrada.
  • Identified which behaviours had to be preserved and which could be abstracted.Identificar qué comportamientos debían conservarse y cuáles podían abstraerse.
  • Designed the Jenkinsfile, Shared Library, Managed Files and Credentials architecture.Diseñar la arquitectura de Jenkinsfiles, Shared Library, Managed Files y Credentials.
  • Implemented the pipelines and the orchestrator.Implementar los pipelines y el orquestador.
  • Adapted the process to heterogeneous applications without touching their code.Adaptar el proceso a aplicaciones heterogéneas sin modificar su código.
  • Resolved Maven, Nexus, SSH, filesystem and WebLogic issues.Resolver problemas de Maven, Nexus, SSH, filesystem y WebLogic.
  • Validated the result against real applications.Validar el resultado sobre aplicaciones reales.
  • Documented and transferred the knowledge needed to extend the platform.Documentar y transferir el conocimiento para extender la plataforma.
  • Understand before replacing.Comprender antes de sustituir.
  • Look for real behaviour, not just available documentation.Buscar el comportamiento real, no solo la documentación disponible.
  • Reduce uncertainty before proposing change.Reducir incertidumbre antes de proponer cambios.
  • Modernise without denying the context's constraints.Modernizar sin negar las restricciones del contexto.
  • Design common mechanisms without forcing artificial uniformity.Diseñar mecanismos comunes sin forzar una homogeneidad artificial.
  • Prioritise traceability, maintainability and operability.Priorizar trazabilidad, mantenibilidad y capacidad de operación.
  • Leave a solution the team can understand and extend on its own.Dejar una solución que el equipo pueda entender y extender solo.

The most important decision wasn't technological. It was separating what's common from what's specific, without ignoring the system's real constraints.La decisión más relevante no fue tecnológica. Fue separar lo común de lo específico sin ignorar las restricciones reales del sistema.

Have a system like this one?¿Tienes un sistema parecido?

The first conversation is just about understanding what you have — no pitch, no obligation.La primera conversación consiste solo en entender lo que tienes, sin propuesta comercial ni compromiso.

This case study describes work delivered for ERHARDT Serikat on behalf of one of its clients. Internal application, server and configuration names have been omitted or anonymised.Este caso de estudio describe el trabajo realizado para ERHARDT Serikat en un proyecto para uno de sus clientes. Nombres de aplicaciones, servidores y configuración se han omitido o anonimizado.