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

JAVA_HOME='/opt/java/openjdk'
MVN_HOME='mvn_local_repository'
REPO='reporting'
ECR_TAG=""
BUILD_LINK = ""
s_version = ""

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

    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: 'new-jenkins-bitbucket-ssh', 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{
                    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')]) {
                        s_version = sh(script: "./mvnw org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout | grep SNAPSHOT", returnStdout: true).trim()
                        s_version = s_version.split("-")[0]
                        sh "./mvnw -U -s $MAVEN_SETTINGS_XML -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} -T 8 clean install"
                    }
                }
            }
        }

        stage('Sonar & Dependencies') {
            when { expression { "${params.BRANCH}" == "develop" }}
            steps {
                script {
                    configFileProvider([configFile(fileId: 'netfoundry_maven_settings', variable: 'MAVEN_SETTINGS_XML')]) {
                        sh "./mvnw -U -s $MAVEN_SETTINGS_XML -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}"
                }
            }
        }

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

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

        stage('Docker Build'){
            steps{
                sh "docker --version"
                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=${s_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}"
            }
        }
    }
}