diff --git a/infrastructure/jenkins/deploy-backend.groovy b/infrastructure/jenkins/deploy-backend.groovy index c1f96f9..30fc29f 100644 --- a/infrastructure/jenkins/deploy-backend.groovy +++ b/infrastructure/jenkins/deploy-backend.groovy @@ -9,14 +9,24 @@ pipeline { ) string( name: 'PORT', - defaultValue: '3000', + defaultValue: '3001', description: 'Порт для запуска экземпляра' ) + string( + name: 'PORT_DB', + defaultValue: '', + description: 'Порт для запуска БД' + ) string( name: 'SERVER', defaultValue: '92.242.61.23', description: 'Сервер для деплоя' ) + string( + name: 'NETWORK', + defaultValue: 'app-network-dev', + description: 'Имя сети (будет создана если не существует)' + ) } stages { @@ -36,6 +46,29 @@ pipeline { } } + 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/${params.BRANCH}-${params.PORT}/* + mkdir -p /opt/deployments/${params.BRANCH}-${params.PORT} + " + + sshpass -p '${SSH_PASS}' scp -r ./* ${SSH_USER}@${params.SERVER}:/opt/deployments/${params.BRANCH}-${params.PORT}/ + """ + } + } + } + } + stage('Deploy with docker-compose') { steps { script { @@ -61,10 +94,16 @@ pipeline { # Основная команда sshpass -p '${SSH_PASS}' ssh -o StrictHostKeyChecking=no ${SSH_USER}@${params.SERVER} " + mkdir -p /opt/deployments/${params.BRANCH}-${params.PORT} cd /opt/deployments/${params.BRANCH}-${params.PORT} - echo '1. Создаем изолированную сеть для порта ${params.PORT}...' - docker network create app-network-${params.PORT} 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. Останавливаем старые контейнеры порта ${params.PORT}...' docker stop app-backend-${params.PORT} 2>/dev/null || echo 'Контейнер не найден' @@ -77,12 +116,12 @@ pipeline { echo '3. Запускаем БД...' docker run -d \\ --name postgres-${params.PORT} \\ - --network app-network-${params.PORT} \\ + --network ${params.NETWORK} \\ --network-alias no_copy_${params.PORT} \\ --network-alias database-${params.PORT} \\ --network-alias db-${params.PORT} \\ -p ${params.PORT}0:5432 \\ - -e POSTGRES_DB=no_copy_${params.PORT} \\ + -e POSTGRES_DB=no_copy${params.PORT_DB} \\ -e POSTGRES_USER=${DB_USER} \\ -e POSTGRES_PASSWORD=${DB_PASSWORD} \\ -v pgdata_${params.PORT}:/var/lib/postgresql/data \\ @@ -92,7 +131,7 @@ pipeline { echo '4. Запускаем storage...' docker run -d \\ --name file-storage-${params.PORT} \\ - --network app-network-${params.PORT} \\ + --network ${params.NETWORK} \\ -v uploads_data_${params.PORT}:/storage:rw \\ alpine:latest tail -f /dev/null @@ -105,10 +144,12 @@ pipeline { echo '7. Запускаем приложение...' docker run -d \\ --name app-backend-${params.PORT} \\ - --network app-network-${params.PORT} \\ + --network ${params.NETWORK} \\ + --network-alias app \\ + --network-alias app-${params.PORT} \\ -p ${params.PORT}:8080 \\ -v uploads_data_${params.PORT}:/data/uploads:rw \\ - -e POSTGRES_DB=no_copy_${params.PORT} \\ + -e POSTGRES_DB=no_copy${params.PORT_DB} \\ -e POSTGRES_USER=${DB_USER} \\ -e POSTGRES_PASSWORD=${DB_PASSWORD} \\ -e POSTGRES_PORT=5432 \\ @@ -131,6 +172,30 @@ pipeline { } } } + + 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 'Проверяем алиас app для контейнера app-backend-${params.PORT}' + docker inspect app-backend-${params.PORT} | grep -A 5 'Aliases' + " + """ + } + } + } + } } post { diff --git a/infrastructure/jenkins/deploy-front.groovy b/infrastructure/jenkins/deploy-front.groovy index 5758335..2f4f52b 100644 --- a/infrastructure/jenkins/deploy-front.groovy +++ b/infrastructure/jenkins/deploy-front.groovy @@ -12,6 +12,11 @@ pipeline { defaultValue: '2998', description: 'Порт для запуска экземпляра' ) + string( + name: 'NETWORK', + defaultValue: 'app-network-dev', + description: 'Docker сеть для подключения' + ) } stages { @@ -189,6 +194,70 @@ pipeline { } } } + +// stage('Connect to network') { +// 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 " +// echo 'Отключаем от всех сетей и подключаем к ${params.NETWORK}' +// +// # Отключаем от всех сетей (кроме bridge, host, none) +// current_networks=\$(docker inspect no-copy-frontend-${params.PORT} --format='{{range \$net, \$v := .NetworkSettings.Networks}}{{\$net}}{{\"\\n\"}}{{end}}' | grep -v -E '^(bridge|host|none)\$' || true) +// +// for net in \$current_networks; do +// echo \"Отключаем от сети: \$net\" +// docker network disconnect \$net no-copy-frontend-${params.PORT} 2>/dev/null || true +// done +// +// # Подключаем к нужной сети +// docker network connect ${params.NETWORK} no-copy-frontend-${params.PORT} +// +// echo 'Готово! Контейнер теперь в сети:' +// docker inspect no-copy-frontend-${params.PORT} --format='{{range \$net, \$v := .NetworkSettings.Networks}}{{\$net}}{{\"\\n\"}}{{end}}' +// " +// """ +// } +// } +// } +// } + + stage('Connect to network') { + 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 " + echo 'Подключаем контейнер к сети ${params.NETWORK}' + + if ! docker network ls --format '{{.Name}}' | grep -q '^${params.NETWORK}\$'; then + docker network create ${params.NETWORK} + fi + + if docker ps -a --format '{{.Names}}' | grep -q '^no-copy-frontend-${params.PORT}\$'; then + docker network disconnect ${params.NETWORK} no-copy-frontend-${params.PORT} 2>/dev/null || true + docker network connect ${params.NETWORK} no-copy-frontend-${params.PORT} + echo 'Контейнер подключен к ${params.NETWORK}' + fi + " + """ + } + } + } + } } post {