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

def getGithubAndJiraCreds() {
    return [usernamePassword(credentialsId: 'apache-hadoop-at-github.com',
                                passwordVariable: 'GITHUB_TOKEN',
                                usernameVariable: 'GITHUB_USER'),
            usernamePassword(credentialsId: 'hadoopqa-at-asf-jira',
                                passwordVariable: 'JIRA_PASSWORD',
                                usernameVariable: 'JIRA_USER')]
}

// Publish JUnit results only if there are XML files under surefire-reports
def publishJUnitResults() {
    def findCmdExitCode = sh script: "find ${SOURCEDIR} -wholename */target/surefire-reports/*.xml | egrep .", returnStatus: true
    boolean surefireReportsExist = findCmdExitCode == 0
    if (surefireReportsExist) {
        echo "XML files found under surefire-reports, running junit"
        // The path should be relative to WORKSPACE for the junit.
        SRC = "${SOURCEDIR}/**/target/surefire-reports/*.xml".replace("$WORKSPACE/","")
        try {
            junit "${SRC}"
        } catch(e) {
            echo 'junit processing: ' + e.toString()
        }
    } else {
        echo "No XML files found under surefire-reports, skipping junit"
    }
}

pipeline {

    agent {
        label 'Hadoop'
    }

    options {
        buildDiscarder(logRotator(numToKeepStr: '5'))
        timeout (time: 24, unit: 'HOURS')
        timestamps()
        checkoutToSubdirectory('src')
    }

    environment {
        YETUS='yetus'
        // Branch or tag name.  Yetus release tags are 'rel/X.Y.Z'
        YETUS_VERSION='f9ba0170a5787a5f4662d3769804fef0226a182f'
    }

    parameters {
        string(name: 'JIRA_ISSUE_KEY',
               defaultValue: '',
               description: 'The JIRA issue that has a patch needing pre-commit testing. Example: HADOOP-1234')
    }

    stages {
        stage ('install yetus') {
            steps {
                dir("${WORKSPACE}/${YETUS}") {
                    checkout([
                        $class: 'GitSCM',
                        branches: [[name: "${env.YETUS_VERSION}"]],
                        userRemoteConfigs: [[ url: 'https://github.com/apache/yetus.git']]]
                    )
                }
            }
        }

        // Setup codebase so that each platform's build happens in its own exclusive copy of the
        // codebase.
        // Primarily because YETUS messes up the git branch information and affects the subsequent
        // optional stages after the first one.
        stage ('setup sources') {
            steps {
                dir("${WORKSPACE}/centos-7") {
                    sh '''#!/usr/bin/env bash

                    cp -Rp ${WORKSPACE}/src ${WORKSPACE}/centos-7
                    '''
                }

                dir("${WORKSPACE}/centos-8") {
                    sh '''#!/usr/bin/env bash

                    cp -Rp ${WORKSPACE}/src ${WORKSPACE}/centos-8
                    '''
                }

                dir("${WORKSPACE}/debian-10") {
                    sh '''#!/usr/bin/env bash

                    cp -Rp ${WORKSPACE}/src ${WORKSPACE}/debian-10
                    '''
                }

                dir("${WORKSPACE}/ubuntu-focal") {
                    sh '''#!/usr/bin/env bash

                    cp -Rp ${WORKSPACE}/src ${WORKSPACE}/ubuntu-focal
                    '''
                }
            }
        }

        // This is an optional stage which runs only when there's a change in
        // C++/C++ build/platform.
        // This stage serves as a means of cross platform validation, which is
        // really needed to ensure that any C++ related/platform change doesn't
        // break the Hadoop build on Centos 7.
        stage ('precommit-run Centos 7') {
            environment {
                SOURCEDIR = "${WORKSPACE}/centos-7/src"
                PATCHDIR = "${WORKSPACE}/centos-7/out"
                DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile_centos_7"
                IS_OPTIONAL = 1
            }

            steps {
                withCredentials(getGithubAndJiraCreds()) {
                    sh '''#!/usr/bin/env bash

                    chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
                    "${SOURCEDIR}/dev-support/jenkins.sh" run_ci
                    '''
                }
            }

            post {
                // Since this is an optional platform, we want to copy the artifacts
                // and archive it only if the build fails, to help with debugging.
                failure {
                    sh '''#!/usr/bin/env bash

                    cp -Rp "${WORKSPACE}/centos-7/out" "${WORKSPACE}"
                    '''
                    archiveArtifacts "out/**"
                }

                cleanup() {
                    script {
                        sh '''#!/usr/bin/env bash

                        chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
                        "${SOURCEDIR}/dev-support/jenkins.sh" cleanup_ci_proc
                        '''
                    }
                }
            }
        }

        // This is an optional stage which runs only when there's a change in
        // C++/C++ build/platform.
        // This stage serves as a means of cross platform validation, which is
        // really needed to ensure that any C++ related/platform change doesn't
        // break the Hadoop build on Centos 8.
        stage ('precommit-run Centos 8') {
            environment {
                SOURCEDIR = "${WORKSPACE}/centos-8/src"
                PATCHDIR = "${WORKSPACE}/centos-8/out"
                DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile_centos_8"
                IS_OPTIONAL = 1
            }

            steps {
                withCredentials(getGithubAndJiraCreds()) {
                        sh '''#!/usr/bin/env bash

                        chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
                        "${SOURCEDIR}/dev-support/jenkins.sh" run_ci
                        '''
                }
            }

            post {
                // Since this is an optional platform, we want to copy the artifacts
                // and archive it only if the build fails, to help with debugging.
                failure {
                    sh '''#!/usr/bin/env bash

                    cp -Rp "${WORKSPACE}/centos-8/out" "${WORKSPACE}"
                    '''
                    archiveArtifacts "out/**"
                }

                cleanup() {
                    script {
                        sh '''#!/usr/bin/env bash

                        chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
                        "${SOURCEDIR}/dev-support/jenkins.sh" cleanup_ci_proc
                        '''
                    }
                }
            }
        }

        // This is an optional stage which runs only when there's a change in
        // C++/C++ build/platform.
        // This stage serves as a means of cross platform validation, which is
        // really needed to ensure that any C++ related/platform change doesn't
        // break the Hadoop build on Debian 10.
        stage ('precommit-run Debian 10') {
            environment {
                SOURCEDIR = "${WORKSPACE}/debian-10/src"
                PATCHDIR = "${WORKSPACE}/debian-10/out"
                DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile_debian_10"
                IS_OPTIONAL = 1
            }

            steps {
                withCredentials(getGithubAndJiraCreds()) {
                    sh '''#!/usr/bin/env bash

                    chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
                    "${SOURCEDIR}/dev-support/jenkins.sh" run_ci
                    '''
                }
            }

            post {
                // Since this is an optional platform, we want to copy the artifacts
                // and archive it only if the build fails, to help with debugging.
                failure {
                    sh '''#!/usr/bin/env bash

                    cp -Rp "${WORKSPACE}/debian-10/out" "${WORKSPACE}"
                    '''
                    archiveArtifacts "out/**"
                }

                cleanup() {
                    script {
                        sh '''#!/usr/bin/env bash

                        chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
                        "${SOURCEDIR}/dev-support/jenkins.sh" cleanup_ci_proc
                        '''
                    }
                }
            }
        }

        // We want to use Ubuntu Focal as our main CI and thus, this stage
        // isn't optional (runs for all the PRs).
        stage ('precommit-run Ubuntu focal') {
            environment {
                SOURCEDIR = "${WORKSPACE}/ubuntu-focal/src"
                PATCHDIR = "${WORKSPACE}/ubuntu-focal/out"
                DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile"
                IS_OPTIONAL = 0
            }

            steps {
                withCredentials(getGithubAndJiraCreds()) {
                    sh '''#!/usr/bin/env bash

                    chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
                    "${SOURCEDIR}/dev-support/jenkins.sh" run_ci
                    '''
                }
            }

            post {
                always {
                    script {
                        // Publish status if it was missed (YETUS-1059)
                        withCredentials(
                            [usernamePassword(credentialsId: '683f5dcf-5552-4b28-9fb1-6a6b77cf53dd',
                                              passwordVariable: 'GITHUB_TOKEN',
                                              usernameVariable: 'GITHUB_USER')]) {
                            sh '''#!/usr/bin/env bash

                            # Copy the artifacts of Ubuntu focal build to workspace
                            cp -Rp "${WORKSPACE}/ubuntu-focal/out" "${WORKSPACE}"

                            # Send Github status
                            chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
                            "${SOURCEDIR}/dev-support/jenkins.sh" github_status_recovery
                            '''
                        }

                        // YETUS output
                        archiveArtifacts "out/**"

                        // Publish the HTML report so that it can be looked at
                        // Has to be relative to WORKSPACE.
                        publishHTML (target: [
                                      allowMissing: true,
                                      keepAll: true,
                                      alwaysLinkToLastBuild: true,
                                      // Has to be relative to WORKSPACE
                                      reportDir: "out",
                                      reportFiles: 'report.html',
                                      reportName: 'Yetus Report'
                        ])

                        publishJUnitResults()
                    }
                }

                cleanup() {
                    script {
                        sh '''#!/usr/bin/env bash

                        chmod u+x "${SOURCEDIR}/dev-support/jenkins.sh"
                        "${SOURCEDIR}/dev-support/jenkins.sh" cleanup_ci_proc
                        '''
                    }
                }
            }
        }
    }

    post {
        // Jenkins pipeline jobs fill slaves on PRs without this :(
        cleanup() {
            script {
                sh '''#!/usr/bin/env bash

                # See HADOOP-13951
                chmod -R u+rxw "${WORKSPACE}"
                '''
                deleteDir()
            }
        }
    }
}
