pipeline { agent none options { buildDiscarder(logRotator(numToKeepStr: '10')) disableConcurrentBuilds() } stages { stage('Build') { agent { label getAgentLabel() } stages { stage('Cleanup Workspace') { steps { cleanWs() } } stage('Checkout') { steps { checkout scm } } stage('Inject Environment File') { steps { configFileProvider( [configFile( fileId: getEnvFileId(), targetLocation: 'src/environments/environment.ts', replaceTokens: true )] ) { echo "Injected environment for ${env.BRANCH_NAME}" } } } stage('Install & Build') { steps { sh ''' npm ci ng build --configuration production --base-href /admin/ ''' } } } } // 🚨 Production Approval Gate stage('Production Approval') { when { branch 'prod' } steps { input message: "Approve deployment to PRODUCTION?", ok: "Deploy" } } stage('Deploy & Verify') { agent { label getAgentLabel() } stages { stage('Deploy') { steps { sh """ rsync -av --delete dist/portfolio-admin/browser/ ${getDeployPath()}/ sudo /usr/bin/systemctl reload nginx """ } } stage('Health Check') { steps { sh """ sleep 3 curl -f ${getHealthUrl()} """ } } } } } post { success { echo "✅ Deployment successful for ${env.BRANCH_NAME}" } failure { echo "❌ Deployment failed for ${env.BRANCH_NAME}" } } } // // -------- Helper Methods -------- // def getAgentLabel() { if (env.BRANCH_NAME == 'prod') { return 'oracle-prod' } else { return 'built-in' } } def getEnvFileId() { if (env.BRANCH_NAME == 'prod') { return 'admin-prod-properties' } else { return 'admin-uat-properties' } } def getDeployPath() { if (env.BRANCH_NAME == 'prod') { return "/var/www/bangararaju.kottedi.in/admin" } else { return "/var/www/bangararaju.kottedi.in/admin" } } def getHealthUrl() { if (env.BRANCH_NAME == 'prod') { return "https://bangararaju.kottedi.in/admin" } else { return "https://bangararaju-uat.kottedi.in/admin" } }