diff --git a/infrastructure/jenkins/deploy.groovy b/infrastructure/jenkins/deploy.groovy index c14fb90..f19a80c 100644 --- a/infrastructure/jenkins/deploy.groovy +++ b/infrastructure/jenkins/deploy.groovy @@ -31,7 +31,7 @@ pipeline { } } - stage('Stop old container') { + stage('Deploy with docker-compose') { steps { script { withCredentials([ @@ -42,162 +42,68 @@ pipeline { ) ]) { sh """ - echo "Stop old container by branch ${params.BRANCH}..." + echo "Deploying branch: ${params.BRANCH}" - sshpass -p '$SSH_PASS' ssh $SSH_USER@$SERVER " - 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@$SERVER " - rm -rf /opt/deployments/${params.BRANCH}/* - mkdir -p /opt/deployments/${params.BRANCH} - " - - # Copy all files - sshpass -p '$SSH_PASS' scp -r ./* $SSH_USER@$SERVER:/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..." + echo "Copying files to server..." + sshpass -p '$SSH_PASS' ssh $SSH_USER@$SERVER "mkdir -p /opt/deployments/${params.BRANCH}" + sshpass -p '$SSH_PASS' scp -r ./* $SSH_USER@$SERVER:/opt/deployments/${params.BRANCH}/ sshpass -p '$SSH_PASS' ssh $SSH_USER@$SERVER " cd /opt/deployments/${params.BRANCH} - echo "Build Docker for branch ${params.BRANCH}..." + echo 'Step 1: Checking current state...' - # delete old docker image - docker rmi app:${params.BRANCH} 2>/dev/null || true + # Смотрим что запущено + docker ps --filter 'name=postgres|app-backend' --format 'table {{.Names}}\\t{{.Status}}\\t{{.Ports}}' - # build from branch - if [ -f 'Dockerfile' ]; then - docker build -t app:${params.BRANCH} . - echo "Docker образ app:${params.BRANCH} собран" - fi + echo 'Step 2: Stopping only application (keeping DB)...' - # 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 + # Останавливаем только приложение, БД оставляем работать + docker stop app-backend 2>/dev/null || echo 'App not running' + docker rm app-backend 2>/dev/null || echo 'App not found' - 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@$SERVER " - 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} + # Проверяем что БД работает, если нет - запускаем + if ! docker ps | grep -q postgres; then + echo 'Starting PostgreSQL...' + docker-compose up -d db + sleep 10 else - echo "Error:Dockerfile NOT FOUND, docker-compose.yaml or docker-compose.yml" - exit 1 + echo 'PostgreSQL already running' fi - echo 'Container start' + echo 'Step 3: Building new application image...' + docker build --no-cache -t app-backend:latest . - # Wait start + echo 'Step 4: Starting application...' + docker run -d \\ + --name app-backend \\ + --network app-network \\ + -p 80:8080 \\ + -e POSTGRES_DB=no_copy_ \\ + -e POSTGRES_USER=postgres \\ + -e POSTGRES_PASSWORD=postgres \\ + -e POSTGRES_PORT=5432 \\ + -e POSTGRES_HOST=db \\ + --restart unless-stopped \\ + app-backend:latest + + echo 'Step 5: Checking deployment...' 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 'Containers status:' + docker ps --filter 'name=postgres|app-backend' --format 'table {{.Names}}\\t{{.Status}}\\t{{.Ports}}' - echo '' - echo 'Apps start on:' - echo 'http://$SERVER:80' + echo 'Application logs (last 5 lines):' + docker logs --tail=5 app-backend 2>/dev/null || echo 'Logs not available yet' + + if docker ps | grep -q app-backend; then + echo 'Deployment successful' + echo 'Application URL: http://${params.SERVER}:80' + else + echo 'Application failed to start' + docker logs app-backend + exit 1 + fi " """ } @@ -208,11 +114,14 @@ pipeline { post { success { - echo "Deploy branch ${params.BRANCH} completed" - echo "App : http://$SERVER:80" + echo "Deployment successful" + echo "Application URL: http://${params.SERVER}:80" } failure { - echo "Deploy failed" + echo "Deployment failed for branch ${params.BRANCH}" + } + always { + echo "Deployment process finished" } } } \ No newline at end of file diff --git a/infrastructure/jenkins/dp-wtith-branch.groovy b/infrastructure/jenkins/dp-wtith-branch.groovy new file mode 100644 index 0000000..e0a2094 --- /dev/null +++ b/infrastructure/jenkins/dp-wtith-branch.groovy @@ -0,0 +1,183 @@ +pipeline { + agent any + + parameters { + string( + name: 'BRANCH', + defaultValue: 'main', + 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 2>/dev/null || true + docker rm no-copy-frontend 2>/dev/null || true + + cd /opt/deployments/frontend/${params.BRANCH} 2>/dev/null || mkdir -p /opt/deployments/frontend/${params.BRANCH} + + 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 + " + """ + } + } + } + } + + 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}/* + mkdir -p /opt/deployments/frontend/${params.BRANCH} + " + + sshpass -p '$SSH_PASS' scp -r ./* $SSH_USER@92.242.61.23:/opt/deployments/frontend/${params.BRANCH}/ + """ + } + } + } + } + + 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} + + if [ -f 'docker-compose.yaml' ]; then + docker-compose -f docker-compose.yaml build + elif [ -f 'docker-compose.yml' ]; then + docker-compose -f docker-compose.yml build + else + echo 'Exception:don't found docker-compose' + exit 1 + fi + " + """ + } + } + } + } + + 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} + + if [ -f 'docker-compose.yaml' ]; then + docker-compose -f docker-compose.yaml up -d + elif [ -f 'docker-compose.yml' ]; then + docker-compose -f docker-compose.yml up -d + fi + + sleep 10 + + echo 'Status container:' + docker ps --filter name=no-copy-frontend + " + """ + } + } + } + } + + 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'; then + echo 'Container start' + + sleep 5 + + HTTP_CODE=\$(curl -s -o /dev/null -w '%{http_code}' http://localhost:2998 || echo '000') + echo 'HTTP код: ' \$HTTP_CODE + + echo 'Frong start on http://92.242.61.23:2998' + else + echo 'Exception: container don't start' + docker ps -a | grep frontend + exit 1 + fi + " + """ + } + } + } + } + } + + post { + success { + echo "Front branch ${params.BRANCH} completed" + echo "Use on http://92.242.61.23:2998" + } + failure { + echo "Failed" + } + } +} \ No newline at end of file