@groovy.transform.Field String VERSION @NonCPS String extractBaseVersion(String pom) { def matcher = pom =~ /pf-sdn<\/artifactId>\s*([0-9.]+)<\/version>/ return matcher.find() ? matcher.group(1) : null } pipeline { agent any environment { NEXUS_URL = 'http://172.16.0.59:8001' NEXUS_CREDENTIALS_ID = 'nexus_cred' } stages { stage('Set build number into version') { steps { script { def pom = readFile('pom.xml') def baseVersion = extractBaseVersion(pom) if (!baseVersion) { error "Project version not found in pom.xml" } echo "Base version from pom: ${baseVersion}" def parts = baseVersion.tokenize('.') parts[parts.size() - 1] = env.BUILD_NUMBER VERSION = parts.join('.') echo "New project version: ${VERSION}" sh "mvn -B versions:set -DnewVersion=${VERSION} -DprocessAllModule" sh 'mvn -B versions:commit' } } } stage('Maven package') { steps { sh 'mvn -B clean package verify' } } stage('Build docker image') { steps { sh "docker build -f Dockerfile -t pfsdn:${VERSION} ." echo "Saving docker image pfsdn:${VERSION}" sh "docker save pfsdn:${VERSION} | gzip > pfsdn-${VERSION}.tar.gz" } } stage('Push docker image to Nexus') { steps { script { def nexusHost = NEXUS_URL .replaceAll(/^https?:\/\//, '') .replaceAll(/\/+$/, '') def nexusImage = "${nexusHost}/pfsdn:${VERSION}" withCredentials([usernamePassword( credentialsId: NEXUS_CREDENTIALS_ID, usernameVariable: 'NEXUS_USER', passwordVariable: 'NEXUS_PASS' )]) { sh """ echo "\${NEXUS_PASS}" | docker login ${nexusHost} -u "\${NEXUS_USER}" --password-stdin docker tag pfsdn:${VERSION} ${nexusImage} docker push ${nexusImage} docker rmi ${nexusImage} || true docker rmi pfsdn:${VERSION} || true """ } } } } stage('Upload app to Nexus') { steps { script { withCredentials([usernamePassword(credentialsId: 'nexus-credentials', usernameVariable: 'NEXUS_USER', passwordVariable: 'NEXUS_PASSWORD')]) { sh """ curl -v -u ${NEXUS_USER}:${NEXUS_PASSWORD} \ --upload-file launcher/target/${VERSION}.pfapp \ http://172.16.0.59:8081/repository/object-storage/apps/${VERSION}.pfapp """ } } } } stage('Deploy') { steps { script { archiveArtifacts artifacts: "pfsdn-${VERSION}.tar.gz", fingerprint: true echo "Saving pfapp artifact ${VERSION}.pfapp" archiveArtifacts artifacts: "launcher/target/${VERSION}.pfapp", fingerprint: true echo "TODO: deploy ${VERSION}.pfapp to repository (not implemented yet)" } } } } post { always { sh "docker rmi pfsdn:${VERSION} || true" } success { cleanWs() } } }