pipeline { agent any parameters { string( name: 'BRANCH', defaultValue: 'main', description: 'Ветка для деплоя' ) string( name: 'PORT', defaultValue: '2998', description: 'Порт для запуска экземпляра' ) } stages { stage('Git pull') { steps { script { checkout([ $class: 'GitSCM', branches: [[name: params.BRANCH]], userRemoteConfigs: [[ url: 'https://code.3err0.ru/frontdev/no-copy-frontend.git', credentialsId: 'nx-jen' ]] ]) } } } stage('Stop old') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ sshpass -p '$SSH_PASS' ssh $SSH_USER@92.242.61.23 " docker stop no-copy-frontend-${params.PORT} 2>/dev/null || true docker rm no-copy-frontend-${params.PORT} 2>/dev/null || true cd /opt/deployments/frontend/${params.BRANCH}-${params.PORT} 2>/dev/null || mkdir -p /opt/deployments/frontend/${params.BRANCH}-${params.PORT} if [ -f 'docker-compose.yaml' ]; then docker-compose -f docker-compose.yaml -p frontend-${params.PORT} down 2>/dev/null || true elif [ -f 'docker-compose.yml' ]; then docker-compose -f docker-compose.yml -p frontend-${params.PORT} down 2>/dev/null || true fi " """ } } } } stage('Copy to server') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ sshpass -p '$SSH_PASS' ssh $SSH_USER@92.242.61.23 " rm -rf /opt/deployments/frontend/${params.BRANCH}-${params.PORT}/* mkdir -p /opt/deployments/frontend/${params.BRANCH}-${params.PORT} " sshpass -p '$SSH_PASS' scp -r ./* $SSH_USER@92.242.61.23:/opt/deployments/frontend/${params.BRANCH}-${params.PORT}/ """ } } } } stage('Build on server') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ sshpass -p '$SSH_PASS' ssh $SSH_USER@92.242.61.23 " cd /opt/deployments/frontend/${params.BRANCH}-${params.PORT} echo '=== Редактируем docker-compose.yml ===' # Меняем имя контейнера sed -i 's/container_name: no-copy-frontend\$/container_name: no-copy-frontend-${params.PORT}/' docker-compose.yml # Меняем порт (2998 на нужный порт) sed -i 's/\\\"2998:2999\\\"/\\\"${params.PORT}:2999\\\"/' docker-compose.yml echo 'Проверяем изменения:' grep -n 'container_name\\|ports' docker-compose.yml echo '=== Строим образ ===' docker-compose -f docker-compose.yml -p frontend-${params.PORT} build " """ } } } } stage('Start on server') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ sshpass -p '$SSH_PASS' ssh $SSH_USER@92.242.61.23 " cd /opt/deployments/frontend/${params.BRANCH}-${params.PORT} echo '=== Запускаем контейнер ===' docker-compose -f docker-compose.yml -p frontend-${params.PORT} up -d sleep 10 echo '=== Проверяем запуск ===' if docker ps --format '{{.Names}}' | grep -q 'no-copy-frontend-${params.PORT}'; then echo '✓ Контейнер запущен: no-copy-frontend-${params.PORT}' echo '✓ Порт: ${params.PORT}:2999' else echo '✗ Контейнер не запустился' echo 'Логи:' docker-compose -f docker-compose.yml -p frontend-${params.PORT} logs exit 1 fi " """ } } } } stage('Check status') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ sshpass -p '$SSH_PASS' ssh $SSH_USER@92.242.61.23 " # Ищем контейнер с правильным именем (с портом) if docker ps --format '{{.Names}}' | grep -q 'no-copy-frontend-${params.PORT}'; then echo 'Container started: no-copy-frontend-${params.PORT}' sleep 5 HTTP_CODE=\$(curl -s -o /dev/null -w '%{http_code}' http://localhost:${params.PORT} || echo '000') echo 'HTTP code: \$HTTP_CODE' echo 'Frontend available on http://92.242.61.23:${params.PORT}' # Показываем все фронтенды echo '' echo 'All frontend containers:' docker ps --filter name=no-copy-frontend --format 'table {{.Names}}\\t{{.Ports}}\\t{{.Status}}' else echo 'Exception: container did not start' docker ps -a | grep frontend exit 1 fi " """ } } } } } post { success { echo "Front branch ${params.BRANCH} deployment completed" echo "Frontend available on http://92.242.61.23:${params.PORT}" echo "Container: no-copy-frontend-${params.PORT}" } failure { echo "Deployment failed" } } }