#!groovy
/*
 * 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
 *
 *     https://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.
 */

// =================================================================
// https://cwiki.apache.org/confluence/display/LOGGING/Jenkins+Setup
// =================================================================

// general pipeline documentation: https://jenkins.io/doc/book/pipeline/syntax/
pipeline {
    // https://jenkins.io/doc/book/pipeline/syntax/#options
    options {
        // support ANSI colors in stdout/stderr
        ansiColor 'xterm'
        // only keep the latest 10 builds
        buildDiscarder logRotator(numToKeepStr: '10')
        // cancel build if not complete within two hours of scheduling
        timeout time: 2, unit: 'HOURS'
        // fail parallel stages as soon as any of them fail
        parallelsAlwaysFailFast()
    }
    triggers {
        // TODO: this can be removed once gitbox webhooks are re-enabled
        pollSCM 'H/5 * * * *'
    }

    // https://jenkins.io/doc/book/pipeline/syntax/#agent
    agent {
        // https://cwiki.apache.org/confluence/display/INFRA/Jenkins+node+labels
        label 'ubuntu'
    }
    environment {
        LANG = 'C.UTF-8'
    }
    libraries {
        // https://www.jenkins.io/doc/book/pipeline/shared-libraries/
        // shared library reference to vars/
        lib 'logging'
    }
    stages {
        stage('Build') {
            steps {
                cancelPreviousRunningBuilds()
                mvn '-DskipTests clean install'
            }
        }
        stage('Test') {
            // https://jenkins.io/doc/book/pipeline/syntax/#parallel
            parallel {
                stage('Ubuntu') {
                    steps {
                        mvn '-Dmaven.test.failure.ignore=true verify'
                    }
                    post {
                        always {
                            // record linux run of tests
                            junit '**/*-reports/*.xml'
                            // additional warnings generated during build
                            // TODO: would be nice to be able to include checkstyle, cpd, pmd, and spotbugs,
                            //       but current site build takes too long
                            recordIssues enabledForFailure: true,
                                    sourceCodeEncoding: 'UTF-8',
                                    referenceJobName: 'log4j/master',
                                    tools: [mavenConsole(), errorProne(), java(),
                                            taskScanner(highTags: 'FIXME', normalTags: 'TODO', includePattern: '**/*.java', excludePattern: '*/target/**')]
                        }
                    }
                }
                stage('Windows') {
                    agent {
                        // https://cwiki.apache.org/confluence/display/INFRA/Jenkins+node+labels
                        label 'Windows'
                    }
                    steps {
                        // note that previous test runs of log4j-mongodb* may have left behind an embedded mongo folder
                        // also note that we don't need to use the jenkins system property here as it's ubuntu-specific
                        bat 'if exist %userprofile%\\.embedmongo\\ rd /s /q %userprofile%\\.embedmongo'
                        mvn '-Dmaven.test.failure.ignore=true verify'
                    }
                    post {
                        always {
                            // record windows run of tests
                            junit '**/*-reports/*.xml'
                        }
                    }
                }
            }
        }
        stage('Deploy') {
            // https://www.jenkins.io/doc/book/pipeline/syntax/#when
            when {
                anyOf {
                    branch 'master'
                    branch 'release-2.x'
                }
            }
            steps {
                mvn '-DskipTests deploy'
            }
        }
    }
    post {
        fixed {
            emailext to: 'notifications@logging.apache.org',
                from: 'Mr. Jenkins <jenkins@ci-builds.apache.org>',
                subject: "[CI][SUCCESS] ${env.JOB_NAME}#${env.BUILD_NUMBER} back to normal",
                body: '${SCRIPT, template="groovy-text.template"}'
        }
        failure {
            emailext to: 'notifications@logging.apache.org',
                from: 'Mr. Jenkins <jenkins@ci-builds.apache.org>',
                subject: "[CI][FAILURE] ${env.JOB_NAME}#${env.BUILD_NUMBER} has potential issues",
                body: '${SCRIPT, template="groovy-text.template"}'
        }
    }
}
