/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/**
 * UI-Test Build file for Jenkins Multibranch pipeline.
 *
 * The pipeline runs only the UI tests.
 *
 */

LABEL = 'ubuntu'
buildJdk = 'jdk_1.8_latest'
buildMvn = 'maven_3.5.4'
deploySettings = 'archiva-uid-jenkins'
DOCKERHUB_CREDS = 'c725478f-9125-460a-900f-1da562e51026'
//localRepository = ".repository"
localRepository = "../.maven_repositories/${env.EXECUTOR_NUMBER}"

pipeline {
    agent {
        label "${LABEL}"
    }
    options {
        disableConcurrentBuilds()
        durabilityHint('PERFORMANCE_OPTIMIZED')
        buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '3'))
    }

    stages {


        stage('Checkout') {
            steps {
                script {
                    echo "Info: Job-Name=${JOB_NAME}, Branch=${BRANCH_NAME}, Workspace=${PWD}"
                }
                checkout scm
            }
            post {
                failure {
                    notifyBuild("Checkout failure")
                }
            }
        }

        stage('Test htmlunit') {
            when {
                not {
                    triggeredBy 'UpstreamCause'
                }
            }
            steps {
                timeout(120) {
                    withMaven(maven: buildMvn, jdk: buildJdk,
                            mavenSettingsConfig: deploySettings,
                            mavenLocalRepo: localRepository,
                            publisherStrategy: 'EXPLICIT',
                            options: [concordionPublisher(disabled: true), dependenciesFingerprintPublisher(disabled: true),
                                      findbugsPublisher(disabled: true), artifactsPublisher(disabled: true),
                                      invokerPublisher(disabled: true), jgivenPublisher(disabled: true),
                                      junitPublisher(disabled: true, ignoreAttachments: false),
                                      openTasksPublisher(disabled: true), pipelineGraphPublisher(disabled: true)]
                    )
                            {
                                sh "chmod 755 ./src/ci/scripts/prepareWorkspace.sh"
                                sh "./src/ci/scripts/prepareWorkspace.sh -d '.repository'"
                                // Needs a lot of time to reload the repository files, try without cleanup
                                // Not sure, but maybe
                                // sh "rm -rf .repository"

                                // Run test phase / ignore test failures
                                // -B: Batch mode
                                // -U: Force snapshot update
                                // -e: Produce execution error messages
                                // -fae: Fail at the end
                                // -Dmaven.compiler.fork=true: Compile in a separate forked process
                                // -Pci-server: Profile for CI-Server
                                // -Pit-js: Run the selenium test
                                sh "mvn clean verify -B -V -U -e -fae -DmaxWaitTimeInMs=2000 -Pci-server -Pit-js -DtrimStackTrace=false -Djava.io.tmpdir=.tmp -pl :archiva-webapp-test"

                            }
                }
            }
            post {
                always {
                    junit testResults: '**/target/failsafe-reports/TEST-*.xml'
                }
                failure {
                    notifyBuild("Failure in Htmlunit test stage")
                }
            }
        }

        // Uses a docker container that is started by script. Maybe we could use the docker functionality
        // of the jenkins pipeline in the future.
        stage('Test chrome') {
            when {
                not {
                    triggeredBy 'UpstreamCause'
                }
            }
            steps {
                timeout(120) {
                    withCredentials([[$class : 'UsernamePasswordMultiBinding', credentialsId: DOCKERHUB_CREDS,
                                      usernameVariable: 'DOCKER_HUB_USER', passwordVariable: 'DOCKER_HUB_PW']]) {
                        withMaven(maven: buildMvn, jdk: buildJdk,
                                mavenSettingsConfig: deploySettings,
                                mavenLocalRepo: localRepository,
                                publisherStrategy: 'EXPLICIT',
                                options: [concordionPublisher(disabled: true), dependenciesFingerprintPublisher(disabled: true),
                                          findbugsPublisher(disabled: true), artifactsPublisher(disabled: true),
                                          invokerPublisher(disabled: true), jgivenPublisher(disabled: true),
                                          junitPublisher(disabled: true, ignoreAttachments: false),
                                          openTasksPublisher(disabled: true), pipelineGraphPublisher(disabled: true)]
                        )
                                {
                                    sh "chmod 755 ./src/ci/scripts/prepareWorkspace.sh"
                                    sh "./src/ci/scripts/prepareWorkspace.sh"
                                    sh "chmod 755 src/ci/scripts/container_webtest.sh"
                                    sh "src/ci/scripts/container_webtest.sh start"
                                    // Needs a lot of time to reload the repository files, try without cleanup
                                    // Not sure, but maybe
                                    // sh "rm -rf .repository"

                                    // Run test phase / ignore test failures
                                    // -B: Batch mode
                                    // -U: Force snapshot update
                                    // -e: Produce execution error messages
                                    // -fae: Fail at the end
                                    // -Pci-server: Profile for CI Server
                                    // -Pit-js: Runs the Selenium tests
                                    // -Pchrome: Activates the Selenium Chrome Test Agent
                                    sh "mvn clean verify -B -V -e -fae -DmaxWaitTimeInMs=2000 -DseleniumRemote=true -Pci-server -Pit-js -Pchrome -pl :archiva-webapp-test -DtrimStackTrace=false"
                                }
                    }
                }
            }
            post {
                always {
                    sh "src/ci/scripts/container_webtest.sh stop"
                    junit testResults: '**/target/failsafe-reports/TEST-*.xml'
                }
                failure {
                    notifyBuild("Failure in Chrome test stage")
                }
            }
        }

    }
    post {
        unstable {
            notifyBuild("Unstable Build")
        }
        success {
            script {
                def previousResult = currentBuild.previousBuild?.result
                if (previousResult && !currentBuild.resultIsWorseOrEqualTo(previousResult)) {
                    notifyBuild("Fixed")
                }
            }
            cleanWs deleteDirs: true, notFailBuild: true, patterns: [[pattern: '.repository', type: 'EXCLUDE']]
        }

    }
}

// Send a notification about the build status
def notifyBuild(String buildStatus) {
    // default the value
    buildStatus = buildStatus ?: "UNKNOWN"

    def email = "notifications@archiva.apache.org"
    def summary = "${env.JOB_NAME}#${env.BUILD_NUMBER} - ${buildStatus} - ${currentBuild?.currentResult}"
    def detail = """<h4>Job: <a href='${env.JOB_URL}'>${env.JOB_NAME}</a> [#${env.BUILD_NUMBER}]</h4>
  <p><b>${buildStatus}</b></p>
  <table>
    <tr><td>Build</td><td><a href='${env.BUILD_URL}'>${env.BUILD_URL}</a></td><tr>
    <tr><td>Console</td><td><a href='${env.BUILD_URL}console'>${env.BUILD_URL}console</a></td><tr>
    <tr><td>Test Report</td><td><a href='${env.BUILD_URL}testReport/'>${env.BUILD_URL}testReport/</a></td><tr>
  </table>
  """

    emailext(
            to: email,
            subject: summary,
            body: detail,
            mimeType: 'text/html'
    )
}

// vim: et:ts=4:sw=4:ft=groovy
