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'), 
                string(credentialsId: 'gitlab-api-token', variable: 'GITLAB_API_TOKEN') ]) {
              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 \
                  -Ddash.iplab.token=$GITLAB_API_TOKEN \
                  clean \
                  verify
                '''
            }
          }
        }
      }
    }
 
     stage('Start Repository Analysis') {
      when {
        expression {
          params.PROMOTE
        }
      }
      steps {
        sshagent(['projects-storage.eclipse.org-bot-ssh']) {
          script {
            def repositories = sh(returnStdout: true, script: '''
                ssh genie.oomph@projects-storage.eclipse.org '
                  cd /home/data/httpd/download.eclipse.org/oomph/
                  for i in $(find '${PUBLISH_LOCATION}' -name content.xml.xz); do [ ! -d $(dirname $i)/archive ] && echo $(dirname $i); done
                  exit 0
                '
            ''')

            for (String repository : repositories.split("\\s")) {
              echo "repository: '${repository}'"
              build job: 'repository-analyzer-any',
              parameters: [
                  booleanParam(name: 'PROMOTE', value: true),
                  booleanParam(name: 'TEST', value: false),
                  string(name: 'RELATIVE_LOCATION', value: "${repository}")
              ],
              wait: false
            }
          }
        }
      }
    }

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