pipeline {
  agent any

   options {
    buildDiscarder(logRotator(numToKeepStr: '10'))
    disableConcurrentBuilds()
    skipDefaultCheckout true
  }

  tools {
    maven 'apache-maven-latest'
    jdk 'openjdk-jdk17-latest'
  }

  environment {
    PUBLISH_LOCATION = 'simrel-maven'
  }

  parameters {
    choice(
      name: 'BUILD_TYPE',
      choices: ['nightly', 'milestone', 'release'],
      description: '''
        Choose the type of build.
        Note that a release build will not promote the build, but rather will promote the most recent milestone build.
        '''
    )

    booleanParam(
      name: 'PROMOTE',
      defaultValue: false,
      description: 'Whether to promote the build to the download server.'
    )
  }

  stages {
    stage('Display Parameters') {
      steps {
        echo "BUILD_TYPE=${params.BUILD_TYPE}"
        echo "PROMOTE=${params.PROMOTE}"
        script {
          env.PROMOTE = params.PROMOTE
          env.BUILD_TYPE = params.BUILD_TYPE
        }
      }
    }

    stage('Git Checkout') {
      steps {
        script {
          def gitVariables = checkout(
            poll: false,
            scm: [
              $class: 'GitSCM',
              branches: [[name: '*/master']],
              doGenerateSubmoduleConfigurations: false,
              submoduleCfg: [],
              extensions: [
                [$class: 'CloneOption', shallow: true],
                [$class: 'SparseCheckoutPaths', sparseCheckoutPaths:[[$class:'SparseCheckoutPath', path:'maven/']]]
              ],
              userRemoteConfigs: [[url: 'https://git.eclipse.org/r/oomph/org.eclipse.oomph.incubator.git' ]]
            ]
          )

          echo "$gitVariables"
          env.GIT_COMMIT = gitVariables.GIT_COMMIT
        }
      }
    }

    stage('Initialize PGP') {
      steps {
        withCredentials([file(credentialsId: 'secret-subkeys.asc', variable: 'KEYRING')]) {
         sh '''
           gpg --batch --import "${KEYRING}"
           for fpr in $(gpg --list-keys --with-colons  | awk -F: \'/fpr:/ {print $10}\' | sort -u); do echo -e "5\ny\n" |  gpg --batch --command-fd 0 --expert --edit-key ${fpr} trust; done
           '''
        }
      }
    }

    stage('Build SimRel Maven') {
      steps {
        sshagent(['projects-storage.eclipse.org-bot-ssh']) {
          dir('maven') {
            withCredentials([string(credentialsId: 'gpg-passphrase', variable: 'KEYRING_PASSPHRASE')]) {
              sh '''
                if [[ $PROMOTE == false ]]; then
                  promotion_argument='-Dorg.eclipse.justj.p2.manager.args='
                fi
                mvn \
                  --no-transfer-progress \
                  $promotion_argument \
                  -Pgpg-sign \
                  -Dgpg.passphrase="${KEYRING_PASSPHRASE}" \
                  -Dorg.eclipse.justj.p2.manager.build.url=$JOB_URL \
                  -Dorg.eclipse.justj.p2.manager.relative=$PUBLISH_LOCATION \
                  -Dgit.commit=$GIT_COMMIT \
                  -Dbuild.id=$BUILD_NUMBER \
                  -Dbuild.type=$BUILD_TYPE \
                  -Ddash.projectId=tools.oomph \
                  -Ddash.fail=true \
                  clean \
                  verify
                '''
            }
          }
        }
      }
    }

    stage('Archive Results') {
      steps {
        archiveArtifacts 'maven/**'
      }
    }
  }

  post {
    failure {
      mail to: 'ed.merks@gmail.com',
      subject: "[Oomph CI] Build Failure ${currentBuild.fullDisplayName}",
      mimeType: 'text/html',
      body: "Project: ${env.JOB_NAME}<br/>Build Number: ${env.BUILD_NUMBER}<br/>Build URL: ${env.BUILD_URL}<br/>Console: ${env.BUILD_URL}/console"
    }

    fixed {
      mail to: 'ed.merks@gmail.com',
      subject: "[Oomph CI] Back to normal ${currentBuild.fullDisplayName}",
      mimeType: 'text/html',
      body: "Project: ${env.JOB_NAME}<br/>Build Number: ${env.BUILD_NUMBER}<br/>Build URL: ${env.BUILD_URL}<br/>Console: ${env.BUILD_URL}/console"
    }

    cleanup {
      deleteDir()
    }
  }
}