pipeline {
   agent {
       label 'ubuntu'
   }
   
    tools { 
        ant 'Ant 1.10.6'
        maven 'Maven 3.6.2' 
        jdk 'JDK 1.8.0_241' 
    }
    
    environment {
        ANT_OPTS = "-Djavax.xml.accessExternalSchema=all"
    }
    
    stages {
        stage("Initialization") {
            steps {
                buildName "#${BUILD_NUMBER} CXF ${params.Version} JAX-RS 2.1 TCK"
            }
        }

       stage("Prepare") {
           steps {
               cleanWs()
           }
       }

       stage ('Check tooling') {
            steps {
                sh '''
                    echo "PATH = ${PATH}"
                    echo "M2_HOME = ${M2_HOME}"
                    echo "JAVA_HOME = ${JAVA_HOME}"
                    echo "ANT_HOME = ${ANT_HOME}"
                    echo "WORKSPACE = ${PWD}"
                '''
            }
        }
       
       stage('Download JakartaEE TCK') {
           steps {
               checkout([$class: 'GitSCM',
	           branches: [[name: 'refs/tags/8.0.0']],
                   userRemoteConfigs: [[url: 'https://github.com/eclipse-ee4j/jakartaee-tck']],
                   extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'jakartaee-tck']]
               ])
           }
       }
       
       stage('Download Glassfish 5.1.0') { // for display purposes
           steps {
               sh 'wget https://repo1.maven.org/maven2/org/glassfish/main/distributions/glassfish/5.1.0/glassfish-5.1.0.zip'
               sh 'unzip glassfish-5.1.0.zip'
               sh 'rm glassfish-5.1.0.zip'
           }
       }
       
       stage('Download Apache CXF bits') {
           steps {
               echo "Using Apache CXF version: " + params.Version
               sh "mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -DremoteRepositories=https://repository.apache.org/snapshots,https://repository.apache.org -Dartifact=org.apache.cxf:cxf-core:${params.Version}:jar -Dtransitive=false -Ddest=glassfish5/glassfish/lib"
               sh "mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -DremoteRepositories=https://repository.apache.org/snapshots,https://repository.apache.org -Dartifact=org.apache.cxf:cxf-rt-frontend-jaxrs:${params.Version}:jar -Dtransitive=false -Ddest=glassfish5/glassfish/lib"
               sh "mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -DremoteRepositories=https://repository.apache.org/snapshots,https://repository.apache.org -Dartifact=org.apache.cxf:cxf-rt-rs-client:${params.Version}:jar -Dtransitive=false -Ddest=glassfish5/glassfish/lib"
               sh "mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -DremoteRepositories=https://repository.apache.org/snapshots,https://repository.apache.org -Dartifact=org.apache.cxf:cxf-rt-rs-sse:${params.Version}:jar -Dtransitive=false -Ddest=glassfish5/glassfish/lib"
               sh "mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -DremoteRepositories=https://repository.apache.org/snapshots,https://repository.apache.org -Dartifact=org.apache.cxf:cxf-rt-transports-http:${params.Version}:jar -Dtransitive=false -Ddest=glassfish5/glassfish/lib"
               echo "Including additional dependencies (woodstox, ...)"
               sh "mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:get -DremoteRepositories=https://repository.apache.org/snapshots,https://repository.apache.org -Dartifact=com.fasterxml.woodstox:woodstox-core:5.2.1:jar -Dtransitive=false -Ddest=glassfish5/glassfish/lib"
           }
       }
       
       stage('Prepare JAX-RS TCK build configuration') {
           steps {
              withEnv(["WORKSPACE = ${PWD}"]) {
                sh "wget https://raw.githubusercontent.com/apache/cxf/master/tck/ts.jte.template"
                sh "sed -i '" + 's/${version}/' + params.Version + "/g' ts.jte.template"
                sh "sed -i '" + 's#${GF_HOME}#' + "${WORKSPACE}/glassfish5/glassfish" + "#g' ts.jte.template"
                sh "cp jakartaee-tck/bin/xml/impl/glassfish/jersey.xml jakartaee-tck/bin/xml/impl/glassfish/cxf.xml"
              }
           }
       }
       
       stage('Build JAX-RS TCK') {
           steps {
                withEnv([
                    "WORKSPACE=${pwd()}",
                    "TS_HOME=${WORKSPACE}/jakartaee-tck",
                    "javaee_home=${WORKSPACE}/glassfish5",
                    "GF_HOME=${WORKSPACE}/glassfish5/glassfish",
                    "AS_JAVA=$JAVA_HOME",
                    "deliverabledir=jaxrs"
                ]) {
                    sh 'yes | cp -vr ts.jte.template jakartaee-tck/install/jaxrs/bin/ts.jte'
                    
                    dir("${TS_HOME}/install/${deliverabledir}/bin") {
                        sh "ant build.all"
                        sh "ant update.jaxrs.wars"
                    }
                    
                    dir("${TS_HOME}/release/tools/") {
                        sh "ant jaxrs"
                    }
                }
           }
       }
       
       stage('Run JAX-RS TCK') {
           steps {
                withEnv([
                    "WORKSPACE=${pwd()}",
                    "TS_HOME=${WORKSPACE}/restful-ws-tck",
                    "javaee_home=${WORKSPACE}/glassfish5",
                    "GF_HOME=${WORKSPACE}/glassfish5/glassfish",
                    "AS_JAVA=$JAVA_HOME",
                    "deliverabledir=jaxrs"
                ]) {
                    sh "cp -r jakartaee-tck/release/JAXRS_BUILD/latest/restful-ws-tck ${WORKSPACE}"
                    sh "yes | cp -vr ts.jte.template ${TS_HOME}/bin/ts.jte"

                    dir("${TS_HOME}/bin") {
                        sh "ant config.vi"
                        sh "ant deploy.all"
                        script {
                            try {
                                echo 'Running all TCK tests ...'
                                sh "ant run.all"
                            } catch (exc) {
                                echo 'Some TCK tests have failed, marking build as unstable'
                                currentBuild.result = 'UNSTABLE'
                            }
                        }
                    }
                }
           }
           
           post {
               always {
                   withEnv([
                    "WORKSPACE=${pwd()}",
                    "TS_HOME=${WORKSPACE}/restful-ws-tck",
                   ]) {
                      dir("${TS_HOME}/bin") {
                        sh "ant stop-server -f xml/impl/glassfish/config.vi.xml"
                      }
                      
                      sh "mv /tmp/JT* ${WORKSPACE}"
                   }
               }
           }
       }
   }
   
   post { 
        always { 
            archiveArtifacts artifacts: 'jakartaee-tck/release/JAXRS_BUILD/latest/restful*.zip', fingerprint: true
            archiveArtifacts artifacts: 'JTwork/**', fingerprint: true
            archiveArtifacts artifacts: 'JTreport/**', fingerprint: true
            cleanWs()
        }
    }
}
