import org.apache.commons.codec.digest.DigestUtils;
@Library('nf-jenkins-shared-libraries')_


def SLEEP = 5
def repo = "notification"
MVN_HOME='mvn_local_repository'

pipeline {
  agent any
  environment {
    DOCKER_HUB = credentials('dockerhub')
    SONAR_CLOUD = credentials('sonar')
    X_RAY = credentials("x_ray_user")
    BITBUCKET_AUTH = credentials('bitbucket_auth')
    SRCCLR_API_TOKEN = credentials('SRCCLR_API_TOKEN')
  }
  tools {
    maven 'apache-maven-3.6.0'
  }

  stages {
    stage('Build') {
        steps {
            script {
                echo "Running on ${NODE_NAME}"
                bitbucketStatus repo: "${repo}", BRANCH_NAME: "${BRANCH_NAME}", GIT_COMMIT: "${GIT_COMMIT}", status: "INPROGRESS"
                sh "export SPRING_PROFILES_ACTIVE=test"
                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 "export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64/; mvn -Dmaven.repo.local=${MVN_HOME}/${BUILD_NUMBER} clean install"
            }
        }
    }

    // stage('Xray Scan'){
    //     when { expression { BRANCH_NAME == "develop" }}
    //     steps{
    //         script {
    //             x_ray X_RAY_USR: "${X_RAY_USR}", X_RAY_PSW: "${X_RAY_PSW}", BUILD_NAME: "${repo}", BUILD_NUMBER: "${BUILD_NUMBER}", JOB_NAME: "${env.JOB_NAME}"
    //         }
    //     }
    // }


    stage('Sonar') {
      steps {
          script {
              sh "pwd"
              sh "ls -ltr"
              sh "export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto.x86_64/; mvn sonar:sonar -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=netfoundry_notification "+
                    "-Dsonar.branch.name=${BRANCH_NAME} -Dsonar.login=${SONAR_CLOUD_PSW} "+
                    "-Dsonar.java.pmd.reportPaths=target/pmd.xml,target/dependency-check-report-pmd.xml"
            }
        }
    }

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

    stage('Artifactory') {
        when { expression { BRANCH_NAME == "develop" }}
        steps { 
            script {
                artifactory REPO: "${repo}",  BUILDPATH: "${MVN_HOME}/${BUILD_NUMBER}"
                artifactoryVeracode REPO: "${repo}",  BUILDPATH: "${MVN_HOME}/${BUILD_NUMBER}", ACTION: "upload"
            }
        }
    }
    stage('OWASP Vulnerability Scan') {
        steps {
            script {
                archiveArtifacts "target/*.*"
            }
        }
    }

    stage('Docker') {
        when { expression { BRANCH_NAME == "develop" || BRANCH_NAME ==~ /(release.*)/ || BRANCH_NAME ==~ /(hotfix.*)/ }}
        steps {
            script {
                buildDocker REPO: "${repo}", GIT_COMMIT: "${GIT_COMMIT}", BUILD_NUMBER: "${BUILD_NUMBER}", BRANCH_NAME: "${BRANCH_NAME}"
                if(BRANCH_NAME == "develop") {
                    veracodeContainerScan REPO: "${repo}"
                }
                try {
                    sh "docker rmi netfoundry/${repo}:${GIT_COMMIT}"
                    sh "docker rmi netfoundry/${repo}:sandbox"
                    sh "docker rmi netfoundry/${repo}:latest"
                } catch(err) {
                    echo "Docker images cleanup not done: ${err}"
                }
            }
        }
    }


    stage('Terraform'){
      when { expression { BRANCH_NAME == "develop"  }}
      steps {
        script { 
          terraform directory: "terraform", environment: "sandbox"
        }
      }
    }


    stage('Deployment') {
      when { expression { BRANCH_NAME == "develop" }}
      steps {
        script {
          withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', credentialsId: "aws_sandbox", variable: 'AWS_ACCESS_KEY_ID']]) {
            sh "ecs deploy --region us-east-1 --timeout 600 ecs-cluster-nfn-internal-env-private ecs-${repo}-service"
          }
        }
      }
    }

    stage('Promote to Staging') {
            when { expression { BRANCH_NAME == "develop" }}
            steps {
                script {
                    build_job = build job: 'Continous_Deployment_Env_Testing', parameters: [
                        [$class: 'StringParameterValue', name: 'branch', value: "${GIT_COMMIT}"],
                        [$class: 'StringParameterValue', name: 'REPO', value: "${repo}"],
                        [$class: 'StringParameterValue', name: 'environment', value: "staging"],
                        [$class: 'BooleanParameterValue', name: 'promote', value: true],
                        [$class: 'BooleanParameterValue', name: 'slack_notify', value: true],
                        [$class: 'BooleanParameterValue', name: 'execute_terraform', value: true]
                    ], propagate: false, wait: false
                }
            }
        }
  }

  post {
      always {
          sh "rm -rf ${MVN_HOME}/${BUILD_NUMBER}"
      }
      aborted {
          bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "STOPPED"
      }
      failure {
          bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "FAILED"
            script {
                if( "${BRANCH_NAME}" == "develop" ){
                    mattermostFailureNotification repo: "${repo}", commit: GIT_COMMIT, build_url: RUN_DISPLAY_URL, channel: "cd-mop-staging"
                }
            }
      }
      success {
          bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "SUCCESSFUL"
      }
  }

}
