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

JAVA_HOME='/usr/local/jdk-17/'
MVN_HOME='mvn_local_repository'
REPO='authorization'
ECR_TAG='none set'
BUILD_LINK = ""

pipeline {
    agent {
        label "slave02"
    }
    environment {
        ARTIFACTORY = credentials('jfrog-mop-reader')
        SONAR_CLOUD = credentials('sonar')
    }
    options{skipDefaultCheckout()}

    parameters {
        choice(name: 'IMAGE_TYPE', choices: ['sandbox', 'release', 'hotfix'], description: 'Whether the image is to be a release for prod or a release candidate for lower environments')
        string(name: 'BRANCH', defaultValue: 'develop', description: 'Branch to be built from')
    }

    stages {
        stage('Checkout Branch') {
            steps {
                git credentialsId: 'afd18d9b-3d41-4b59-b5cc-05cd7df2ce63', url: "git@bitbucket.org:netfoundry/${REPO}.git", branch: "${params.BRANCH}"
                sh "ls"
                script {
                    GIT_HASH = sh(returnStdout: true, script: "git rev-parse --short HEAD").trim()
                }
                echo "hash is: ${GIT_HASH}"
                stash includes: '**', name: 'code'
            }
        }

        stage('Maven Build'){
            agent {
                docker {
                    image "netfoundry/java-builds:java-17"
                    args "-u jenkins -v /var/run/docker.sock:/var/run/docker.sock -v /home/jenkins/:/home/jenkins/ --privileged"
                    registryUrl "https://registry.hub.docker.com/"
                    registryCredentialsId "dockerhub"
                    alwaysPull true
                }
            }
            steps{
                script{
                    unstash 'code'
                    sh "ls"
                    VERSION = sh(script: "./mvnw org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout", returnStdout: true).trim()
                    VERSION = VERSION.split("-")[0]
                    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 "./mvnw -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} clean install"
                    stash includes: '**', name: 'code'
                }
            }
        }

        stage('Sonar & Dependencies') {
            agent {
                docker {
                    image "netfoundry/java-builds:java-17"
                    args "-u jenkins -v /var/run/docker.sock:/var/run/docker.sock -v /home/jenkins/:/home/jenkins/ --privileged"
                    registryUrl "https://registry.hub.docker.com/"
                    registryCredentialsId "dockerhub"
                    alwaysPull true
                }
            }
            when { expression { "${params.BRANCH}" == "develop" }}
            steps {
                unstash 'code'
                script {
                    sh "./mvnw -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} -T 8 -DskipTests dependency-check:check xml:transform"
                }
                script {
                    sonar_project_name = "${REPO}"
                    check_sonar_with_dependency_mvnw BRANCH: "${params.BRANCH}", PROJECT_NAME: "${sonar_project_name}", JAVA_HOME: JAVA_HOME, MAVEN_HOME: "${MVN_HOME}/${BUILD_NUMBER}", skipTests: true
                }
                stash includes: '**', name: 'code'
            }
        }

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

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

        stage('Artifactory') {
            when { expression { "${params.BRANCH}" == "develop" }}
            steps {
                unstash 'code'
                script {
                    artifactory_mvnw REPO: "${REPO}",  BUILDPATH: "${MVN_HOME}/${BUILD_NUMBER}"
                }
            }
        }

        stage('Docker Build'){
            steps{
                unstash 'code'
                sh "aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 447513199460.dkr.ecr.us-east-1.amazonaws.com"
                sh "docker build --build-arg version=${VERSION} . -t local/${REPO}"
                sh "ls"
            }
        }

        stage('Docker Push'){
            steps{
                script{
                    def tag_suffix = "${new Date().format('yyyyMMddHHmm')}"
                    ECR_TAG = "${GIT_HASH}-${IMAGE_TYPE}-${tag_suffix}"
                    currentBuild.description = "Git Hash: ${GIT_HASH}\n ECR Tag: ${ECR_TAG}"
                    awsEcrImageCreate("${REPO}", "${ECR_TAG}", "production")
                }
            }
        }

        stage('Vulnerability Scan'){
            steps{
                script{
                    awsVulnerabilityScan("${REPO}", "${ECR_TAG}", "production")
                    vulnerabilityGating("${REPO}", "${params.BRANCH}")
                    log_dependencyCheckVulnerability_elasticsearch("${REPO}", "${GIT_HASH}")
                }
            }
        }
    }

    post {
        always {
            script {
                sh "rm -rf ${MVN_HOME}/${BUILD_NUMBER}"
                env.BUILD_LINK = "${RUN_DISPLAY_URL}"
            }
        }
        success {
            script {
                env.ECR_TAG = "${ECR_TAG}"
            }
        }
    }
}
