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

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

pipeline {
    agent {
        dockerfile {
            filename 'jenkinsfiles/utilities/Dockerfile'
            args '-u jenkins -v /var/run/docker.sock:/var/run/docker.sock -v /home/jenkins/.m2:/home/jenkins/.m2 --privileged'
            label "slave02"
        }
    }

    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}"
            }
        }

        stage('Maven Build'){
            steps{
                script{
                    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} -T 8 clean install"
                }
            }
        }

        stage('Sonar & Dependencies') {
            when { expression { "${params.BRANCH}" == "develop" }}
            steps {
                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
                }
            }
        }

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

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

        stage('Docker Build'){
            steps{
                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}"
            }
        }
    }
}
