pipeline { agent any parameters { string( name: 'BRANCH', defaultValue: 'dev', description: 'Ветка для деплоя' ) string( name: 'PORT', defaultValue: '8082', description: 'Порт для запуска admin-panel' ) string( name: 'SERVER', defaultValue: '92.242.61.23', description: 'Сервер для деплоя' ) string( name: 'NETWORK', defaultValue: 'app-network', description: 'Имя сети (будет создана если не существует)' ) string( name: 'DB_PORT', defaultValue: '5454', description: 'Порт для базы данных' ) } stages { stage('Git pull') { steps { cleanWs() script { checkout([ $class: 'GitSCM', branches: [[name: params.BRANCH]], userRemoteConfigs: [[ url: 'https://code.3err0.ru/backdev/admin-panel.git', credentialsId: 'nx-jen' ]] ]) } } } stage('Copy to server') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no ${SSH_USER}@${params.SERVER} ' mkdir -p /opt/deployments/admin-panel-${params.PORT} && rm -rf /opt/deployments/admin-panel-${params.PORT}/* ' sshpass -p '${SSH_PASS}' scp -r -o StrictHostKeyChecking=no \ . \ ${SSH_USER}@${params.SERVER}:/opt/deployments/admin-panel-${params.PORT}/ """ } } } } stage('Deploy admin-panel') { steps { script { def buildTime = sh(script: "TZ='Asia/Novosibirsk' date '+%d-%m-%Y %H:%M:%S'", returnStdout: true).trim() withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no ${SSH_USER}@${params.SERVER} " cd /opt/deployments/admin-panel-${params.PORT} echo '1. Проверяем/создаем сеть ${params.NETWORK}...' if ! docker network ls --format '{{.Name}}' | grep -q '^${params.NETWORK}\$'; then docker network create ${params.NETWORK} echo 'Сеть ${params.NETWORK} создана' else echo 'Сеть ${params.NETWORK} уже существует' fi echo '2. Останавливаем старые контейнеры...' docker stop admin-panel-${params.PORT} 2>/dev/null || echo 'Контейнер приложения не найден' docker rm admin-panel-${params.PORT} 2>/dev/null || echo 'Контейнер приложения не найден' docker stop admin-db-${params.PORT} 2>/dev/null || echo 'Контейнер БД не найден' docker rm admin-db-${params.PORT} 2>/dev/null || echo 'Контейнер БД не найден' echo '3. Запускаем базу данных...' docker run -d \\ --name admin-db-${params.PORT} \\ --network ${params.NETWORK} \\ --network-alias db \\ -p ${params.DB_PORT}:5432 \\ -v admin_db_data_${params.PORT}:/var/lib/postgresql/data \\ -e POSTGRES_DB=admin_db \\ -e POSTGRES_USER=admin \\ -e POSTGRES_PASSWORD=adminDbApp \\ --restart unless-stopped \\ postgres:16 echo '4. Ждем готовности БД...' sleep 5 until docker exec admin-db-${params.PORT} pg_isready -U admin; do echo 'Waiting for database...' sleep 2 done echo 'База данных готова' echo '5. Собираем образ приложения...' docker build --no-cache -t admin-panel-${params.PORT}:latest . echo '6. Запускаем приложение...' docker run -d \\ --name admin-panel-${params.PORT} \\ --network ${params.NETWORK} \\ --network-alias admin \\ --network-alias admin-${params.PORT} \\ -p ${params.PORT}:${params.PORT} \\ -v uploads_data:/data/uploads:rw \\ -e POSTGRES_DB=admin_db \\ -e POSTGRES_USER=admin \\ -e POSTGRES_PASSWORD=adminDbApp \\ -e POSTGRES_PORT=5432 \\ -e POSTGRES_HOST=db \\ -e SERVER_PORT=${params.PORT} \\ -e BUILD_TIME='${buildTime}' \\ --restart unless-stopped \\ admin-panel-${params.PORT}:latest echo '7. Проверка...' sleep 10 if curl -s -f http://localhost:${params.PORT}/actuator/health > /dev/null 2>&1; then echo 'Admin-panel работает на порту ${params.PORT}' echo 'URL: http://${params.SERVER}:${params.PORT}' else echo 'Проверка health не удалась' echo '=== Логи приложения: ===' docker logs admin-panel-${params.PORT} --tail=30 echo '=== Логи БД: ===' docker logs admin-db-${params.PORT} --tail=10 fi " """ } } } } stage('Verify network') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no ${SSH_USER}@${params.SERVER} " echo '=== Контейнеры в сети ${params.NETWORK} ===' docker network inspect ${params.NETWORK} --format='{{range .Containers}}{{.Name}} ({{.IPv4Address}}){{println}}{{end}}' " """ } } } } } post { success { echo "Deployment successful" echo "Admin panel URL: http://${params.SERVER}:${params.PORT}" } failure { echo "Deployment failed for branch ${params.BRANCH} on port ${params.PORT}" } always { echo "Deployment process finished" } } }