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

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

s_version=""
link_url = ""

channel = "cd-mop-staging"

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

    environment {
        SONAR_CLOUD = credentials('sonar')
        BITBUCKET_AUTH = credentials('bitbucket_auth')
        NVD_API_KEY = credentials('nvd_api_key')
    }

    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}"
                }
                script {
                    configFileProvider([configFile(fileId: 'netfoundry_maven_settings', variable: 'MAVEN_SETTINGS_XML')]) {
                        s_version = sh(script: "./mvnw -s $MAVEN_SETTINGS_XML 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 """
                            export JAVA_HOME=${JAVA_HOME}
                            ./mvnw -U -s $MAVEN_SETTINGS_XML -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} -DnvdApiKey=${NVD_API_KEY_PSW} -T 8 clean install
                        """
                    }
                }
            }
        }

        stage('Sonar Analysis') {
            when { expression { "${params.BRANCH}" == "develop" }}
            steps {
                script {
                    sonar_project_name = "${REPO}"
                    sonar_link = checkSonarGateMvnw PROJECT_NAME: "${sonar_project_name}", BRANCH: "${params.BRANCH}", MAVEN_HOME: "${MVN_HOME}/${BUILD_NUMBER}", JAVA_HOME: JAVA_HOME
                    if( sonar_link != "") {
                        error "Sonar Analysis failed. Link -> ${sonar_link}"
                    }
                }
            }
        }

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

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