236 lines
8.8 KiB
Groovy
236 lines
8.8 KiB
Groovy
pipeline {
|
|
agent any
|
|
|
|
environment {
|
|
SSH_CREDENTIALS = 'ltts'
|
|
REMOTE_SERVER = 'ubuntu@160.187.166.95'
|
|
REMOTE_WORKSPACE = '/home/ubuntu'
|
|
PROJECT_NAME = 'qassure-frontend'
|
|
BUILD_PATH = '/home/ubuntu/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 {
|
|
timeout(time: 30, unit: 'MINUTES')
|
|
retry(2)
|
|
timestamps()
|
|
buildDiscarder(logRotator(numToKeepStr: '10'))
|
|
}
|
|
|
|
stages {
|
|
stage('Preparation') {
|
|
steps {
|
|
script {
|
|
echo "Starting ${PROJECT_NAME} deployment pipeline"
|
|
echo "Server: ${REMOTE_SERVER}"
|
|
echo "Build Path: ${BUILD_PATH}"
|
|
echo "Deploy Path: ${DEPLOY_PATH}"
|
|
}
|
|
}
|
|
}
|
|
|
|
stage('Git Operations on Remote Server') {
|
|
steps {
|
|
script {
|
|
sshagent(credentials: [SSH_CREDENTIALS]) {
|
|
withCredentials([usernamePassword(credentialsId: GIT_CREDENTIALS, usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PASS')]) {
|
|
sh """
|
|
ssh -o StrictHostKeyChecking=no ${REMOTE_SERVER} '
|
|
set -e
|
|
|
|
echo "Checking Git repo in home directory..."
|
|
if [ -d "${BUILD_PATH}/.git" ]; then
|
|
echo "Pulling latest code..."
|
|
cd ${BUILD_PATH}
|
|
|
|
git config --global --add safe.directory ${BUILD_PATH}
|
|
git reset --hard
|
|
git clean -fd
|
|
git config pull.rebase false
|
|
git pull https://${GIT_USER}:${GIT_PASS}@git.tech4biz.wiki/yashwin/Qassure-frontend.git main
|
|
else
|
|
echo "Cloning fresh repo..."
|
|
rm -rf ${BUILD_PATH}
|
|
git clone https://${GIT_USER}:${GIT_PASS}@git.tech4biz.wiki/yashwin/Qassure-frontend.git ${BUILD_PATH}
|
|
git config --global --add safe.directory ${BUILD_PATH}
|
|
fi
|
|
|
|
cd ${BUILD_PATH}
|
|
echo "Commit: \$(git rev-parse HEAD)"
|
|
'
|
|
"""
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
stage('Verify Node.js Environment') {
|
|
steps {
|
|
script {
|
|
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 ${BUILD_PATH}
|
|
|
|
echo "Node: \$(${NODE_PATH} -v)"
|
|
echo "NPM: \$(${NPM_PATH} -v)"
|
|
${NPM_PATH} cache clean --force
|
|
'
|
|
"""
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
stage('Install Dependencies') {
|
|
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 ${BUILD_PATH}
|
|
echo "Installing dependencies..."
|
|
rm -rf node_modules package-lock.json
|
|
${NPM_PATH} install --force
|
|
'
|
|
"""
|
|
}
|
|
}
|
|
}
|
|
|
|
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 ${BUILD_PATH}
|
|
echo "Building application..."
|
|
${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 ${BUILD_PATH}
|
|
|
|
echo "Preparing deployment directory..."
|
|
sudo mkdir -p ${DEPLOY_PATH}
|
|
sudo rm -rf ${DEPLOY_PATH}/dist
|
|
sudo rm -rf ${DEPLOY_PATH}/build
|
|
|
|
echo "Moving entire dist folder to ${DEPLOY_PATH}/..."
|
|
if [ -d "dist" ]; then
|
|
sudo cp -r dist ${DEPLOY_PATH}/
|
|
echo "Dist folder copied successfully to ${DEPLOY_PATH}/dist"
|
|
elif [ -d "build" ]; then
|
|
sudo cp -r build ${DEPLOY_PATH}/
|
|
echo "Build folder copied successfully to ${DEPLOY_PATH}/build"
|
|
else
|
|
echo "Error: No dist or build directory found!"
|
|
exit 1
|
|
fi
|
|
|
|
# Set 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 "Deployment directory contents:"
|
|
ls -la ${DEPLOY_PATH}
|
|
'
|
|
"""
|
|
}
|
|
}
|
|
}
|
|
|
|
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 "Build directory structure:"
|
|
ls -la ${BUILD_PATH}
|
|
|
|
echo "Deployment directory contents:"
|
|
ls -la ${DEPLOY_PATH}
|
|
|
|
echo "Nginx status:"
|
|
sudo systemctl is-active nginx
|
|
'
|
|
"""
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
post {
|
|
always {
|
|
cleanWs()
|
|
}
|
|
success {
|
|
mail to: "${EMAIL_RECIPIENT}",
|
|
subject: "✅ Jenkins - ${PROJECT_NAME} Deployment Successful",
|
|
body: """The deployment of '${PROJECT_NAME}' to ${REMOTE_SERVER} was successful.
|
|
|
|
Build Number: ${BUILD_NUMBER}
|
|
URL: ${BUILD_URL}
|
|
Time: ${new Date()}
|
|
|
|
The static files have been deployed and nginx has been restarted.
|
|
"""
|
|
}
|
|
failure {
|
|
mail to: "${EMAIL_RECIPIENT}",
|
|
subject: "❌ Jenkins - ${PROJECT_NAME} Deployment Failed",
|
|
body: """Deployment failed. Please review logs at:
|
|
|
|
${BUILD_URL}console
|
|
|
|
Time: ${new Date()}
|
|
"""
|
|
}
|
|
}
|
|
} |