Update Jenkinsfile

This commit is contained in:
jassim 2026-01-28 11:41:35 +00:00
parent e4c81ac293
commit fd29e867f0

356
Jenkinsfile vendored
View File

@ -1,85 +1,70 @@
pipeline { pipeline {
agent any agent any
environment {
SSH_CREDENTIALS = 'ltts'
REMOTE_SERVER = 'ubuntu@160.187.166.95'
REMOTE_WORKSPACE = '/home/ubuntu'
PROJECT_NAME = 'qassure-frontend'
DEPLOY_PATH = '/var/www/qassure-ui'
GIT_CREDENTIALS = 'git-cred'
REPO_URL = 'https://git.tech4biz.wiki/yashwin/Qassure-frontend.git'
NPM_PATH = '/home/ubuntu/.nvm/versions/node/v22.17.0/bin/npm'
NODE_PATH = '/home/ubuntu/.nvm/versions/node/v22.17.0/bin/node'
EMAIL_RECIPIENT = 'sibarchan.nayak@tech4biz.org'
}
options { options {
disableConcurrentBuilds()
timestamps()
timeout(time: 30, unit: 'MINUTES') timeout(time: 30, unit: 'MINUTES')
retry(2)
timestamps()
buildDiscarder(logRotator(numToKeepStr: '10')) buildDiscarder(logRotator(numToKeepStr: '10'))
} }
environment {
// --- Deployment Target ---
SERVER_IP = '160.187.166.95'
SERVER_USER = 'ubuntu'
PROJECT_DIR = '/home/ubuntu/ltts/Qassure-frontend'
// --- Git Config ---
// Using the verified repository URL
GIT_REPO = 'https://git.tech4biz.wiki/yashwin/Qassure-frontend.git'
GIT_BRANCH = 'main'
GIT_CREDENTIALS_ID = 'git-cred'
// --- SSH Config ---
SSH_KEY_CREDENTIALS_ID = 'ltts'
// --- Application Config ---
NODE_HOME = '/home/ubuntu/.nvm/versions/node/v22.17.0'
// --- Build Config ---
VITE_API_BASE_URL = 'https://backendqaasure.tech4bizsolutions.com/api/v1'
// --- System Config ---
BACKUP_DIR = '/home/ubuntu/backups/qassure-frontend'
EMAIL_RECIPIENTS = 'mohammed.yaseen@tech4biz.org'
DEPLOY_START_TIME = "${System.currentTimeMillis()}"
}
stages { stages {
stage('Initialize') { stage('Preparation') {
steps { steps {
script { script {
echo "🚀 Starting QAssur Frontend Deployment Pipeline" echo "Starting ${PROJECT_NAME} deployment pipeline"
echo "📍 Target: ${SERVER_IP}" echo "Server: ${REMOTE_SERVER}"
echo "🌿 Branch: ${GIT_BRANCH}" echo "Deploy Path: ${DEPLOY_PATH}"
echo "📂 Directory: ${PROJECT_DIR}"
} }
} }
} }
stage('Setup Project Directory') { stage('Git Operations on Remote Server') {
steps { steps {
sshagent(credentials: [SSH_KEY_CREDENTIALS_ID]) {
script { script {
withCredentials([usernamePassword( sshagent(credentials: [SSH_CREDENTIALS]) {
credentialsId: GIT_CREDENTIALS_ID, withCredentials([usernamePassword(credentialsId: GIT_CREDENTIALS, usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PASS')]) {
usernameVariable: 'GIT_USERNAME',
passwordVariable: 'GIT_PASSWORD'
)]) {
sh """ sh """
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 ${SERVER_USER}@${SERVER_IP} ' ssh -o StrictHostKeyChecking=no ${REMOTE_SERVER} '
set -e set -e
echo "📁 Setting up project directory..."
mkdir -p "\$(dirname "${PROJECT_DIR}")" echo "Checking Git repo..."
mkdir -p ${BACKUP_DIR} if [ -d "${DEPLOY_PATH}/.git" ]; then
echo "Pulling latest code..."
cd ${DEPLOY_PATH}
if [ ! -d "${PROJECT_DIR}/.git" ]; then # Fix ownership issues
echo "📥 Repository not found. Cloning from scratch..." sudo chown -R ubuntu:ubuntu ${DEPLOY_PATH}
cd "\$(dirname "${PROJECT_DIR}")" git config --global --add safe.directory ${DEPLOY_PATH}
git config --global credential.helper store git reset --hard
echo "https://${GIT_USERNAME}:${GIT_PASSWORD}@git.tech4biz.wiki" > ~/.git-credentials git clean -fd
git config pull.rebase false
git clone -b ${GIT_BRANCH} ${GIT_REPO} git pull https://${GIT_USER}:${GIT_PASS}@git.tech4biz.wiki/yashwin/Qassure-frontend.git main
rm -f ~/.git-credentials
git config --global --unset credential.helper
echo "✅ Repository cloned successfully"
else else
echo "✅ Repository already exists" echo "Cloning fresh repo..."
sudo rm -rf ${DEPLOY_PATH}
sudo mkdir -p /var/www
sudo git clone https://${GIT_USER}:${GIT_PASS}@git.tech4biz.wiki/yashwin/Qassure-frontend.git ${DEPLOY_PATH}
sudo chown -R ubuntu:ubuntu ${DEPLOY_PATH}
git config --global --add safe.directory ${DEPLOY_PATH}
fi fi
cd ${DEPLOY_PATH}
echo "Commit: \$(git rev-parse HEAD)"
' '
""" """
} }
@ -88,76 +73,19 @@ pipeline {
} }
} }
stage('Fetch Latest Changes') { stage('Verify Node.js Environment') {
steps { steps {
sshagent(credentials: [SSH_KEY_CREDENTIALS_ID]) {
script {
withCredentials([usernamePassword(
credentialsId: GIT_CREDENTIALS_ID,
usernameVariable: 'GIT_USERNAME',
passwordVariable: 'GIT_PASSWORD'
)]) {
def gitInfo = sh(
script: """
ssh -o StrictHostKeyChecking=no ${SERVER_USER}@${SERVER_IP} '
set -e
cd ${PROJECT_DIR}
echo "📥 Fetching latest changes..."
git config credential.helper store
echo "https://${GIT_USERNAME}:${GIT_PASSWORD}@git.tech4biz.wiki" > ~/.git-credentials
# Force fetch and reset to ensure we match remote exactly
git fetch origin ${GIT_BRANCH}
git reset --hard origin/${GIT_BRANCH}
rm -f ~/.git-credentials
git config --unset credential.helper
echo "COMMIT_SHORT=\$(git rev-parse --short HEAD)"
echo "COMMIT_MSG=\$(git log -1 --pretty=%B)"
echo "COMMIT_AUTHOR=\$(git log -1 --pretty=%an)"
'
""",
returnStdout: true
).trim()
gitInfo.split('\n').each { line ->
if (line.startsWith('COMMIT_SHORT=')) env.GIT_COMMIT_SHORT = line.split('=', 2)[1]
else if (line.startsWith('COMMIT_MSG=')) env.GIT_COMMIT_MSG = line.split('=', 2)[1]
else if (line.startsWith('COMMIT_AUTHOR=')) env.GIT_AUTHOR = line.split('=', 2)[1]
}
echo "✅ Updated to: ${env.GIT_COMMIT_SHORT}"
}
}
}
}
}
stage('Pre-Flight Checks') {
steps {
sshagent(credentials: [SSH_KEY_CREDENTIALS_ID]) {
script { script {
sshagent(credentials: [SSH_CREDENTIALS]) {
sh """ sh """
ssh -o StrictHostKeyChecking=no ${SERVER_USER}@${SERVER_IP} ' ssh -o StrictHostKeyChecking=no ${REMOTE_SERVER} '
set -e set -e
echo "🔍 Running pre-flight checks..." export PATH="/home/ubuntu/.nvm/versions/node/v22.17.0/bin:\$PATH"
cd ${DEPLOY_PATH}
# Check Node.js echo "Node: \$(${NODE_PATH} -v)"
export PATH="${NODE_HOME}/bin:\$PATH" echo "NPM: \$(${NPM_PATH} -v)"
if ! node --version >/dev/null 2>&1; then ${NPM_PATH} cache clean --force
echo "❌ Node.js not found at ${NODE_HOME}"
exit 1
fi
# Disk Space (minimum 1GB)
available=\$(df ${PROJECT_DIR} | tail -1 | awk "{print \\\$4}")
if [ \$available -lt 1048576 ]; then
echo "❌ Insufficient disk space"
exit 1
fi
echo "✅ Pre-flight checks passed"
' '
""" """
} }
@ -165,99 +93,129 @@ pipeline {
} }
} }
stage('Install & Build') { stage('Install Dependencies') {
steps { steps {
sshagent(credentials: [SSH_KEY_CREDENTIALS_ID]) { sshagent(credentials: [SSH_CREDENTIALS]) {
script {
sh """ sh """
ssh -o StrictHostKeyChecking=no ${SERVER_USER}@${SERVER_IP} ' ssh -o StrictHostKeyChecking=no ${REMOTE_SERVER} '
set -e set -e
cd ${PROJECT_DIR} export PATH="/home/ubuntu/.nvm/versions/node/v22.17.0/bin:\$PATH"
export PATH="${NODE_HOME}/bin:\$PATH" cd ${DEPLOY_PATH}
export VITE_API_BASE_URL="${VITE_API_BASE_URL}" echo "Installing dependencies..."
rm -rf node_modules package-lock.json
echo "📦 Installing dependencies..." ${NPM_PATH} install --force
# Use clean install for reliability
npm ci --prefer-offline --no-audit
echo "🏗️ Building application..."
npm run build
# Verify the build output
if [ -f "dist/index.html" ]; then
echo "✅ Build successful - dist/index.html optimized and ready"
else
echo "❌ Build failed - dist/index.html missing"
exit 1
fi
' '
""" """
} }
} }
} }
stage('Build Application') {
steps {
sshagent(credentials: [SSH_CREDENTIALS]) {
sh """
ssh -o StrictHostKeyChecking=no ${REMOTE_SERVER} '
set -e
export PATH="/home/ubuntu/.nvm/versions/node/v22.17.0/bin:\$PATH"
cd ${DEPLOY_PATH}
echo "Building..."
${NPM_PATH} run build
echo "Build directory contents:"
ls -la dist || ls -la build || echo "No build/dist directory found"
'
"""
}
}
}
stage('Deploy Static Files') {
steps {
sshagent(credentials: [SSH_CREDENTIALS]) {
sh """
ssh -o StrictHostKeyChecking=no ${REMOTE_SERVER} '
set -e
cd ${DEPLOY_PATH}
echo "Setting up static files for nginx..."
# Ensure proper ownership and permissions
sudo chown -R www-data:www-data ${DEPLOY_PATH}
sudo find ${DEPLOY_PATH} -type d -exec chmod 755 {} \\;
sudo find ${DEPLOY_PATH} -type f -exec chmod 644 {} \\;
echo "Static files prepared for nginx serving"
'
"""
}
}
}
stage('Restart Nginx') {
steps {
sshagent(credentials: [SSH_CREDENTIALS]) {
sh """
ssh -o StrictHostKeyChecking=no ${REMOTE_SERVER} '
set -e
echo "Testing nginx configuration..."
sudo nginx -t
echo "Restarting nginx..."
sudo systemctl restart nginx
echo "Checking nginx status..."
sudo systemctl status nginx --no-pager -l
'
"""
}
}
}
stage('Health Check') {
steps {
sshagent(credentials: [SSH_CREDENTIALS]) {
sh """
ssh -o StrictHostKeyChecking=no ${REMOTE_SERVER} '
set -e
echo "Verifying deployment..."
echo "Directory structure:"
ls -la ${DEPLOY_PATH}
echo "Build files:"
ls -la ${DEPLOY_PATH}/dist || ls -la ${DEPLOY_PATH}/build || echo "No build directory found"
echo "Nginx status:"
sudo systemctl is-active nginx
'
"""
}
}
} }
} }
post { post {
failure { always {
script { cleanWs()
echo "❌ Deployment failed"
def durationMillis = System.currentTimeMillis() - env.DEPLOY_START_TIME.toLong()
def minutes = (durationMillis / 60000) as Integer
def seconds = ((durationMillis % 60000) / 1000) as Integer
def failureMessage = """❌ QAssur Frontend DEPLOYMENT FAILED
═══════════════════════════════════════
DETAILS
═══════════════════════════════════════
Branch: ${GIT_BRANCH}
Commit: ${env.GIT_COMMIT_SHORT ?: 'Unknown'}
Author: ${env.GIT_AUTHOR ?: 'Unknown'}
Duration: ${minutes}m ${seconds}s
Stage: ${env.STAGE_NAME ?: 'Unknown'}
Server: ${SERVER_IP}
Action Required:
1. Check Jenkins console logs for detailed error
2. Verify local build works: npm run build
"""
try {
mail to: "${EMAIL_RECIPIENTS}",
subject: "❌ QAssur Frontend FAILED - Build #${BUILD_NUMBER}",
body: failureMessage
} catch (e) {
echo "⚠️ Email failed: ${e.message}"
} }
}
}
success { success {
script { mail to: "${EMAIL_RECIPIENT}",
def durationMillis = System.currentTimeMillis() - env.DEPLOY_START_TIME.toLong() subject: "✅ Jenkins - ${PROJECT_NAME} Deployment Successful",
def minutes = (durationMillis / 60000) as Integer body: """The deployment of '${PROJECT_NAME}' to ${REMOTE_SERVER} was successful.
def seconds = ((durationMillis % 60000) / 1000) as Integer
def successMessage = """✅ QAssur Frontend DEPLOYMENT SUCCESS Build Number: ${BUILD_NUMBER}
URL: ${BUILD_URL}
Time: ${new Date()}
═══════════════════════════════════════ The static files have been deployed and nginx has been restarted.
DETAILS """
═══════════════════════════════════════ }
Branch: ${GIT_BRANCH} failure {
Commit: ${env.GIT_COMMIT_SHORT} mail to: "${EMAIL_RECIPIENT}",
Author: ${env.GIT_AUTHOR} subject: "❌ Jenkins - ${PROJECT_NAME} Deployment Failed",
Duration: ${minutes}m ${seconds}s body: """Deployment failed. Please review logs at:
Live URL: https://qasure.tech4bizsolutions.com ${BUILD_URL}console
Time: ${new Date()}
""" """
try {
mail to: "${EMAIL_RECIPIENTS}",
subject: "✅ QAssur Frontend SUCCESS - Build #${BUILD_NUMBER}",
body: successMessage
} catch (e) {
echo "⚠️ Email failed: ${e.message}"
}
}
} }
} }
} }