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

def changedProjects = ["cloud-provider-model", "cloud-provider-sdk", "cloud-provider-service-base", "cloud-provider-services"]

REPO = "cloud-provider-services"
MVN_HOME='mvn_local_repository'
JAVA_HOME='/opt/java/openjdk'
SERVER_ID = "netfoundry"
BRANCH_NAME="develop"

jfrog_url = "https://netfoundry.jfrog.io/netfoundry/"

link_url = ""

channel = "cd-mop-staging"

skip_dependency = false

pipeline {
    agent {
        ecs {
            inheritFrom 'ec2-agent-jdk17'
        }
    }

    environment {
        SONAR_CLOUD = credentials('sonar')
        BITBUCKET_AUTH = credentials('bitbucket_auth')
        ARTIFACTORY = credentials('jfrog-mop-reader')
    }

    stages {
        stage('Build') {
            steps {
                script {
                    bitbucketStatus repo: REPO, BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, PR_CHECK: "false", 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"
                    }
                    configFileProvider([configFile(fileId: 'netfoundry_maven_settings', variable: 'MAVEN_SETTINGS_XML')]) {
                        sh "./mvnw -s $MAVEN_SETTINGS_XML -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} clean install"
                    }
                }
            }
        }
        
        stage('Dependency-Check') {
            steps {
                script {
                    try{
                        configFileProvider([configFile(fileId: 'netfoundry_maven_settings', variable: 'MAVEN_SETTINGS_XML')]) {
                            sh "./mvnw -s $MAVEN_SETTINGS_XML -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} -Pdependence_check -DskipTests dependency-check:aggregate xml:transform"
                        }
                    }catch(e){
                        skip_dependency = true
                        echo "Dependency Checks failed with error ${e}"
                        fn_msg = "Dependency Checks failed. The build will still continue. Please check link for details."
                        color = "#FF8000"
                        author_email = fetch_author_email("${REPO}", "${GIT_COMMIT}")
                        send_custom_notification("${author_email}", "${REPO}", "${channel}", "${fn_msg}", "${color}", "${link_url}")
                    }
                }
            }  
        }

        stage('Sonar') {
            steps {
                script {
                    sh "./mvnw -T 8 sonar:sonar -DskipTests -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} -Dsonar.host.url=https://sonarcloud.io \
                       -Dsonar.organization=netfoundry -Dsonar.projectName=${REPO} -Dsonar.branch.name=${BRANCH_NAME} -Dsonar.login=${SONAR_CLOUD_PSW}"
                }
            }
        }

        stage('Archive Artifacts'){
            steps{
                script {
                    archiveArtifacts "target/*.*"
                }
            }
        }

        stage('JUnit Reports'){
            steps {
                script {
                    junitParse services: [REPO], parallelize: false, dir: "", xml: "target/surefire-reports/*.xml"
                }
            }
        }

        stage('Artifactory') {
            steps {
                script {
                    for( String p: changedProjects) {
                        artifactory_mvnw REPO: "${p}", BUILDPATH: "${MVN_HOME}/${BUILD_NUMBER}"
                    }
                }
            }
        }
    }

    post {
        always {
            script {
              sh "rm -rf ${MVN_HOME}/${BUILD_NUMBER}"
            }
        }
        aborted {
            bitbucketStatus repo: REPO, BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, PR_CHECK: "false", status: "STOPPED"
        }
        failure {
            bitbucketStatus repo: REPO, BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, PR_CHECK: "false", status: "FAILED"
        }
        success {
            bitbucketStatus repo: REPO, BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, PR_CHECK: "false", status: "SUCCESSFUL"
        }
    }
}