From cf6034e74a2ff5ac4bfeceace287dd8d8a4babd5 Mon Sep 17 00:00:00 2001 From: vladp Date: Tue, 2 Dec 2025 16:40:52 +0700 Subject: [PATCH] Completed deploy job with works backend apps --- infra/deploy.groovy | 182 ----------------------- infrastructure/jenkins/deploy.groovy | 212 +++++++++++++++++++++++++++ 2 files changed, 212 insertions(+), 182 deletions(-) delete mode 100644 infra/deploy.groovy create mode 100644 infrastructure/jenkins/deploy.groovy diff --git a/infra/deploy.groovy b/infra/deploy.groovy deleted file mode 100644 index cc9b146..0000000 --- a/infra/deploy.groovy +++ /dev/null @@ -1,182 +0,0 @@ -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 '✗ Ошибка доступа' - " - """ - } - } - } - } - } -} \ No newline at end of file diff --git a/infrastructure/jenkins/deploy.groovy b/infrastructure/jenkins/deploy.groovy new file mode 100644 index 0000000..6e7b69b --- /dev/null +++ b/infrastructure/jenkins/deploy.groovy @@ -0,0 +1,212 @@ +pipeline { + agent any + + parameters { + string( + name: 'BRANCH', + defaultValue: 'dev', + description: 'Ветка для деплоя' + ) + } + + stages { + stage('Git pull') { + steps { + script { + checkout([ + $class: 'GitSCM', + branches: [[name: params.BRANCH]], + userRemoteConfigs: [[ + url: 'https://code.3err0.ru/backdev/no-copy.git', + credentialsId: 'nx-jen' + ]] + ]) + } + } + } + + stage('Stop old container') { + steps { + script { + withCredentials([ + usernamePassword( + credentialsId: 'server-root-password', + usernameVariable: 'SSH_USER', + passwordVariable: 'SSH_PASS' + ) + ]) { + sh """ + echo "Stop old container by branch ${params.BRANCH}..." + + sshpass -p '$SSH_PASS' ssh $SSH_USER@92.242.61.23 " + cd /opt/deployments/${params.BRANCH} 2>/dev/null || mkdir -p /opt/deployments/${params.BRANCH} + + # Stop old container if have docker-compose + if [ -f 'docker-compose.yaml' ] || [ -f 'docker-compose.yml' ]; then + if [ -f 'docker-compose.yaml' ]; then + docker-compose -f docker-compose.yaml down 2>/dev/null || true + elif [ -f 'docker-compose.yml' ]; then + docker-compose -f docker-compose.yml down 2>/dev/null || true + fi + fi + + # Stop and delete container by name + docker stop app-${params.BRANCH} 2>/dev/null || true + docker rm app-${params.BRANCH} 2>/dev/null || true + + echo "Old containder deleted" + " + """ + } + } + } + } + + stage('Copy to server') { + steps { + script { + withCredentials([ + usernamePassword( + credentialsId: 'server-root-password', + usernameVariable: 'SSH_USER', + passwordVariable: 'SSH_PASS' + ) + ]) { + sh """ + echo "Copy files on server..." + + # Clean mkdir + sshpass -p '$SSH_PASS' ssh $SSH_USER@92.242.61.23 " + rm -rf /opt/deployments/${params.BRANCH}/* + mkdir -p /opt/deployments/${params.BRANCH} + " + + # Copy all files + sshpass -p '$SSH_PASS' scp -r ./* $SSH_USER@92.242.61.23:/opt/deployments/${params.BRANCH}/ 2>/dev/null || true + + echo "Files copied" + """ + } + } + } + } + + stage('Build on server') { + steps { + script { + withCredentials([ + usernamePassword( + credentialsId: 'server-root-password', + usernameVariable: 'SSH_USER', + passwordVariable: 'SSH_PASS' + ) + ]) { + sh """ + echo "Build on server..." + + sshpass -p '$SSH_PASS' ssh $SSH_USER@92.242.61.23 " + cd /opt/deployments/${params.BRANCH} + + echo "Build Docker for branch ${params.BRANCH}..." + + # delete old docker image + docker rmi app:${params.BRANCH} 2>/dev/null || true + + # build from branch + if [ -f 'Dockerfile' ]; then + docker build -t app:${params.BRANCH} . + echo "Docker образ app:${params.BRANCH} собран" + fi + + # or from docker-compose + if [ -f 'docker-compose.yaml' ]; then + docker-compose -f docker-compose.yaml build + echo "Build from docker-compose.yaml completed" + elif [ -f 'docker-compose.yml' ]; then + docker-compose -f docker-compose.yml build + echo "Build from docker-compose.yml completed" + fi + + echo 'Build completed' + " + """ + } + } + } + } + + stage('Start on server') { + steps { + script { + withCredentials([ + usernamePassword( + credentialsId: 'server-root-password', + usernameVariable: 'SSH_USER', + passwordVariable: 'SSH_PASS' + ) + ]) { + sh """ + echo "Start container..." + + sshpass -p '$SSH_PASS' ssh $SSH_USER@92.242.61.23 " + cd /opt/deployments/${params.BRANCH} + + # If have docker-compose - use them + if [ -f 'docker-compose.yaml' ]; then + echo "Start docker-compose.yaml..." + docker-compose -f docker-compose.yaml up -d + + elif [ -f 'docker-compose.yml' ]; then + echo "Start docker-compose.yml..." + docker-compose -f docker-compose.yml up -d + + # If have Dockerfile - start + elif [ -f 'Dockerfile' ]; then + echo "Start app-${params.BRANCH}..." + docker run -d \\ + --name app-${params.BRANCH} \\ + -p 8080:8080 \\ + app:${params.BRANCH} + else + echo "Error:Dockerfile NOT FOUND, docker-compose.yaml or docker-compose.yml" + exit 1 + fi + + echo 'Container start' + + # Wait start + sleep 10 + + # Check status + echo 'status container:' + if [ -f 'docker-compose.yaml' ] || [ -f 'docker-compose.yml' ]; then + if [ -f 'docker-compose.yaml' ]; then + docker-compose -f docker-compose.yaml ps + else + docker-compose -f docker-compose.yml ps + fi + else + docker ps --filter "name=app-${params.BRANCH}" + fi + + echo '' + echo 'Apps start on:' + echo 'http://92.242.61.23:80' + " + """ + } + } + } + } + } + + post { + success { + echo "Deploy branch ${params.BRANCH} completed" + echo "App : http://92.242.61.23:80" + } + failure { + echo "Deploy failed" + } + } +} \ No newline at end of file