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

node('ubuntu') {
  def JAVA_JDK_17=tool name: 'jdk_17_latest', type: 'hudson.model.JDK'
  stage('Checkout') {
    if(env.CHANGE_ID) {
      // By default checkout on PRs will fetch only that branch and nothing else. However, in order for the Sonar plugin
      // to function properly we need to fetch also the target branch ${CHANGE_TARGET} so we need to customize the
      // refspec. If the target branch of the PR is not present warnings like the following may appear:
      // Could not find ref 'main' in refs/heads, refs/remotes/upstream or refs/remotes/origin
      checkout([
        $class: 'GitSCM',
        branches: scm.branches,
        doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations,
        extensions: scm.extensions,
        userRemoteConfigs: scm.userRemoteConfigs + [[
          name: 'origin',
          refspec: scm.userRemoteConfigs[0].refspec+ " +refs/heads/${CHANGE_TARGET}:refs/remotes/origin/${CHANGE_TARGET}",
          url: scm.userRemoteConfigs[0].url,
          credentialsId: scm.userRemoteConfigs[0].credentialsId
        ]],
      ])
    } else {
      checkout scm
    }
  }
  stage('Code Quality') {
    timeout(time: 1, unit: 'HOURS') {
      withEnv(["Path+JDK=$JAVA_JDK_17/bin","JAVA_HOME=$JAVA_JDK_17"]) {
        withCredentials([string(credentialsId: 'SONARCLOUD_TOKEN', variable: 'SONAR_TOKEN')]) {
          if ( env.BRANCH_NAME.startsWith("PR-") ) {
            sh './gradlew --no-parallel --no-daemon jacocoAggregateTestReport sonar -PenableJacoco -Dsonar.pullrequest.branch=${CHANGE_BRANCH} -Dsonar.pullrequest.base=${CHANGE_TARGET} -Dsonar.pullrequest.key=${CHANGE_ID} -Dsonar.login=${SONAR_TOKEN}'
          } else {
            sh './gradlew --no-parallel --no-daemon jacocoAggregateTestReport sonar -PenableJacoco -Dsonar.branch.name=${BRANCH_NAME} -Dsonar.login=${SONAR_TOKEN}'
          }
        }
      }
    }
  }
  cleanWs()
}

