pipeline { agent any parameters { string( name: 'BRANCH', defaultValue: 'dev', description: 'Имя ветки' ) string( name: 'DEPLOY_PATH', defaultValue: '/opt/myapp', description: 'Путь на сервере' ) string( name: 'APP_PORT', defaultValue: '3000', description: 'Порт приложения' ) } stages { stage('1. Получение кода') { steps { git( url: 'https://code.3err0.ru/backdev/no-copy.git', branch: params.BRANCH, credentialsId: 'nx-jen' ) sh """ echo "Ветка: ${params.BRANCH}" echo "Файлы:" ls -la """ } } stage('2. Проверка проекта') { steps { script { echo "=== ПРОВЕРКА ПРОЕКТА ===" // Проверяем необходимые файлы if (!fileExists('docker-compose.yml')) { error "❌ docker-compose.yml не найден!" } // Проверяем нужно ли собирать образ def composeContent = readFile('docker-compose.yml') def needsBuild = composeContent.contains('build:') || fileExists('Dockerfile') if (needsBuild) { echo "✓ Нужно собирать Docker образ" if (fileExists('Dockerfile')) { echo "✓ Dockerfile найден" } } else { echo "✓ Используются готовые образы" } } } } // ШАГ 3: Подготовка сервера stage('3. Подготовка сервера') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ echo "Подготавливаю сервер..." # Проверяем Docker Compose sshpass -p '${SSH_PASS}' ssh ${SSH_USER}@92.242.61.23 " echo 'Проверяю Docker...' docker --version || echo 'Docker не установлен' # Устанавливаем Docker Compose если нужно if ! command -v docker-compose &> /dev/null; then echo 'Устанавливаю Docker Compose...' apt-get update && apt-get install -y docker-compose fi docker-compose --version " """ } } } } // ШАГ 4: Копирование файлов stage('4. Копирование файлов на сервер') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ echo "Копирую файлы на сервер..." # 1. Очищаем старую папку sshpass -p '${SSH_PASS}' ssh ${SSH_USER}@92.242.61.23 " rm -rf ${params.DEPLOY_PATH} 2>/dev/null || true mkdir -p ${params.DEPLOY_PATH} " # 2. Копируем ВЕСЬ проект echo "Копирую проект..." tar czf - . | sshpass -p '${SSH_PASS}' ssh ${SSH_USER}@92.242.61.23 "tar xzf - -C ${params.DEPLOY_PATH}" # 3. Проверяем что скопировалось sshpass -p '${SSH_PASS}' ssh ${SSH_USER}@92.242.61.23 " echo 'На сервере в ${params.DEPLOY_PATH}:' cd ${params.DEPLOY_PATH} && ls -la " """ } } } } // ШАГ 5: Запуск приложения stage('5. Запуск приложения') { steps { script { withCredentials([ usernamePassword( credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS' ) ]) { sh """ echo "Запускаю приложение на сервере..." sshpass -p '${SSH_PASS}' ssh ${SSH_USER}@92.242.61.23 " cd ${params.DEPLOY_PATH} echo '=== НАЧАЛО ЗАПУСКА ===' echo 'Директория: \$(pwd)' # Останавливаем старые контейнеры echo 'Останавливаю старые контейнеры...' docker-compose down 2>/dev/null || echo 'Не было запущенных контейнеров' # Запускаем новые echo 'Запускаю приложение...' docker-compose up -d --build # Ждем запуска sleep 5 # Проверяем echo '=== ПРОВЕРКА ===' echo '1. Контейнеры:' docker-compose ps echo '' echo '2. Логи:' docker-compose logs --tail=10 echo '' echo '3. Доступность:' curl -f http://localhost:${params.APP_PORT} && echo '✓ Приложение работает!' || echo '✗ Ошибка доступа' " """ } } } } } }