pipeline { agent any parameters { string( name: 'BRANCH', defaultValue: 'dev', description: 'Ветка для деплоя' ) string( name: 'SERVER', defaultValue: '92.242.61.23', description: 'Сервер для деплоя' ) } stages { stage('Git pull') { steps { script { checkout([ $class: 'GitSCM', branches: [[name: params.BRANCH]], userRemoteConfigs: [[ url: 'https://code.3err0.ru/backdev/no-copy.git', credentialsId: 'nx-jen' ]] ]) } } } stage('Deploy with docker-compose') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ echo "Deploying branch: ${params.BRANCH}" echo "Copying files to server..." sshpass -p '$SSH_PASS' ssh $SSH_USER@$SERVER "mkdir -p /opt/deployments/${params.BRANCH}" sshpass -p '$SSH_PASS' scp -r ./* $SSH_USER@$SERVER:/opt/deployments/${params.BRANCH}/ sshpass -p '$SSH_PASS' ssh $SSH_USER@$SERVER " cd /opt/deployments/${params.BRANCH} echo 'Step 1: Checking current state...' # Смотрим что запущено docker ps --filter 'name=postgres|app-backend' --format 'table {{.Names}}\\t{{.Image}}\\t{{.Status}}\\t{{.Ports}}' echo 'Step 2: Force cleanup old application...' # Принудительно удаляем старый контейнер и образ docker stop app-backend 2>/dev/null || echo 'App not running' docker rm app-backend 2>/dev/null || echo 'App not found' docker rmi app-backend:latest 2>/dev/null || echo 'Image not found' # Удаляем все образы app-backend docker images --filter 'reference=app-backend*' -q | xargs -r docker rmi 2>/dev/null || echo 'No images to remove' echo 'Step 3: Verify copied files...' echo 'Files in directory:' ls -la echo '' echo 'Checking Java sources:' find . -name '*.java' | head -2 echo 'Step 4: Check if PostgreSQL is running...' if ! docker ps | grep -q postgres; then echo 'Starting PostgreSQL...' docker-compose up -d db sleep 10 else echo 'PostgreSQL already running' fi echo 'Step 5: Build application with forced rebuild...' echo 'Checking Dockerfile exists:' ls -la Dockerfile 2>/dev/null || echo 'Dockerfile not found, creating simple one' # Если нет Dockerfile, создаем простой if [ ! -f Dockerfile ]; then echo 'Creating simple Dockerfile...' cat > Dockerfile << 'EOF' FROM eclipse-temurin:21-jre WORKDIR /app COPY . /app/ CMD ["java", "-jar", "app.jar"] EOF fi # Собираем с подробным выводом echo 'Building Docker image...' docker build --no-cache --progress=plain -t app-backend:latest . 2>&1 | tail -50 echo 'Step 6: Verify new image...' echo 'Current app-backend images:' docker images | grep app-backend echo 'Image creation time:' docker inspect app-backend:latest --format='{{.Created}}' 2>/dev/null || echo 'Cannot inspect image' echo 'Step 7: Starting application with alias...' docker run -d \\ --name app-backend \\ --network app-network \\ --network-alias app \\ -p 80:8080 \\ -e POSTGRES_DB=no_copy_ \\ -e POSTGRES_USER=postgres \\ -e POSTGRES_PASSWORD=postgres \\ -e POSTGRES_PORT=5432 \\ -e POSTGRES_HOST=db \\ --restart unless-stopped \\ app-backend:latest echo 'Step 8: Checking deployment...' sleep 10 echo 'Containers status:' docker ps --filter 'name=postgres|app-backend' --format 'table {{.Names}}\\t{{.Image}}\\t{{.Status}}\\t{{.CreatedAt}}' echo 'Checking image inside container:' docker exec app-backend ls -la /app/ 2>/dev/null || echo 'Cannot check container files' echo 'Application logs (last 10 lines):' docker logs --tail=10 app-backend 2>/dev/null || echo 'Logs not available yet' echo 'Step 9: Health check...' if docker ps | grep -q app-backend; then echo 'Container is running' echo 'Testing application health...' for i in {1..5}; do if curl -s -f http://localhost:80/health > /dev/null 2>&1; then echo 'Health check passed' echo 'Deployment successful' echo 'Application URL: http://${params.SERVER}:80' exit 0 fi echo 'Waiting for application to start... attempt ' \$i sleep 5 done echo 'Health check failed, but container is running' echo 'Application might be starting slowly' echo 'Application URL: http://${params.SERVER}:80' else echo 'Application failed to start' docker logs app-backend exit 1 fi " """ } } } } } post { success { echo "Deployment successful" echo "Application URL: http://${params.SERVER}:80" } failure { echo "Deployment failed for branch ${params.BRANCH}" } always { echo "Deployment process finished" } } }