From 39e43934204f63b23abbe7a2428208b8a6e4da94 Mon Sep 17 00:00:00 2001 From: Pablo de la Torre Jamardo Date: Sat, 21 Feb 2026 09:26:25 +0100 Subject: [PATCH] ci: implements jenkins deploy --- Dockerfile | 14 ++++++++++ Jenkinsfile | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 38 ++++++++++++++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 Dockerfile create mode 100644 Jenkinsfile create mode 100644 Makefile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..87059b4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +# Stage 1: build +FROM node:20-alpine AS build +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . +RUN npm run build # Esto genera /dist + +# Stage 2: serve con Nginx +FROM nginx:alpine +COPY --from=build /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..7cf137a --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,77 @@ +pipeline { + agent any + + environment { + REGISTRY_URL = "registry.pablotj.com" + USER = "andromeda" + PASS = credentials('docker-registry-password') + } + + stages { + stage('Prepare Workspace & Checkout') { + steps { + echo "Cleaning workspace" + deleteDir() + } + } + + + stage('Checkout') { + steps { + echo "Checking out repo..." + checkout scm + } + } + + stage('Load Environment') { + steps { + echo "Loading .env secret from Jenkins..." + withCredentials([file(credentialsId: 'env', variable: 'SECRET_ENV')]) { + sh 'cp $SECRET_ENV .env' + } + } + } + + stage('Build and Tag Docker Image') { + steps { + echo "Building Docker image..." + sh ''' + make build + make tag + ''' + } + } + + stage('ush Docker Image') { + steps { + echo "Tagging and pushing Docker image to registry..." + sh ''' + echo $PASS | docker login ${REGISTRY_URL} -u ${USER} --password-stdin + make push + ''' + } + } + + stage('Deploy Docker Container') { + steps { + echo "Stopping old container and running new container..." + sh ''' + make stop + make run + ''' + } + } + } + + post { + success { + echo "✅ Deployment completed successfully!" + } + failure { + echo "❌ Pipeline failed!" + } + always { + deleteDir() + } + } +} \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..df9ee02 --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ +STACK=pablotj-portfolio +APP_NAME=pablotj-portfolio-web +IMAGE_NAME=$(APP_NAME) + +REGISTRY_URL=registry.pablotj.com +NAMESPACE=andromeda +TAG?=latest + +HOST_PORT=8180 +CONTAINER_PORT=80 + +IMAGE_FULL=$(REGISTRY_URL)/$(NAMESPACE)/$(IMAGE_NAME):$(TAG) + +build: + docker build -t $(IMAGE_NAME):$(TAG) . + +tag: + docker tag $(IMAGE_NAME):$(TAG) $(IMAGE_FULL) + +push: + docker push $(IMAGE_FULL) + +run: + docker run -d \ + --name $(APP_NAME) \ + --name mi-contenedor-suelto \ + --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) + +stop: + docker stop $(APP_NAME) || true + docker rm $(APP_NAME) || true + +deploy: build tag push stop run \ No newline at end of file