#  Licensed 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.
addons:
  hosts:
    - node1

arch:
  - amd64
  - arm64

env:
  - MODULES=Client
  - MODULES=Server
  - MODULES=Core
  - MODULES=External
  - MODULES=Integration-Test
  - MODULES=Check-Updated-License-Files

dist: xenial
sudo: required

before_cache:
# Never upload Storm artifacts to the build cache, ensuring a clean slate every time
  - rm -rf $HOME/.m2/repository/org/apache/storm

language: java
jdk:
  - openjdk8
  - openjdk11
  
matrix:
  include:
    - arch: s390x
      jdk: openjdk11
  exclude:
    - arch: arm64
      jdk: openjdk8

before_install:
  - rvm reload
  - rvm use 2.4.2 --install
  - nvm install 8.9.3
  - nvm use 8.9.3
  - sudo apt-get update
  - sudo apt-get install python3
  - sudo apt-get install python3-pip
  - sudo add-apt-repository ppa:deadsnakes/ppa -y
  - sudo apt-get update
  - sudo apt-get install python3.6
  - export MVN_HOME=$HOME/apache-maven-3.6.3
  - if [ ! -d $MVN_HOME/bin ]; then wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz -P $HOME; tar xzvf $HOME/apache-maven-3.6.3-bin.tar.gz -C $HOME; fi
  - export PATH=$MVN_HOME/bin:$PATH
  - f=$(which javac); while [[ -L $f ]]; do f=$(readlink $f);done; export JAVA_HOME=${f%/bin/*}

install: /bin/bash ./dev-tools/travis/travis-install.sh `pwd`
script:
  - if [[ $(uname -m) != 's390x' ]]; then 
      /bin/bash ./dev-tools/travis/travis-script.sh `pwd` $MODULES;
    fi
cache:
  directories:
    - "$HOME/.m2/repository"
    - "$HOME/.rvm"
    - "$NVM_DIR"
    - "$HOME/apache-maven-3.6.3"
