/*
 * 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 image defined in this project in [glassfish]/etc/docker/Dockerfile
env.gfImage = "ee4jglassfish/ci:tini-jdk-11.0.10"

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.gfImage}",
          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.gfImage}",
          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}/glassfish6/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.gfImage}
    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}/glassfish6/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

              # 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
        }
      }
    }
  }
}


