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_HOST', defaultValue: 'db', 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} " rm -rf /opt/deployments/admin-panel-${params.PORT}/* mkdir -p /opt/deployments/admin-panel-${params.PORT} " sshpass -p '${SSH_PASS}' rsync -av --delete \\ --exclude=.git \\ --exclude=.gradle \\ --exclude=build \\ --exclude=**/build \\ --exclude=.idea \\ --exclude=out \\ . ${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' ), string(credentialsId: 'DB_USER', variable: 'DB_USER'), string(credentialsId: 'DB_PASSWORD', variable: 'DB_PASSWORD') ]) { 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 'Контейнер не найден' echo '3. Собираем образ...' docker build --no-cache -t admin-panel-${params.PORT}:latest . echo '4. Запускаем контейнер...' 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=no_copy_ \\ -e POSTGRES_USER=${DB_USER} \\ -e POSTGRES_PASSWORD=${DB_PASSWORD} \\ -e POSTGRES_PORT=5432 \\ -e POSTGRES_HOST=${params.DB_HOST} \\ -e SERVER_PORT=${params.PORT} \\ -e BUILD_TIME='${buildTime}' \\ --restart unless-stopped \\ admin-panel-${params.PORT}:latest echo '5. Проверка...' 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 не удалась' docker logs admin-panel-${params.PORT} --tail=20 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='{{.Name}}: {{range .Containers}}{{.Name}} {{end}}' echo 'Проверяем алиас admin для контейнера admin-panel-${params.PORT}' docker inspect admin-panel-${params.PORT} | grep -A 5 'Aliases' " """ } } } } } 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" } } }