@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 -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('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()
        }
    }
}
