/*
 * 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.
 */

/**
 * Main build file for Jenkins Multibranch pipeline.
 *
 * The pipeline builds, runs the test and deploys to the archiva snapshot repository.
 *
 * Uses one stage for build and deploy to avoid running it multiple times.
 * The settings for deployment with the credentials must be provided by a MavenSettingsProvider.
 *
 * Only the war and zip artifacts are archived in the jenkins build archive.
 */
LABEL = 'ubuntu'
buildJdk = 'jdk_1.8_latest'
buildMvn = 'maven_3.8.5'
deploySettings = 'archiva-uid-jenkins'
INTEGRATION_PIPELINE = "Archiva-IntegrationTests-Gitbox"

pipeline {
    agent {
        label "${LABEL}"
    }
    options {
        buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '2'))
    }

    stages {

        stage('BuildAndDeploy') {
            steps {
                timeout(120) {

                  withEnv(["JAVA_HOME=${ tool "$buildJdk" }",
                           "PATH+MAVEN=${ tool "$buildJdk" }/bin:${tool "$buildMvn"}/bin",
                           "MAVEN_OPTS=-Xms2g -Xmx4g -Djava.awt.headless=true"]) {
                    configFileProvider(
                            [configFile(fileId: 'archiva-uid-jenkins', variable: 'GLOBAL_MVN_SETTINGS')]) {

                            // Needs a lot of time to reload the repository files, try without cleanup
                            // Not sure, but maybe
                            // sh "rm -rf .repository"
                            sh "chmod 755 ./src/ci/scripts/prepareWorkspace.sh"
                            sh "./src/ci/scripts/prepareWorkspace.sh -d .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=false: Do not compile in a separate forked process
                            // -Dmaven.test.failure.ignore=true: Do not stop, if some tests fail
                            // -Pci-build: Profile for CI-Server
                            script {
                                if (env.BRANCH_NAME == 'master' || env.BRANCH_NAME == 'archiva-2.x') {
                                    sh "mvn clean deploy -B -U -e -fae -T2 -Pci-build -DretryFailedDeploymentCount=5 -s $GLOBAL_MVN_SETTINGS -Dmaven.repo.local=.repository"
                                } else {
                                    sh "mvn clean install -B -U -e -fae -T2 -Pci-build -s $GLOBAL_MVN_SETTINGS -Dmaven.repo.local=.repository"
                                }
                            }

                    }
                  }                    

                }
            }
            post {
                always {
                    junit testResults: '**/target/surefire-reports/TEST-*.xml'
                }
                success {
                    archiveArtifacts '**/target/*.war,**/target/*-bin.zip'
                    script {
                        def previousResult = currentBuild.previousBuild?.result
                        if (previousResult && !currentBuild.resultIsWorseOrEqualTo(previousResult)) {
                            notifyBuild("Fixed")
                        }
                    }
                }
                failure {
                    notifyBuild("Failed in BuildAndDeploy stage")
                }
            }
        }
    }

    post {
        unstable {
            notifyBuild("Unstable Build")
        }
        always {
            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