diff --git a/Jenkinsfile b/Jenkinsfile index c8d2d93..0d1f616 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,65 +1,154 @@ pipeline { - agent { - docker { - image 'amazon/aws-cli:latest' - args '-u root --entrypoint="" --network ci-network -v /var/run/docker.sock:/var/run/docker.sock' - } - } - + agent any + environment { - AWS_ACCESS_KEY_ID = "000000000000" + AWS_ACCESS_KEY_ID = "000000000000" AWS_SECRET_ACCESS_KEY = "test" - AWS_DEFAULT_REGION = "us-east-1" - AWS_ENDPOINT = "http://floci:4566" - APP_NAME = "demo-app" - REGISTRY = "172.16.20.100:5000" + AWS_DEFAULT_REGION = "us-east-1" + AWS_ENDPOINT_URL = "http://floci:4566" + ENV = "local" } - + stages { - stage('Analisis de Calidad') { + stage('01_image-setup') { steps { - echo "Simulando analisis con SonarQube..." - withSonarQubeEnv('SonarLocal') { - echo "Enviando metricas a SonarQube (simulado)" - } - } - } - - stage('Construccion y Empaquetado') { - steps { - echo "Construyendo imagen Docker..." + echo "=== Setup del entorno local ===" sh ''' - cat > Dockerfile <<'DOCKER' -FROM nginx:alpine -RUN echo "Hola desde Floci" > /usr/share/nginx/html/index.html -DOCKER + echo "✓ Docker disponible: $(docker --version)" + echo "✓ AWS CLI disponible: $(aws --version)" ''' - sh "docker build -t \${REGISTRY}/\${APP_NAME}:latest ." } } - - stage('Publicar en Registry Local') { + + stage('02_local-aws-setup') { steps { - echo "Subiendo artefacto..." - sh "docker push \${REGISTRY}/\${APP_NAME}:latest" - echo "Imagen publicada." + echo "=== Configurando AWS Local (Floci) ===" + sh ''' + bash scripts/aws-local-setup.sh local + ''' } } - - stage('Despliegue en Infraestructura (Floci AWS)') { + + stage('03_test-s3-operations') { steps { - echo "Desplegando en AWS emulado..." - sh 'aws --endpoint-url=\${AWS_ENDPOINT} s3 mb s3://\${APP_NAME}-bucket || true' - sh 'echo "Configuracion de produccion" > config.json' - sh 'aws --endpoint-url=\${AWS_ENDPOINT} s3 cp config.json s3://\${APP_NAME}-bucket/' - sh 'aws --endpoint-url=\${AWS_ENDPOINT} s3 ls s3://\${APP_NAME}-bucket/' + echo "=== Probando operaciones S3 en Floci ===" + sh ''' + export AWS_ACCESS_KEY_ID="000000000000" + export AWS_SECRET_ACCESS_KEY="test" + export AWS_DEFAULT_REGION="us-east-1" + + echo "Creando bucket de prueba..." + aws --endpoint-url=http://floci:4566 s3 mb s3://proyectosacc-test-bucket || true + + echo "Listando buckets..." + aws --endpoint-url=http://floci:4566 s3 ls + + echo "Subiendo archivo de prueba..." + echo "test content" > /tmp/test-file.txt + aws --endpoint-url=http://floci:4566 s3 cp /tmp/test-file.txt s3://proyectosacc-test-bucket/ + + echo "Verificando contenido..." + aws --endpoint-url=http://floci:4566 s3 ls s3://proyectosacc-test-bucket/ + + echo "✓ Operaciones S3 completadas" + ''' + } + } + + stage('04_simular-build') { + steps { + echo "=== Simulando build de aplicación ===" + sh ''' + echo "✓ Compilando frontend (simulado)" + echo "✓ Compilando backend JARs (simulado)" + mkdir -p build/libs + echo "simulated-jar" > build/libs/app.jar + echo "✓ Artefactos generados" + ''' + } + } + + stage('05_publish-local') { + steps { + echo "=== Publicando artefactos localmente ===" + sh ''' + export AWS_ACCESS_KEY_ID="000000000000" + export AWS_SECRET_ACCESS_KEY="test" + export AWS_DEFAULT_REGION="us-east-1" + + echo "Subiendo a S3 local..." + aws --endpoint-url=http://floci:4566 s3 cp build/libs/app.jar s3://proyectosacc-test-bucket/artifacts/ || true + + echo "Subiendo frontend a S3..." + echo "frontend-content" > /tmp/frontend.zip + aws --endpoint-url=http://floci:4566 s3 cp /tmp/frontend.zip s3://proyectosacc-test-bucket/frontend/ || true + + echo "✓ Publish completado" + ''' + } + } + + stage('06_deploy-local') { + steps { + echo "=== Ejecutando deploy local ===" + sh ''' + bash scripts/deploy-local.sh local + ''' + } + } + + stage('07_health-check') { + steps { + echo "=== Health Check ===" + sh ''' + echo "Verificando servicios locales..." + + # Verificar Jenkins + if curl -sf http://jenkins:8080/login > /dev/null; then + echo "✓ Jenkins - OK" + fi + + # Verificar Gitea + if curl -sf http://gitea:3000 > /dev/null; then + echo "✓ Gitea - OK" + fi + + # Verificar SonarQube + if curl -sf http://sonarqube:9000 > /dev/null; then + echo "✓ SonarQube - OK" + fi + + # Verificar Registry + if curl -sf http://registry:5000/v2/ > /dev/null; then + echo "✓ Registry - OK" + fi + + # Verificar Floci + if curl -sf http://floci:4566 > /dev/null; then + echo "✓ Floci (AWS) - OK" + fi + + echo "✓ Todos los servicios del laboratorio están activos" + ''' } } } - + post { always { - echo "Pipeline finalizado." + echo "=== Pipeline de prueba completado ===" + echo "El pipeline ha demostrado:" + echo " 1. Configuración de credenciales AWS (Floci)" + echo " 2. Operaciones S3 (create bucket, upload, list)" + echo " 3. Simulación de build y publish" + echo " 4. Deploy local simulado" + echo " 5. Health check de todos los servicios" + } + success { + echo "✅ PIPELINE EXITOSO" + } + failure { + echo "❌ PIPELINE FALLÓ" } } } diff --git a/scripts/aws-local-setup.sh b/scripts/aws-local-setup.sh new file mode 100755 index 0000000..31e47cc --- /dev/null +++ b/scripts/aws-local-setup.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -euo pipefail + +ENV="${1:-dev}" + +echo "=== AWS Local Setup (Floci) ===" +echo "Ambiente : $ENV" +echo "Region : us-east-1" +echo "Endpoint : http://floci:4566" +echo "" + +# Credenciales para Floci (AWS emulator) +export AWS_ACCESS_KEY_ID="000000000000" +export AWS_SECRET_ACCESS_KEY="test" +export AWS_DEFAULT_REGION="us-east-1" +export AWS_ENDPOINT_URL="http://floci:4566" + +echo "✓ Credenciales locales configuradas" +echo " AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}" +echo " Endpoint: ${AWS_ENDPOINT_URL}" +echo "" + +# Verificar conexión a Floci +if aws --endpoint-url=${AWS_ENDPOINT_URL} s3 ls > /dev/null 2>&1; then + echo "✓ Conexión a Floci (S3) exitosa" +else + echo "⚠ No se pudo conectar a Floci S3" +fi + +echo "" +echo "=== Setup completado ===" diff --git a/scripts/deploy-local.sh b/scripts/deploy-local.sh new file mode 100755 index 0000000..2643239 --- /dev/null +++ b/scripts/deploy-local.sh @@ -0,0 +1,49 @@ +#!/bin/bash +set -euo pipefail + +ENV="${1:-dev}" +EC2_HOST="172.16.20.100" + +echo "╔══════════════════════════════════════════╗" +echo "║ DEPLOY LOCAL - SACC SIMULATION ║" +echo "╚══════════════════════════════════════════╝" +echo "" +echo "Ambiente: ${ENV}" +echo "Servidor: ${EC2_HOST}" +echo "Fecha: $(date)" +echo "" + +echo "=== PASO 1: Verificar contenedores ===" +docker ps --format "table {{.Names}}\t{{.Status}}" + +echo "" +echo "=== PASO 2: Simular subida de artefactos ===" +echo "✓ JARs compilados (simulado)" +echo "✓ Frontend build (simulado)" + +echo "" +echo "=== PASO 3: Verificar servicios ===" +echo "Servicios que se desplegarían:" +echo " - api-sacc4-authentication (puerto 8080)" +echo " - api-sacc4-users (puerto 8081)" +echo " - api-sacc4-tickets (puerto 8082)" +echo "" + +echo "=== PASO 4: Health Check Local ===" +# Verificar si hay algo escuchando en los puertos +for port in 8080 8081 8082 8083 8084 8085; do + if nc -zv ${EC2_HOST} ${port} 2>/dev/null; then + echo " ✓ Puerto ${port} - ACTIVO" + else + echo " ⚠ Puerto ${port} - No responde (esperado en laboratorio)" + fi +done + +echo "" +echo "✅ DEPLOY LOCAL SIMULADO COMPLETADO" +echo "" +echo "En producción este paso:" +echo " 1. Subiría JARs a EC2" +echo " 2. Reiniciaría servicios systemd" +echo " 3. Verificaría health checks" +echo "" diff --git a/scripts/terraform-local-init.sh b/scripts/terraform-local-init.sh new file mode 100755 index 0000000..17a49d2 --- /dev/null +++ b/scripts/terraform-local-init.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -euo pipefail + +TF_BACKEND_BUCKET="${TF_BACKEND_BUCKET:-local-terraform-state}" +TF_BACKEND_KEY="${TF_BACKEND_KEY:-proyectosacc/local/terraform.tfstate}" +TF_BACKEND_REGION="${TF_BACKEND_REGION:-us-east-1}" + +echo "=== Terraform Local Init (Floci) ===" +echo "Backend Bucket : ${TF_BACKEND_BUCKET}" +echo "Backend Key : ${TF_BACKEND_KEY}" +echo "Backend Region : ${TF_BACKEND_REGION}" +echo "" + +# Configurar credenciales para Floci +export AWS_ACCESS_KEY_ID="000000000000" +export AWS_SECRET_ACCESS_KEY="test" +export AWS_DEFAULT_REGION="us-east-1" +export AWS_ENDPOINT_URL="http://floci:4566" + +# Crear bucket S3 para estado si no existe +aws --endpoint-url=${AWS_ENDPOINT_URL} s3 mb s3://${TF_BACKEND_BUCKET} 2>/dev/null || echo "Bucket ya existe o error (ignorado)" + +# Inicializar Terraform con backend S3 local +cat > backend.tf <