/*
 * 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 {
        buildDiscarder(logRotator(daysToKeepStr: '15', artifactDaysToKeepStr: '5'))
        timestamps()
    }

    stages {

        stage('Yetus') {

            environment {
                MAVEN_OPTS = '-Xmx3G'
                DEBUG = 'true'
                RUN_IN_DOCKER = 'true'
            }

            options {
                timeout(time: 5, unit: 'HOURS')
            }

            steps {
                sh "component/dev/jenkins_precommit_jira_yetus.sh"
            }

            post {
                always {
                    junit testResults: "component/**/target/**/TEST-*.xml", allowEmptyResults: true
                    // Has to be relative to WORKSPACE.
                    sh "find patchprocess/ -name org.apache\\*.txt -exec gzip {} \\;"
                    archiveArtifacts artifacts: "patchprocess/*", excludes: "patchprocess/precommit"
                    archiveArtifacts artifacts: "patchprocess/**/*", excludes: "patchprocess/precommit/**/*"
                }
            }
        }
    }
}