/*
 * 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 { node { label 'ubuntu' } }
  options {
    durabilityHint('PERFORMANCE_OPTIMIZED')
    buildDiscarder(logRotator(numToKeepStr: '20', artifactNumToKeepStr: '5'))
    timeout(time: 180, unit: 'MINUTES')
  }
  parameters {
    string( defaultValue: 'master', description: 'Core Its branch (default master)',
            name: 'ITS_BRANCH' )
  }
  stages {
    stage("Build Maven Core") {
      steps {
        withEnv(["JAVA_HOME=${ tool "JDK 1.8 (latest)" }", "PATH+MAVEN=${tool 'Maven 3.6.3'}/bin:${env.JAVA_HOME}/bin"]) {
            sh "mvn -Drat.skip=true -T2 -B -V install -PversionlessMavenDist -Dmaven.repo.local=${env.WORKSPACE}/repo"
        }
      }
    }
    stage( "Run Maven Integration Testing" ) {
      steps {
        git url: "https://github.com/apache/maven-integration-testing.git", branch: "${ITS_BRANCH}"
        sh "ls -lrt ${env.WORKSPACE}/apache-maven/target/"
        withEnv(["JAVA_HOME=${ tool "JDK 1.8 (latest)" }", "PATH+MAVEN=${tool 'Maven 3.6.3'}/bin:${env.JAVA_HOME}/bin"]) {
          sh "mvn clean install -V -B -Prun-its,embedded -Dmaven.test.failure.ignore -Dmaven.repo.local=${env.WORKSPACE}/repo -DmavenDistro=${env.WORKSPACE}/apache-maven/target/apache-maven-bin.zip"
        }
      }
    }
  }
  post {
    always {
      junit testResults: 'core-it-suite/target/surefire-reports/*.xml', allowEmptyResults: true
      script{
        currentBuild.description = "Build with Core Its branch:$ITS_BRANCH"
      }
      cleanWs()
    }
  }
}
