diff --git a/infra/deploy.groovy b/infra/deploy.groovy index d772217..cc9b146 100644 --- a/infra/deploy.groovy +++ b/infra/deploy.groovy @@ -9,13 +9,18 @@ pipeline { ) string( name: 'DEPLOY_PATH', - defaultValue: '/opt/test-app', - description: 'Путь на сервере для деплоя' + defaultValue: '/opt/myapp', + description: 'Путь на сервере' + ) + string( + name: 'APP_PORT', + defaultValue: '3000', + description: 'Порт приложения' ) } stages { - stage('1. Checkout из Git') { + stage('1. Получение кода') { steps { git( url: 'https://code.3err0.ru/backdev/no-copy.git', @@ -23,100 +28,151 @@ pipeline { credentialsId: 'nx-jen' ) - echo "✓ Код успешно загружен из ветки: ${params.BRANCH}" - } - } - - stage('2. Проверка файлов') { - steps { - script { - sh """ - echo "=== ФАЙЛЫ В РЕПОЗИТОРИИ ===" - ls -la - - echo "" - echo "=== DOCKER-COMPOSE.YAML ===" - if [ -f "docker-compose.yaml" ]; then - echo "✓ docker-compose.yaml найден" - cat docker-compose.yaml - else - echo "✗ docker-compose.yaml не найден" - echo "Создаем тестовый docker-compose.yaml..." - cat > docker-compose.yaml << EOF - version: '3.8' - services: - web: - image: nginx:alpine - container_name: web-${params.BRANCH} - ports: - - "8080:80" - restart: unless-stopped - EOF - echo "Тестовый docker-compose.yaml создан" - fi - """ - } - } - } - - stage('3. Деплой на сервер (с паролем)') { - steps { - script { - echo "=== ДЕПЛОЙ НА СЕРВЕР ===" - echo "Сервер: 92.242.61.23" - echo "Путь: ${params.DEPLOY_PATH}" + sh """ echo "Ветка: ${params.BRANCH}" - } + echo "Файлы:" + ls -la + """ + } + } - withCredentials([ - usernamePassword( - credentialsId: 'server-root-password', - usernameVariable: 'SSH_USER', - passwordVariable: 'SSH_PASS' - ) - ]) { - script { + 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 "Начинаем деплой..." + echo "Подготавливаю сервер..." - # Устанавливаем sshpass если нет - if ! command -v sshpass &> /dev/null; then - echo "Устанавливаем sshpass..." - apt-get update && apt-get install -y sshpass - fi + # Проверяем 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 -o StrictHostKeyChecking=no -o ConnectTimeout=10 ${SSH_USER}@92.242.61.23 " - echo 'Создаю папку ${params.DEPLOY_PATH}...' + # 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} - echo 'Папка создана' " - # 2. Копируем docker-compose.yml - echo 'Копирую docker-compose.yml...' - sshpass -p '${SSH_PASS}' scp -o StrictHostKeyChecking=no -o ConnectTimeout=10 docker-compose.yml ${SSH_USER}@92.242.61.23:${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. Запускаем docker-compose на сервере - echo 'Запускаю docker-compose на сервере...' - sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ${SSH_USER}@92.242.61.23 " + # 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 'Текущая директория: \$(pwd)' - ls -la + echo '=== НАЧАЛО ЗАПУСКА ===' + echo 'Директория: \$(pwd)' + + # Останавливаем старые контейнеры echo 'Останавливаю старые контейнеры...' - docker-compose down 2>/dev/null || echo '✓ Не было запущенных контейнеров' + docker-compose down 2>/dev/null || echo 'Не было запущенных контейнеров' - echo 'Запускаю новые контейнеры...' - docker-compose up -d + # Запускаем новые + echo 'Запускаю приложение...' + docker-compose up -d --build - echo 'Проверяю статус...' + # Ждем запуска + sleep 5 + + # Проверяем + echo '=== ПРОВЕРКА ===' + echo '1. Контейнеры:' docker-compose ps - echo 'Логи последние 5 строк:' - docker-compose logs --tail=5 + echo '' + echo '2. Логи:' + docker-compose logs --tail=10 + + echo '' + echo '3. Доступность:' + curl -f http://localhost:${params.APP_PORT} && echo '✓ Приложение работает!' || echo '✗ Ошибка доступа' " - - echo "Деплой завершен" """ } }