diff --git a/Dockerfile b/Dockerfile index b6c7e88..df11884 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,40 @@ -# Stage 1: Build -FROM maven:3.9-eclipse-temurin-21-alpine AS build +# --- Stage 1: Dependencias --- +FROM maven:3.9-eclipse-temurin-21-alpine AS deps +WORKDIR /app +# Copiamos solo el pom.xml para descargar librerías (esta capa se cachea) +COPY pom.xml . +COPY application/pom.xml ./application +COPY bootstrap/pom.xml ./bootstrap +COPY domain/pom.xml ./domain +COPY infrastructure/pom.xml ./infrastructure +RUN mvn dependency:go-offline + +# --- Stage 2: Build --- +FROM deps AS build +COPY application/src ./application/src +COPY bootstrap/src ./bootstrap/src +COPY domain/src ./domain/src +COPY infrastructure/src ./infrastructure/src +# Al haber descargado las deps antes, esto es mucho más rápido +RUN mvn clean package -DskipTests -Dmaven.main.skip=false + +# --- Stage 3: Run (Imagen final ultra-ligera) --- +FROM eclipse-temurin:21-jre-alpine WORKDIR /app -# Copiamos todo el proyecto -COPY . . +# Crear un usuario sin privilegios por seguridad y para ahorrar recursos +RUN addgroup -S spring && adduser -S spring -G spring +USER spring:spring -# Compilamos todo el proyecto (todos los módulos) -RUN mvn clean package -DskipTests - -# Stage 2: Run -FROM openjdk:21-jdk -WORKDIR /app COPY --from=build /app/bootstrap/target/*.jar app.jar -EXPOSE 80 -ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-Xmx512m", "-Xms256m", "-jar", "app.jar"] \ No newline at end of file + +# Optimización de flags para APIs pequeñas: +# 1. SerialGC consume menos memoria que G1GC en montones pequeños (< 1GB) +# 2. TieredCompilation ayuda a arrancar más rápido con menos CPU +ENTRYPOINT ["java", \ + "-XX:+UseContainerSupport", \ + "-XX:MaxRAMPercentage=70.0", \ + "-XX:+UseSerialGC", \ + "-XX:TieredStopAtLevel=1", \ + "-Xms64m", \ + "-jar", "app.jar"] \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile index b753785..7cf137a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -70,5 +70,8 @@ pipeline { failure { echo "❌ Pipeline failed!" } + always { + deleteDir() + } } } \ No newline at end of file diff --git a/Makefile b/Makefile index 26a9cc4..2df135d 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,4 @@ +STACK=pablotj-portfolio APP_NAME=pablotj-portfolio-api IMAGE_NAME=$(APP_NAME) @@ -6,7 +7,7 @@ NAMESPACE=andromeda TAG?=latest HOST_PORT=8181 -CONTAINER_PORT=80 +CONTAINER_PORT=8080 IMAGE_FULL=$(REGISTRY_URL)/$(NAMESPACE)/$(IMAGE_NAME):$(TAG) @@ -22,6 +23,9 @@ push: run: docker run -d \ --name $(APP_NAME) \ + --label com.docker.compose.service="$(APP_NAME)" \ + --label com.docker.compose.project="$(STACK)" \ + --network andromeda \ -p $(HOST_PORT):$(CONTAINER_PORT) \ --env-file .env \ $(IMAGE_FULL) diff --git a/infrastructure/src/main/resources/ddl.sql b/infrastructure/src/main/resources/ddl.sql index aaa34af..48fe643 100644 --- a/infrastructure/src/main/resources/ddl.sql +++ b/infrastructure/src/main/resources/ddl.sql @@ -124,11 +124,6 @@ alter table if exists experience_skill foreign key (experience_id) references experience; -alter table if exists profile_social_link - add constraint FKfh1pbfvvg3palcr1yip6jffik - foreign key (PROFILE_ID) - references profile; - alter table if exists project_feature add constraint FKdifppyvrfito5in15ox4db0up foreign key (project_id)