pipeline { agent any environment { DOCKER_HUB_USERNAME = 'aimodocker' DOCKER_AUTH = credentials('aimodocker') // provides DOCKER_AUTH_USR / DOCKER_AUTH_PSW IMAGE_NAME = 'digitaltwin_frontend_v2' // Populated in Checkout stage GIT_COMMIT_HASH = "" IMAGE_TAG = "" SECONDARY_TAG = "" } parameters { string( name: 'EXTRA_DOCKER_BUILD_ARGS', defaultValue: '', description: 'Optional extra docker build args, e.g. --build-arg VITE_AUTH_APP_URL=https://api.example.com/auth' ) } stages { stage('Checkout & Setup') { steps { script { checkout scm GIT_COMMIT_HASH = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim() def branch = env.BRANCH_NAME ?: 'unknown' echo "Branch: ${branch} | Commit: ${GIT_COMMIT_HASH}" if (branch == 'main') { IMAGE_TAG = GIT_COMMIT_HASH SECONDARY_TAG = 'latest' } else { IMAGE_TAG = "temp-${GIT_COMMIT_HASH}" SECONDARY_TAG = "" } echo "Primary Tag : ${IMAGE_TAG}" echo "Secondary Tag: ${SECONDARY_TAG ?: '(none)'}" } } } stage('Docker Login') { steps { sh 'echo "$DOCKER_AUTH_PSW" | docker login -u "$DOCKER_AUTH_USR" --password-stdin' } } stage('Build & Tag') { steps { script { def fullImage = "${DOCKER_HUB_USERNAME}/${IMAGE_NAME}" def viteArgs = [ 'VITE_AUTH_APP_URL', 'VITE_EFFICIENCY_APP_URL', 'VITE_OH_APP_URL', 'VITE_PFI_APP_URL', 'VITE_API_V1_LIVE', 'VITE_LCCA_APP_URL', 'VITE_RELIABILITY_APP_URL', 'VITE_RISK_MATRIX_APP_URL', 'VITE_EQUIPMENT_IMAGE_URL', 'VITE_API_MONITORING_URL', 'VITE_RBD_APP_URL', 'VITE_IRCFA_APP_URL', 'VITE_AHM_APP_URL', 'VITE_OPS_DOCK_APP_URL', 'VITE_AUTH_URL', 'VITE_AUTH_SECRET', 'VITE_ENABLE_SECURE_EXPORT', 'VITE_ALLOW_ACCESS_EFFICIENCY', 'VITE_ALLOW_ACCESS_PFI', 'VITE_ALLOW_ACCESS_RELIABILITY', 'VITE_ALLOW_ACCESS_RISK_MATRIX', 'VITE_ALLOW_ACCESS_LCCA', 'VITE_ALLOW_ACCESS_RBD', 'VITE_ALLOW_ACCESS_OH', 'VITE_ALLOW_ACCESS_IRCFA', 'VITE_ALLOW_ACCESS_AHM', 'VITE_ENVIRONMENT' ].collect { "--build-arg ${it}" }.join(' ') def extraArgs = params.EXTRA_DOCKER_BUILD_ARGS?.trim() ?: '' sh "docker build ${viteArgs} ${extraArgs} -t ${fullImage}:${IMAGE_TAG} ." if (SECONDARY_TAG) { sh "docker tag ${fullImage}:${IMAGE_TAG} ${fullImage}:${SECONDARY_TAG}" } } } } stage('Push to Docker Hub') { steps { script { def fullImage = "${DOCKER_HUB_USERNAME}/${IMAGE_NAME}" sh "docker push ${fullImage}:${IMAGE_TAG}" if (SECONDARY_TAG) { sh "docker push ${fullImage}:${SECONDARY_TAG}" } } } } } post { always { script { sh 'docker logout' def fullImage = "${DOCKER_HUB_USERNAME}/${IMAGE_NAME}" if (IMAGE_TAG?.trim()) { sh "docker rmi ${fullImage}:${IMAGE_TAG} || true" } if (SECONDARY_TAG?.trim()) { sh "docker rmi ${fullImage}:${SECONDARY_TAG} || true" } } } success { echo "Image ${DOCKER_HUB_USERNAME}/${IMAGE_NAME}:${IMAGE_TAG} pushed successfully." } failure { echo "Pipeline failed on branch ${env.BRANCH_NAME}." } } }