#  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

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

dist: trusty
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:
  - oraclejdk8
  - openjdk11
  
matrix:
  include:
    - arch: s390x
      jdk: openjdk11
      
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

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"
