pf-sdn/Jenkinsfile

124 lines
3.9 KiB
Groovy

@groovy.transform.Field String VERSION
@NonCPS
String extractBaseVersion(String pom) {
def matcher = pom =~ /<artifactId>pf-sdn<\/artifactId>\s*<version>([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 --build-arg VERSION=${VERSION} -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_ID,
usernameVariable: 'NEXUS_USER',
passwordVariable: 'NEXUS_PASSWORD')]) {
sh """
curl -f -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
}
}
}
}
post {
always {
sh "docker rmi pfsdn:${VERSION} || true"
}
success {
cleanWs()
}
}
}