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

pipeline {

    agent {
        label 'Hadoop'
    }

    options {
        // N.B. this is per-branch, which means per PR
        disableConcurrentBuilds()
        buildDiscarder(logRotator(numToKeepStr: '15'))
        timeout (time: 7, unit: 'HOURS')
        timestamps()
        checkoutToSubdirectory('src')
    }

    environment {
        SOURCEDIR = 'src'
        // will also need to change notification section below
        PATCHDIR = 'out'
        DOCKERFILE = "${SOURCEDIR}/dev-support/docker/Dockerfile"
        YETUS='yetus'
        // Branch or tag name.  Yetus release tags are 'rel/X.Y.Z'
        YETUS_VERSION='rel/0.12.0'
    }

    parameters {
        booleanParam(name: 'DEBUG',
               defaultValue: false,
               description: 'Print extra outputs for debugging the jenkins job and yetus')
    }

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

        stage ('precommit-run') {
            steps {
                withCredentials([
                    usernamePassword(
                    credentialsId: 'apache-hbase-at-github.com',
                    passwordVariable: 'GITHUB_PASSWORD',
                    usernameVariable: 'GITHUB_USER'
                    )]) {
                        sh '''#!/usr/bin/env bash
                        set -e
                        TESTPATCHBIN="${WORKSPACE}/${YETUS}/precommit/src/main/shell/test-patch.sh"
                        # this must be clean for every run
                        if [[ -d "${WORKSPACE}/${PATCHDIR}" ]]; then
                          rm -rf "${WORKSPACE}/${PATCHDIR}"
                        fi
                        mkdir -p "${WORKSPACE}/${PATCHDIR}"

                        ## Checking on H* machine nonsense
                        echo "JAVA_HOME: ${JAVA_HOME}"
                        ls -l "${JAVA_HOME}" || true
                        echo "MAVEN_HOME: ${MAVEN_HOME}"
                        echo "maven version:"
                        mvn --offline --version  || true
                        echo "getting machine specs, find in ${BUILD_URL}/artifact/patchprocess/machine/"
                        mkdir "${PATCHDIR}/machine"
                        cat /proc/cpuinfo >"${PATCHDIR}/machine/cpuinfo" 2>&1 || true
                        cat /proc/meminfo >"${PATCHDIR}/machine/meminfo" 2>&1 || true
                        cat /proc/diskstats >"${PATCHDIR}/machine/diskstats" 2>&1 || true
                        cat /sys/block/sda/stat >"${PATCHDIR}/machine/sys-block-sda-stat" 2>&1 || true
                        df -h >"${PATCHDIR}/machine/df-h" 2>&1 || true
                        ps -Awwf >"${PATCHDIR}/machine/ps-Awwf" 2>&1 || true
                        ifconfig -a >"${PATCHDIR}/machine/ifconfig-a" 2>&1 || true
                        lsblk -ta >"${PATCHDIR}/machine/lsblk-ta" 2>&1 || true
                        lsblk -fa >"${PATCHDIR}/machine/lsblk-fa" 2>&1 || true
                        cat /proc/loadavg >"${output}/loadavg" 2>&1 || true
                        ulimit -a >"${PATCHDIR}/machine/ulimit-a" 2>&1 || true
                        ## /H*

                        # If CHANGE_URL is set (e.g., Github Branch Source plugin), process it.
                        # Otherwise exit, because we don't want HBase to do a
                        # full build.  We wouldn't normally do this check for smaller
                        # projects. :)
                        if [[ -z "${CHANGE_URL}" ]]; then
                            echo "Full build skipped" > "${WORKSPACE}/${PATCHDIR}/report.html"
                            exit 0
                        fi
                        # enable debug output for yetus
                        if [[ "true" = "${DEBUG}" ]]; then
                            YETUS_ARGS+=("--debug")
                        fi
                        # If we're doing docker, make sure we don't accidentally pollute the image with a host java path
                        if [ -n "${JAVA_HOME}" ]; then
                          unset JAVA_HOME
                        fi
                        YETUS_ARGS+=("--patch-dir=${WORKSPACE}/${PATCHDIR}")
                        # where the source is located
                        YETUS_ARGS+=("--basedir=${WORKSPACE}/${SOURCEDIR}")
                        # our project defaults come from a personality file
                        # which will get loaded automatically by setting the project name
                        YETUS_ARGS+=("--project=hbase")
                        # lots of different output formats
                        YETUS_ARGS+=("--brief-report-file=${WORKSPACE}/${PATCHDIR}/brief.txt")
                        YETUS_ARGS+=("--console-report-file=${WORKSPACE}/${PATCHDIR}/console.txt")
                        YETUS_ARGS+=("--html-report-file=${WORKSPACE}/${PATCHDIR}/report.html")
                        # enable writing back to Github
                        YETUS_ARGS+=(--github-password="${GITHUB_PASSWORD}")
                        YETUS_ARGS+=(--github-user=${GITHUB_USER})
                        # enable writing back to ASF JIRA
                        YETUS_ARGS+=(--jira-password="${JIRA_PASSWORD}")
                        YETUS_ARGS+=(--jira-user="${JIRA_USER}")
                        # auto-kill any surefire stragglers during unit test runs
                        YETUS_ARGS+=("--reapermode=kill")
                        YETUS_ARGS+=("--multijdktests=compile")
                        # set relatively high limits for ASF machines
                        # changing these to higher values may cause problems
                        # with other jobs on systemd-enabled machines
                        YETUS_ARGS+=("--proclimit=10000")
                        YETUS_ARGS+=("--dockermemlimit=20g")
                        # -1 findbugs issues that show up prior to the patch being applied
                        YETUS_ARGS+=("--findbugs-strict-precheck")
                        # rsync these files back into the archive dir
                        YETUS_ARGS+=("--archive-list=rat.txt")
                        # URL for user-side presentation in reports and such to our artifacts
                        # (needs to match the archive bits below)
                        YETUS_ARGS+=("--build-url-artifacts=artifact/out")
                        # plugins to enable
                        YETUS_ARGS+=("--plugins=all")
                        # don't let these tests cause -1s because we aren't really paying that
                        # much attention to them
                        YETUS_ARGS+=("--tests-filter=ruby-lint,test4tests")
                        # run in docker mode and specifically point to our
                        # Dockerfile since we don't want to use the auto-pulled version.
                        YETUS_ARGS+=("--docker")
                        YETUS_ARGS+=("--dockerfile=${DOCKERFILE}")
                        YETUS_ARGS+=("--mvn-custom-repos")
                        # Branch-1 specific, look at the Zulu jdk8
                        YETUS_ARGS+=("--multijdkdirs=/usr/lib/jvm/zulu-8-amd64,/usr/lib/jvm/zulu-7-amd64")
                        YETUS_ARGS+=("--findbugs-home=/usr")
                        YETUS_ARGS+=("--whitespace-eol-ignore-list=.*/generated/.*")
                        YETUS_ARGS+=("--whitespace-tabs-ignore-list=.*/generated/.*")
                        YETUS_ARGS+=("--personality=${SOURCEDIR}/dev-support/hbase-personality.sh")
                        YETUS_ARGS+=("--quick-hadoopcheck")
                        YETUS_ARGS+=("--skip-errorprone")
                        # effectively treat dev-support as a custom maven module
                        YETUS_ARGS+=("--skip-dirs=dev-support")
                        # help keep the ASF boxes clean
                        YETUS_ARGS+=("--sentinel")
                        # use emoji vote so it is easier to find the broken line
                        YETUS_ARGS+=("--github-use-emoji-vote")
                        "${TESTPATCHBIN}" "${YETUS_ARGS[@]}"
                        '''
                }
            }
        }

    }

    post {
        always {
          script {
            // Yetus output
            archiveArtifacts "${env.PATCHDIR}/**"
            // 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: "${env.PATCHDIR}",
                          reportFiles: 'report.html',
                          reportName: 'Yetus Report'
            ])
            // Publish JUnit results
            try {
                junit "${env.SOURCEDIR}/**/target/surefire-reports/*.xml"
            } catch(e) {
                echo 'junit processing: ' + e.toString()
            }
          }
        }

        // Jenkins pipeline jobs fill slaves on PRs without this :(
        cleanup() {
            script {
                sh '''
                    # See YETUS-764
                    if [ -f "${WORKSPACE}/${PATCHDIR}/pidfile.txt" ]; then
                      echo "test-patch process appears to still be running: killing"
                      kill `cat "${WORKSPACE}/${PATCHDIR}/pidfile.txt"` || true
                      sleep 10
                    fi
                    if [ -f "${WORKSPACE}/${PATCHDIR}/cidfile.txt" ]; then
                      echo "test-patch container appears to still be running: killing"
                      docker kill `cat "${WORKSPACE}/${PATCHDIR}/cidfile.txt"` || true
                    fi
                    # See HADOOP-13951
                    chmod -R u+rxw "${WORKSPACE}"
                    '''
                deleteDir()
            }
        }
    }
}
