@Library('nf-jenkins-shared-libraries')_  

def slavepool = "slave01 slave02 master"
def SLEEP = 5
def repo = "oss"
MVN_HOME='mvn_local_repository'
def dependants = ["network", "registration" , "certificate" ]
jfrog_url = "https://netfoundry.jfrog.io/netfoundry/"
SERVER_ID = "netfoundry"

pipeline {
    agent any
    environment {
        DOCKER_HUB = credentials('dockerhub')
        SONAR_CLOUD = credentials('sonar')
        BITBUCKET_AUTH = credentials('bitbucket_auth')
        ARTIFACTORY = credentials('jfrog-mop-reader')
    }
    tools {
        maven 'apache-maven-3.6.0'
    }
    stages {

        stage('Check if Release Exists') {
            steps {
                script {
                    def pom_version = sh (script: "mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout", returnStdout: true).trim()
                    artifactory_login = "/usr/sbin/jfrog rt c --interactive=false --url=${jfrog_url} --user=${ARTIFACTORY_USR} --apikey=${ARTIFACTORY_PSW} ${SERVER_ID}"
                    sh "${artifactory_login}"
                    def artifacts_raw =sh (script: "/usr/sbin/jfrog rt search --sort-by=created --sort-order=asc mop-local-releases/io/netfoundry/OSS/ | grep -v Info",returnStdout: true).trim()
                    echo "${artifacts_raw}"
                    artifacts = new groovy.json.JsonSlurperClassic().parseText(artifacts_raw)
                    for(int i=0; i < artifacts.size(); i++){
                        def path = artifacts[i]["path"].split("/")[4]
                        release_artifact = "${path}-SNAPSHOT"
                        echo "Path: ${path}, Pom: ${pom_version}"
                        if( release_artifact == pom_version) {
                            error("${pom_version} cannot be built or published as a snapshot, as there is already an existing release version ${path}")
                        }
                    }
                }
            }
        }

        stage('Build') {
            steps {
                script {
                    echo "Running on ${NODE_NAME}"
                    bitbucketStatus repo: "${repo}", BRANCH_NAME: "${BRANCH_NAME}", GIT_COMMIT: "${GIT_COMMIT}", status: "INPROGRESS"
                    sh "mkdir -p ${MVN_HOME}/${BUILD_NUMBER}"
                    dir("${MVN_HOME}/${BUILD_NUMBER}") {
                        sh "for dir in \$(ls \$HOME/.m2/repository/ | grep -v 'io'); do ln -s \$HOME/.m2/repository/\$dir \$dir; done"
                    }
                    sh "export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64/; mvn -U -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} clean install"
                }
            }
        }
        stage('Sonar') {
            steps {
                script {
                    sh "export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64/;  mvn -T 4 sonar:sonar -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} -Dsonar.host.url=https://sonarcloud.io "+
                       "-Dsonar.organization=netfoundry -Dsonar.projectName=OSS "+
                       "-Dsonar.branch.name=${BRANCH_NAME} -Dsonar.login=${SONAR_CLOUD_PSW}"
                }
            }
        }
        stage('JUnit') {
            steps {
                script {
                    junitParse services: [repo], parallelize: false, dir: "", xml: "target/surefire-reports/*.xml"
                }
            }
        }

        stage('Artifactory') {
            when { expression { BRANCH_NAME == "develop" || BRANCH_NAME ==~ /(release.*)/ }}
            steps {
                script {
                    artifactory REPO: "OSS", BUILDPATH: "${MVN_HOME}/${BUILD_NUMBER}"
                    artifactoryVeracode REPO: "OSS",  BUILDPATH: "${MVN_HOME}/${BUILD_NUMBER}", ACTION: "upload"
                }
            }
        }
    }
    post {
        always {
            sh "rm -rf ${MVN_HOME}/${BUILD_NUMBER}"
        }
        aborted {
            bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "STOPPED"
        }
        failure {
            bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "FAILED"
        }
        success {
            bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "SUCCESSFUL"
        }
    }
}
