diff --git a/Dockerfile b/Dockerfile index 35301ca..f64e7bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,6 @@ FROM eclipse-temurin:21-jre WORKDIR /app COPY --from=build /app/build/libs/*.jar app.jar -EXPOSE 8080 +EXPOSE 8082 CMD ["java", "-jar", "app.jar"] \ No newline at end of file diff --git a/infrastrucure/deploy.groovy b/infrastrucure/deploy.groovy index c4cbd17..a892480 100644 --- a/infrastrucure/deploy.groovy +++ b/infrastrucure/deploy.groovy @@ -2,68 +2,188 @@ pipeline { agent any parameters { - string(name: 'BRANCH', defaultValue: 'dev', description: 'Ветка для деплоя') - string(name: 'SERVER', defaultValue: '92.242.61.23', description: 'Сервер для деплоя') + string( + name: 'BRANCH', + defaultValue: 'dev', + description: 'Ветка для деплоя' + ) + string( + name: 'PORT', + defaultValue: '8082', + description: 'Порт для запуска admin-panel' + ) + string( + name: 'SERVER', + defaultValue: '92.242.61.23', + description: 'Сервер для деплоя' + ) + string( + name: 'NETWORK', + defaultValue: 'app-network', + description: 'Имя сети (будет создана если не существует)' + ) + string( + name: 'DB_HOST', + defaultValue: 'db', + description: 'Хост базы данных' + ) + choice( + name: 'SPRING_PROFILE', + choices: ['dev', 'prod'], + description: 'Профиль Spring для запуска' + ) } stages { stage('Git pull') { steps { cleanWs() - git branch: params.BRANCH, url: 'https://code.3err0.ru/backdev/admin-panel.git', credentialsId: 'nx-jen' + script { + checkout([ + $class: 'GitSCM', + branches: [[name: params.BRANCH]], + userRemoteConfigs: [[ + url: 'https://code.3err0.ru/backdev/admin-panel.git', + credentialsId: 'nx-jen' + ]] + ]) + } } } - stage('Deploy with docker-compose') { + stage('Copy to server') { + steps { + script { + withCredentials([ + usernamePassword( + credentialsId: 'server-root-password', + usernameVariable: 'SSH_USER', + passwordVariable: 'SSH_PASS' + ) + ]) { + sh """ + sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no ${SSH_USER}@${params.SERVER} " + rm -rf /opt/deployments/admin-panel-${params.PORT}/* + mkdir -p /opt/deployments/admin-panel-${params.PORT} + " + + sshpass -p '${SSH_PASS}' rsync -av --delete \\ + --exclude=.git \\ + --exclude=.gradle \\ + --exclude=build \\ + --exclude=**/build \\ + --exclude=.idea \\ + --exclude=out \\ + . ${SSH_USER}@${params.SERVER}:/opt/deployments/admin-panel-${params.PORT}/ + """ + } + } + } + } + + stage('Deploy admin-panel') { steps { script { def buildTime = sh(script: "TZ='Asia/Novosibirsk' date '+%d-%m-%Y %H:%M:%S'", returnStdout: true).trim() + def springProfile = params.SPRING_PROFILE withCredentials([ - usernamePassword(credentialsId: 'server-root-password', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS'), + usernamePassword( + credentialsId: 'server-root-password', + usernameVariable: 'SSH_USER', + passwordVariable: 'SSH_PASS' + ), string(credentialsId: 'DB_USER', variable: 'DB_USER'), string(credentialsId: 'DB_PASSWORD', variable: 'DB_PASSWORD') ]) { sh """ - sshpass -p '$SSH_PASS' ssh -o StrictHostKeyChecking=no $SSH_USER@$SERVER ' - cd /opt/deployments/admin-panel || mkdir -p /opt/deployments/admin-panel && cd /opt/deployments/admin-panel + sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no ${SSH_USER}@${params.SERVER} " + cd /opt/deployments/admin-panel-${params.PORT} - echo "1. Остановка старого контейнера..." - docker stop admin-backend 2>/dev/null || echo "Контейнер не найден" - docker rm admin-backend 2>/dev/null || echo "Контейнер не найден" + echo '1. Проверяем/создаем сеть ${params.NETWORK}...' + if ! docker network ls --format '{{.Name}}' | grep -q '^${params.NETWORK}\$'; then + docker network create ${params.NETWORK} + echo 'Сеть ${params.NETWORK} создана' + else + echo 'Сеть ${params.NETWORK} уже существует' + fi - echo "2. Копирование файлов..." - rsync -av --delete --exclude=.git --exclude=build . $SSH_USER@$SERVER:/opt/deployments/admin-panel/ + echo '2. Останавливаем старый контейнер...' + docker stop admin-panel-${params.PORT} 2>/dev/null || echo 'Контейнер не найден' + docker rm admin-panel-${params.PORT} 2>/dev/null || echo 'Контейнер не найден' - echo "3. Сборка образа..." - docker build --no-cache -t admin-backend:latest . + echo '3. Собираем образ...' + docker build --no-cache -t admin-panel-${params.PORT}:latest . - echo "4. Запуск контейнера..." - docker run -d \ - --name admin-backend \ - --network app-network \ - --network-alias admin \ - -p 8082:8082 \ - -v uploads_data:/data/uploads:rw \ - -e POSTGRES_DB=no_copy_ \ - -e POSTGRES_USER=$DB_USER \ - -e POSTGRES_PASSWORD=$DB_PASSWORD \ - -e POSTGRES_PORT=5432 \ - -e POSTGRES_HOST=db \ - -e BUILD_TIME='${buildTime}' \ - --restart unless-stopped \ - admin-backend:latest + echo '4. Запускаем контейнер...' + docker run -d \\ + --name admin-panel-${params.PORT} \\ + --network ${params.NETWORK} \\ + --network-alias admin \\ + --network-alias admin-${params.PORT} \\ + -p ${params.PORT}:8082 \\ + -v uploads_data:/data/uploads:rw \\ + -e POSTGRES_DB=no_copy_ \\ + -e POSTGRES_USER=${DB_USER} \\ + -e POSTGRES_PASSWORD=${DB_PASSWORD} \\ + -e POSTGRES_PORT=5432 \\ + -e POSTGRES_HOST=${params.DB_HOST} \\ + -e SPRING_PROFILES_ACTIVE=${springProfile} \\ + -e BUILD_TIME='${buildTime}' \\ + --restart unless-stopped \\ + admin-panel-${params.PORT}:latest - echo "5. Проверка health..." - if curl -s -f http://localhost:8082/actuator/health; then - echo "Admin backend работает" - else - echo "Проблема с запуском admin-backend" - fi - ' + echo '5. Проверка...' + sleep 10 + + if curl -s -f http://localhost:${params.PORT}/actuator/health > /dev/null 2>&1; then + echo 'Admin-panel работает на порту ${params.PORT}' + echo 'URL: http://${params.SERVER}:${params.PORT}' + else + echo 'Проверка health не удалась' + docker logs admin-panel-${params.PORT} --tail=20 + fi + " + """ + } + } + } + } + + stage('Verify network') { + steps { + script { + withCredentials([ + usernamePassword( + credentialsId: 'server-root-password', + usernameVariable: 'SSH_USER', + passwordVariable: 'SSH_PASS' + ) + ]) { + sh """ + sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no ${SSH_USER}@${params.SERVER} " + echo 'Проверяем подключение к сети ${params.NETWORK}' + docker network inspect ${params.NETWORK} --format='{{.Name}}: {{range .Containers}}{{.Name}} {{end}}' + + echo 'Проверяем алиас admin для контейнера admin-panel-${params.PORT}' + docker inspect admin-panel-${params.PORT} | grep -A 5 'Aliases' + " """ } } } } } + + post { + success { + echo "Deployment successful" + echo "Admin panel URL: http://${params.SERVER}:${params.PORT}" + } + failure { + echo "Deployment failed for branch ${params.BRANCH} on port ${params.PORT}" + } + always { + echo "Deployment process finished" + } + } } \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 4a86184..eebf038 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -9,4 +9,4 @@ spring: ddl-auto: validate server: - port: 8080 \ No newline at end of file + port: 8082 \ No newline at end of file