226 lines
12 KiB
Groovy
226 lines
12 KiB
Groovy
pipeline {
|
|
agent any
|
|
|
|
parameters {
|
|
string(
|
|
name: 'BRANCH',
|
|
defaultValue: 'dev',
|
|
description: 'Ветка для деплоя'
|
|
)
|
|
|
|
string(
|
|
name: 'SERVER',
|
|
defaultValue: '92.242.61.23',
|
|
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('Deploy with docker-compose') {
|
|
steps {
|
|
script {
|
|
withCredentials([
|
|
usernamePassword(
|
|
credentialsId: 'server-root-password',
|
|
usernameVariable: 'SSH_USER',
|
|
passwordVariable: 'SSH_PASS'
|
|
)
|
|
]) {
|
|
sh """
|
|
echo "Deploying branch: ${params.BRANCH}"
|
|
|
|
echo "Copying files to server..."
|
|
sshpass -p '$SSH_PASS' ssh -o StrictHostKeyChecking=no $SSH_USER@$SERVER "mkdir -p /opt/deployments/${params.BRANCH}"
|
|
sshpass -p '$SSH_PASS' scp -r -o StrictHostKeyChecking=no ./* $SSH_USER@$SERVER:/opt/deployments/${params.BRANCH}/
|
|
|
|
sshpass -p '$SSH_PASS' ssh -o StrictHostKeyChecking=no $SSH_USER@$SERVER "
|
|
cd /opt/deployments/${params.BRANCH}
|
|
|
|
echo '========================================'
|
|
echo 'Step 1: Checking current state...'
|
|
echo '========================================'
|
|
|
|
docker ps --filter 'name=postgres|app-backend|storage|grafana|prometheus|loki|tempo|alloy' --format 'table {{.Names}}\\t{{.Image}}\\t{{.Status}}'
|
|
|
|
echo '========================================'
|
|
echo 'Step 2: Setup environment for compatibility...'
|
|
echo '========================================'
|
|
|
|
docker network create app-network 2>/dev/null || echo 'Network app-network already exists'
|
|
|
|
echo 'COMPOSE_COMPATIBILITY=true' > .env
|
|
|
|
echo '========================================'
|
|
echo 'Step 3: Force cleanup old application...'
|
|
echo '========================================'
|
|
|
|
docker-compose --compatibility down 2>/dev/null || echo 'No previous compose stack'
|
|
|
|
docker images --filter 'reference=*app-backend*' -q | xargs -r docker rmi -f 2>/dev/null || echo 'No images to remove'
|
|
|
|
echo '========================================'
|
|
echo 'Step 4: Verify files and fix compose...'
|
|
echo '========================================'
|
|
|
|
if [ ! -f docker-compose.yaml ]; then
|
|
echo 'ERROR: docker-compose.yaml not found!'
|
|
ls -la
|
|
exit 1
|
|
fi
|
|
|
|
echo 'Checking docker-compose.yaml syntax...'
|
|
docker-compose --compatibility config 2>&1 | head -20 || echo 'Config check output'
|
|
|
|
echo '========================================'
|
|
echo 'Step 5: Start infrastructure services...'
|
|
echo '========================================'
|
|
|
|
echo 'Starting PostgreSQL with resource limits...'
|
|
docker-compose --compatibility up -d db
|
|
|
|
echo 'Starting storage service...'
|
|
docker-compose --compatibility up -d storage
|
|
|
|
echo 'Waiting for PostgreSQL to be ready...'
|
|
for i in {1..30}; do
|
|
if docker-compose --compatibility exec db pg_isready -U postgres 2>/dev/null; then
|
|
echo 'PostgreSQL is ready'
|
|
break
|
|
fi
|
|
echo 'Waiting... attempt ' \$i
|
|
sleep 2
|
|
done
|
|
|
|
echo '========================================'
|
|
echo 'Step 6: Build application image...'
|
|
echo '========================================'
|
|
|
|
if [ ! -f Dockerfile ]; then
|
|
echo 'ERROR: Dockerfile not found!'
|
|
exit 1
|
|
fi
|
|
|
|
echo 'Building Docker image...'
|
|
docker build --no-cache -t app-backend:latest . 2>&1 | tail -30
|
|
|
|
echo 'Image created successfully'
|
|
docker images app-backend:latest --format 'table {{.Repository}}\\t{{.Tag}}\\t{{.Size}}\\t{{.CreatedAt}}'
|
|
|
|
echo '========================================'
|
|
echo 'Step 7: Start application with resource limits...'
|
|
echo '========================================'
|
|
|
|
docker volume create uploads_data 2>/dev/null || echo 'Volume uploads_data already exists'
|
|
|
|
echo 'Starting main application...'
|
|
docker-compose --compatibility up -d app
|
|
|
|
echo 'Waiting for application to start...'
|
|
sleep 15
|
|
|
|
echo '========================================'
|
|
echo 'Step 8: Start monitoring stack...'
|
|
echo '========================================'
|
|
|
|
docker-compose --compatibility up -d grafana prometheus loki tempo alloy
|
|
|
|
echo '========================================'
|
|
echo 'Step 9: Verify deployment...'
|
|
echo '========================================'
|
|
|
|
echo 'All containers status:'
|
|
docker-compose --compatibility ps
|
|
|
|
echo ''
|
|
echo 'Resource limits check:'
|
|
echo 'App backend limits:'
|
|
docker inspect app-backend --format='{{.HostConfig.Memory}} {{.HostConfig.CpuQuota}} {{.HostConfig.CpuPeriod}}' 2>/dev/null || echo 'Cannot inspect'
|
|
|
|
echo ''
|
|
echo 'PostgreSQL limits:'
|
|
docker inspect postgres --format='{{.HostConfig.Memory}} {{.HostConfig.CpuQuota}} {{.HostConfig.CpuPeriod}}' 2>/dev/null || echo 'Cannot inspect'
|
|
|
|
echo ''
|
|
echo 'Container resource usage:'
|
|
docker stats --no-stream --format 'table {{.Name}}\\t{{.CPUPerc}}\\t{{.MemUsage}}\\t{{.MemPerc}}' postgres app-backend storage 2>/dev/null || echo 'Stats not available'
|
|
|
|
echo '========================================'
|
|
echo 'Step 10: Health checks...'
|
|
echo '========================================'
|
|
|
|
echo 'Application health check...'
|
|
for i in {1..10}; do
|
|
if curl -s -f http://localhost:80/health 2>/dev/null; then
|
|
echo '✓ Application health check PASSED'
|
|
break
|
|
elif [ \$i -eq 10 ]; then
|
|
echo '✗ Application health check FAILED'
|
|
echo 'Last logs:'
|
|
docker-compose --compatibility logs --tail=20 app
|
|
else
|
|
echo 'Waiting for application... attempt ' \$i
|
|
sleep 5
|
|
fi
|
|
done
|
|
|
|
echo 'Checking monitoring services...'
|
|
if curl -s -f http://localhost:3000/api/health 2>/dev/null; then
|
|
echo '✓ Grafana is healthy'
|
|
else
|
|
echo '⚠ Grafana may be starting'
|
|
fi
|
|
|
|
if curl -s -f http://localhost:9090/-/healthy 2>/dev/null; then
|
|
echo '✓ Prometheus is healthy'
|
|
fi
|
|
|
|
echo '========================================'
|
|
echo 'Deployment Summary:'
|
|
echo '========================================'
|
|
echo 'Application URL: http://${params.SERVER}:80'
|
|
echo 'Grafana: http://${params.SERVER}:3000 (admin/admin)'
|
|
echo 'Prometheus: http://${params.SERVER}:9090'
|
|
echo 'Loki: http://${params.SERVER}:3100'
|
|
echo ''
|
|
echo 'To view logs: docker-compose logs -f app'
|
|
echo 'To view all containers: docker-compose ps'
|
|
echo 'To stop: docker-compose down'
|
|
echo '========================================'
|
|
"
|
|
"""
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
post {
|
|
success {
|
|
echo "Deployment successful"
|
|
echo "Application URL: http://${params.SERVER}:80"
|
|
echo "Grafana: http://${params.SERVER}:3000"
|
|
echo "Prometheus: http://${params.SERVER}:9090"
|
|
}
|
|
failure {
|
|
echo "Deployment failed for branch ${params.BRANCH}"
|
|
}
|
|
always {
|
|
echo "Deployment process finished"
|
|
}
|
|
}
|
|
} |