/*
 * Copyright (c) 2018-2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */


// the label is unique and identifies the pod descriptor and its resulting pods
// without this, the agent could be using a pod created from a different descriptor
env.label = "glassfish-ci-pod-${UUID.randomUUID().toString()}"

// list of test ids
def jobs = [
  "cdi_all",
  "ql_gf_full_profile_all",
  "ql_gf_web_profile_all",
  "web_jsp"
]


def jobs_all = [
  "cdi_all",
  "ql_gf_full_profile_all",
  "ql_gf_web_profile_all",
  "web_jsp",
  
  "deployment_all",
  "ejb_group_1",
  "ejb_group_2",
  "ejb_group_3",
  "ejb_web_all",
  "ql_gf_nucleus_all",
  "nucleus_admin_all",
  "jdbc_all",
  "batch_all",
  "persistence_all",
  "connector_group_1",
  "connector_group_2",
  "connector_group_3",
  "connector_group_4"
]

def parallelStagesMap = jobs.collectEntries {
  ["${it}": generateStage(it)]
}

def generateStage(job) {
    return {
        podTemplate(label: env.label) {
            node(label) {
                stage("${job}") {
                    container('glassfish-ci') {
                      // do the scm checkout
                      retry(10) {
                        sleep 60
                        checkout scm
                      }
                      
                      // run the test
                      unstash 'build-bundles'
                      
                      try {
                          retry(3) {
                              timeout(time: 2, unit: 'HOURS') {
                                sh """
                                  export CLASSPATH=$WORKSPACE/glassfish6/javadb
                                  ./appserver/tests/gftest.sh run_test ${job}
                                """
                              }
                          }
                      } finally {
                        // archive what we can...
                        archiveArtifacts artifacts: "${job}-results.tar.gz"
                        junit testResults: 'results/junitreports/*.xml', allowEmptyResults: false
                      }
                    }
                }
            }
        }
    }
}

pipeline {
  
  options {
    // keep at most 50 builds
    buildDiscarder(logRotator(numToKeepStr: '10'))
    
    // preserve the stashes to allow re-running a test stage
    preserveStashes()
    
    // issue related to default 'implicit' checkout, disable it
    skipDefaultCheckout()
    
    // abort pipeline if previous stage is unstable
    skipStagesAfterUnstable()
    
    // show timestamps in logs
    timestamps()
    
    // global timeout, abort after 6 hours
    timeout(time: 6, unit: 'HOURS')
  }
  
  agent {
    kubernetes {
      label "${env.label}"
      defaultContainer 'glassfish-ci'
      yaml """
apiVersion: v1
kind: Pod
metadata:
spec:
  volumes:
    - name: "jenkins-home"
      emptyDir: {}
    - name: maven-repo-shared-storage
      persistentVolumeClaim:
       claimName: glassfish-maven-repo-storage
    - name: settings-xml
      secret:
        secretName: m2-secret-dir
        items:
        - key: settings.xml
          path: settings.xml
    - name: settings-security-xml
      secret:
        secretName: m2-secret-dir
        items:
        - key: settings-security.xml
          path: settings-security.xml
    - name: maven-repo-local-storage
      emptyDir: {}
  containers:
  - name: jnlp
    image: jenkins/jnlp-slave:alpine
    imagePullPolicy: IfNotPresent
    env:
      - name: JAVA_TOOL_OPTIONS
        value: -Xmx1G
    resources:
      limits:
        memory: "1Gi"
        cpu: "1"
  - name: glassfish-ci
    # Docker image defined in this project in [glassfish]/etc/docker/Dockerfile
    image: ee4jglassfish/ci:tini-jdk-11.0.10
    args:
    - cat
    tty: true
    imagePullPolicy: Always
    volumeMounts:
      - name: "jenkins-home"
        mountPath: "/home/jenkins"
        readOnly: false
      - name: maven-repo-shared-storage 
        mountPath: /home/jenkins/.m2/repository
      - name: settings-xml
        mountPath: /home/jenkins/.m2/settings.xml
        subPath: settings.xml
        readOnly: true
      - name: settings-security-xml
        mountPath: /home/jenkins/.m2/settings-security.xml
        subPath: settings-security.xml
        readOnly: true
      - name: maven-repo-local-storage
        mountPath: "/home/jenkins/.m2/repository/org/glassfish/main"
    env:
      - name: "MAVEN_OPTS"
        value: "-Duser.home=/home/jenkins"
      - name: "MVN_EXTRA"
        value: "--batch-mode -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn"
    resources:
      limits:
        memory: "7Gi"
        cpu: "3"
"""
    }
  }
  
  environment {
    S1AS_HOME = "${WORKSPACE}/glassfish6/glassfish"
    APS_HOME = "${WORKSPACE}/appserver/tests/appserv-tests"
    TEST_RUN_LOG = "${WORKSPACE}/tests-run.log"
    GF_INTERNAL_ENV = credentials('gf-internal-env')
  }
  
  stages {
    stage('build') {
      agent {
        kubernetes {
          label "${env.label}"
        }
      }
      steps {
        container('glassfish-ci') {
          timeout(time: 1, unit: 'HOURS') {
            
            // do the scm checkout
            checkout scm
            
            // do the build
            sh '''
              echo Maven version
              mvn -v
              
              echo User
              id
              
              echo Uname
              uname -a
              
              bash -xe ./gfbuild.sh build_re_dev
            '''
            archiveArtifacts artifacts: 'bundles/*.zip'
            // junit testResults: 'test-results/build-unit-tests/results/junitreports/test_results_junit.xml'
            stash includes: 'bundles/*', name: 'build-bundles'
          }
        }
      }
    }
    
    stage('tests') {
      steps {
        script {
          parallel parallelStagesMap
        }
      }
    }
  }
}


