#  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: bionic
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 libssl-dev
  - sudo apt-get install python3
  - sudo apt-get install python3-pip
  - 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"
