pipeline { agent any environment { HARBOR = 'registry.myriadcara.com' IMAGE = 'registry.myriadcara.com/ecommerce/backend' VERSION_FILE = '/home/jenkins/vaishnavi-backend-version.txt' GIT_REPO = 'https://gitea.myriadcara.com/subodh/vaishnavi-ecommerce-backend.git' GIT_BRANCH = 'main' } stages { stage('Checkout') { steps { git( url: "${GIT_REPO}", branch: "${GIT_BRANCH}", credentialsId: 'gitea-creds' ) } } stage('Generate Tag') { steps { script { def exists = sh( script: "test -f ${VERSION_FILE} && echo yes || echo no", returnStdout: true ).trim() def version = (exists == 'yes') ? sh(script: "cat ${VERSION_FILE}", returnStdout: true).trim() : '1.0.0' def parts = version.tokenize('.') def major = parts[0].toInteger() def minor = parts[1].toInteger() def patch = parts[2].toInteger() + 1 def newVersion = "${major}.${minor}.${patch}" sh "echo '${newVersion}' > ${VERSION_FILE}" env.TAG = newVersion echo "🏷️ New image tag: v${env.TAG}" } } } stage('Install Dependencies') { steps { sh ''' node --version npm --version npm ci --prefer-offline ''' } } stage('Build Docker Image') { steps { sh """ docker build \\ -t ${IMAGE}:${env.TAG} \\ -t ${IMAGE}:latest \\ --label build-number=${env.BUILD_NUMBER} \\ --label version=${env.TAG} \\ . """ } } stage('Push to Harbor') { steps { withCredentials([usernamePassword( credentialsId: 'harbor-creds', usernameVariable: 'HARBOR_USER', passwordVariable: 'HARBOR_PASS' )]) { sh """ echo "\$HARBOR_PASS" | docker login ${HARBOR} -u "\$HARBOR_USER" --password-stdin docker push ${IMAGE}:${env.TAG} docker push ${IMAGE}:latest """ } } } } post { always { sh "docker rmi ${IMAGE}:${env.TAG} || true" sh "docker rmi ${IMAGE}:latest || true" cleanWs() } success { echo "✅ Successfully pushed: ${IMAGE}:${env.TAG}" } failure { echo "❌ Pipeline failed at tag: ${env.TAG}" } } }