# Configuration file for Travis continuous integration.
#
# 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.
#
---
language: generic

addons:
  apt:
    packages:
      - openjdk-8-jdk
      - unzip
  sonarcloud:
    organization: "kylin"
    token:
      secure: "2ca24e5a04ad1fca4ca956953810421aa8bd1470"

cache:
  directories:
    - $HOME/.m2

jobs:
  include:
    - name: Linux ARM64
      arch: arm64-graviton2
      dist: focal
      virt: vm
      group: edge
    - name: Linux x86
      arch: amd64

before_install:
  - export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-${TRAVIS_CPU_ARCH}";
  - export PATH="$JAVA_HOME/bin:$PATH";
  - echo "Downloading Maven 3.8.1"
  - wget --quiet https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip
  - unzip -qq -o apache-maven-3.8.1-bin.zip
  - export M2_HOME=$PWD/apache-maven-3.8.1
  - export PATH=$M2_HOME/bin:$PATH
  - mvn -version
  - echo "MAVEN_OPTS='-Xms1024m -Xmx3072m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m'" > ~/.mavenrc
  - sed -i 's/log4j.logger.org.apache.kylin=DEBUG/log4j.logger.org.apache.kylin=WARN/g' build/conf/kylin-server-log4j.properties
  - sed -i 's/log4j.logger.org.apache.kylin=INFO/log4j.logger.org.apache.kylin=WARN/g' build/conf/kylin-tools-log4j.properties
  - sed -i 's/log4j.logger.org.apache.kylin=INFO/log4j.logger.org.apache.kylin=WARN/g' kylin-spark-project/build/conf/kylin-tools-log4j.properties

  - if [[ $(uname -m) == 'aarch64' ]];then export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-arm64";fi

script:
  # mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent test coveralls:report -e
  # Skip coveralls temporarily, fix it asap
  - mvn clean test -q
  - mvn clean test -q -Psandbox -Pspark3
  - if [[ -n "${TRAVIS_PULL_REQUEST_SLUG}" && "${TRAVIS_PULL_REQUEST_SLUG}" != "${TRAVIS_REPO_SLUG}" ]]; then
        echo "The pull request from ${TRAVIS_PULL_REQUEST_SLUG} is an EXTERNAL pull request. Skip sonar analysis.";
    else
        git fetch --unshallow --quiet;
        mvn sonar:sonar -e -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=2ca24e5a04ad1fca4ca956953810421aa8bd1470 -Dsonar.organization=kylin;
    fi

notification:
  email:
    recipients:
      - dev@kylin.apache.org
    on_failure: always

after_success:
  - bash <(curl -s https://codecov.io/bash)

before_cache:
  # Remove project's local artifacts to force maven reactor resolve
  - rm -rf $HOME/.m2/repository/org/apache/kylin

# blocklist
branches:
  except:
    - document
