pipeline { agent any environment { SSH_CREDENTIALS = 'spurrin-dev-backend' GIT_CREDENTIALS = 'gitea-cred' REMOTE_SERVER = 'ubuntu@160.187.167.21' REPO_HTTPS_URL = 'https://git.tech4biz.wiki/rohit/spurrin-backend.git' BRANCH = 'main' REMOTE_DIR = '/home/ubuntu/spurrin-backend' BACKUP_UPLOADS_DIR = '/home/ubuntu/uploads_backup' VENV_PYTHON = '../venv/bin/python' NODE_BIN_PATH = '/home/ubuntu/.nvm/versions/node/v22.17.1/bin' NOTIFY_EMAIL = 'jassim.mohammed@tech4biz.io' } stages { stage('Add Remote Host Key') { steps { echo '๐Ÿ” Adding remote host to known_hosts...' sshagent(credentials: [SSH_CREDENTIALS]) { sh ''' mkdir -p ~/.ssh ssh-keyscan -H ${REMOTE_SERVER#*@} >> ~/.ssh/known_hosts ''' } } } stage('Update Repo on Remote') { steps { echo '๐Ÿ”„ Pulling latest code on remote server with conditional restore and fresh backup...' withCredentials([usernamePassword(credentialsId: "${GIT_CREDENTIALS}", usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PASS')]) { sshagent(credentials: [SSH_CREDENTIALS]) { sh """ ssh ${REMOTE_SERVER} ' set -e # Clean old backup folder echo "๐Ÿ—‘๏ธ Removing old backups..." rm -rf ${BACKUP_UPLOADS_DIR} mkdir -p ${BACKUP_UPLOADS_DIR} echo "๐Ÿ“ฆ Backing up existing data..." if [ -d ${REMOTE_DIR}/uploads ]; then cp -a ${REMOTE_DIR}/uploads ${BACKUP_UPLOADS_DIR}/ fi if [ -d ${REMOTE_DIR}/hospital_data ]; then cp -a ${REMOTE_DIR}/hospital_data ${BACKUP_UPLOADS_DIR}/ fi if [ -f ${REMOTE_DIR}/.env ]; then cp ${REMOTE_DIR}/.env ${BACKUP_UPLOADS_DIR}/.env fi if [ -d ${REMOTE_DIR}/certificates ]; then cp -a ${REMOTE_DIR}/certificates ${BACKUP_UPLOADS_DIR}/ fi # Pull latest changes without deleting local files/folders if [ -d ${REMOTE_DIR}/.git ]; then echo "๐Ÿ” Repo exists. Pulling latest changes..." cd ${REMOTE_DIR} git stash push --include-untracked --message "temp-backup-before-pull" || true git pull origin ${BRANCH} git stash pop || true else echo "๐Ÿ“ฅ Repo not found. Cloning fresh and restoring backup..." rm -rf ${REMOTE_DIR} git clone -b ${BRANCH} https://${GIT_USER}:${GIT_PASS}@git.tech4biz.wiki/rohit/spurrin-backend.git ${REMOTE_DIR} # Restore backups only on fresh clone... # Restore backup only on fresh clone if [ -d ${BACKUP_UPLOADS_DIR}/uploads ]; then cp -a ${BACKUP_UPLOADS_DIR}/uploads ${REMOTE_DIR}/ fi if [ -d ${BACKUP_UPLOADS_DIR}/hospital_data ]; then cp -a ${BACKUP_UPLOADS_DIR}/hospital_data ${REMOTE_DIR}/ fi if [ -f ${BACKUP_UPLOADS_DIR}/.env ]; then cp ${BACKUP_UPLOADS_DIR}/.env ${REMOTE_DIR}/.env fi if [ -d ${BACKUP_UPLOADS_DIR}/certificates ]; then cp -a ${BACKUP_UPLOADS_DIR}/certificates ${REMOTE_DIR}/ fi fi ' """ } } } } stage('Install & Start Services') { steps { echo '๐Ÿš€ Installing and starting services...' sshagent(credentials: [SSH_CREDENTIALS]) { sh """ ssh ${REMOTE_SERVER} ' set -e export PATH=${NODE_BIN_PATH}:\$PATH cd ${REMOTE_DIR} npm install --legacy-peer-deps --force pm2 delete web-server || true pm2 delete convo || true pm2 start npm --name web-server -- start pm2 start chat.py --interpreter ${VENV_PYTHON} --name=convo ' """ } } } } post { always { echo '๐Ÿงน Cleaning workspace...' cleanWs() } success { echo 'โœ… Deployment successful!' mail to: "${NOTIFY_EMAIL}", subject: "โœ… Jenkins - spurrin-cleaned-node Deployment Successful", body: "The deployment of spurrin-cleaned-node to ${REMOTE_SERVER} was successful.\n\nRegards,\nJenkins" } failure { echo 'โŒ Deployment failed!' mail to: "${NOTIFY_EMAIL}", subject: "โŒ Jenkins - spurrin-cleaned-node Deployment Failed", body: "The deployment of spurrin-cleaned-node to ${REMOTE_SERVER} failed. Please check Jenkins logs.\n\nRegards,\nJenkins" } } }