/*
 * Copyright (c) 2018-2021 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2022 Contributors to the Eclipse Foundation
 *
 * 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()}"

// Docker images defined in this project in [glassfish]/etc/docker*
// Older image
env.gfImage11 = "dmatej/eclipse-jenkins-glassfish:11.0.14.1"
// Image required to be able to build hibernate-validator snapshot, but now used for glassfish too
env.gfImage17 = "dmatej/eclipse-jenkins-glassfish:17.20"

def jobs = [
  "verifyPhase",
  "cdi_all",
  "ql_gf_full_profile_all",
  "ql_gf_web_profile_all",
  "web_jsp",
  "ejb_group_1",
  "ejb_group_2",
  "ejb_group_3",
  "ejb_group_embedded",
  "batch_all",
  "connector_group_1",
  "connector_group_2",
  "connector_group_3",
  "connector_group_4",
  "jdbc_all",
  "persistence_all",
  "naming_all",
  "deployment_all",
  "security_all",
  "webservice_all"
]

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

def generateStage(job) {
  if (job == 'verifyPhase') {
    return generateMvnPodTemplate(job)
  } else {
    return generateAntPodTemplate(job)
  }
}

def generateMvnPodTemplate(job) {
  return {
    podTemplate(
      inheritFrom: "${env.label}",
      containers: [
        containerTemplate(
          name: "glassfish-build",
          image: "${env.gfImage17}",
          resourceRequestMemory: "7Gi",
          resourceRequestCpu: "2650m"
        )
      ]
    ) {
      node(label) {
        stage("${job}") {
          container('glassfish-build') {
            retry(5) {
              sleep 1
              checkout scm
            }
            timeout(time: 1, unit: 'HOURS') {
              sh """
                mvn clean install
              """
              junit testResults: '**/*-reports/*.xml', allowEmptyResults: false
            }
          }
        }
      }
    }
  }
}

def generateAntPodTemplate(job) {
  return {
    podTemplate(
      inheritFrom: "${env.label}",
      containers: [
        containerTemplate(
          name: "glassfish-build",
          image: "${env.gfImage17}",
          resourceRequestMemory: "4Gi",
          resourceRequestCpu: "2650m"
        )
      ]
    ) {
      node(label) {
        stage("${job}") {
          container('glassfish-build') {
            unstash 'build-bundles'
            sh """
              mkdir -p ${WORKSPACE}/appserver/tests
              tar -xzf ${WORKSPACE}/bundles/appserv_tests.tar.gz -C ${WORKSPACE}/appserver/tests
            """
            try {
              timeout(time: 1, unit: 'HOURS') {
                sh """
                  export CLASSPATH=${WORKSPACE}/glassfish7/javadb
                  ${WORKSPACE}/appserver/tests/gftest.sh run_test ${job}
                """
              }
            } finally {
              archiveArtifacts artifacts: "${job}-results.tar.gz"
              junit testResults: 'results/junitreports/*.xml', allowEmptyResults: false
            }
          }
        }
      }
    }
  }
}

pipeline {

  agent {
    kubernetes {
      label "${env.label}"
      yaml """
apiVersion: v1
kind: Pod
metadata:
spec:
  containers:
  - name: jnlp
    image: jenkins/inbound-agent:4.11-1-alpine-jdk11
    imagePullPolicy: IfNotPresent
    env:
      - name: JAVA_TOOL_OPTIONS
        value: "-Xmx768m -Xss768k"
    resources:
      # fixes random failure: minimum cpu usage per Pod is 200m, but request is 100m.
      # affects performance on large repositories
      limits:
        memory: "1200Mi"
        cpu: "300m"
      requests:
        memory: "1200Mi"
        cpu: "300m"
  - name: glassfish-build
    image: ${env.gfImage17}
    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 -Xmx2500m -Xss768k -XX:+UseStringDeduplication"
      - name: "MVN_EXTRA"
        value: "--batch-mode -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn"
      - name: JAVA_TOOL_OPTIONS
        value: "-Xmx2g -Xss768k -XX:+UseStringDeduplication"
    resources:
      limits:
        memory: "12Gi"
        cpu: "8000m"
      requests:
        memory: "7Gi"
        cpu: "4000m"
  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: {}
"""
    }
  }

  environment {
    S1AS_HOME = "${WORKSPACE}/glassfish7/glassfish"
    APS_HOME = "${WORKSPACE}/appserver/tests/appserv-tests"
    TEST_RUN_LOG = "${WORKSPACE}/tests-run.log"
    GF_INTERNAL_ENV = credentials('gf-internal-env')
    PORT_ADMIN=4848
    PORT_HTTP=8080
    PORT_HTTPS=8181
  }

  options {
    buildDiscarder(logRotator(numToKeepStr: '10'))

    // 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')
  }

  stages {

    stage('build') {
      agent {
        kubernetes {
          label "${env.label}"
        }
      }
      steps {
        container('glassfish-build') {
          timeout(time: 1, unit: 'HOURS') {
            checkout scm
            sh '''
              echo Maven version
              mvn -v

              echo User
              id

              echo Uname
              uname -a

              # temporary build of external snapshot dependencies
              mvn clean install -f ./snapshots/pom.xml
              # Until we fix ANTLR in cmp-support-sqlstore, broken in parallel builds. Just -Pfast after the fix.
              mvn clean install -Pfastest,staging -T4C
              ./gfbuild.sh archive_bundles
              mvn clean
              tar -c -C ${WORKSPACE}/appserver/tests common_test.sh gftest.sh appserv-tests quicklook | gzip --fast > ${WORKSPACE}/bundles/appserv_tests.tar.gz
              ls -la ${WORKSPACE}/bundles
            '''
            archiveArtifacts artifacts: 'bundles/*.zip'
            stash includes: 'bundles/*', name: 'build-bundles'
          }
        }
      }
    }

    stage('tests') {
      steps {
        script {
          parallel parallelStagesMap
        }
      }
    }
  }
}


