#  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

dist: trusty
sudo: required

language: java
jdk:
  - oraclejdk8
  - 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
install: /bin/bash ./dev-tools/travis/travis-install.sh `pwd`
script:
  - /bin/bash ./dev-tools/travis/travis-script.sh `pwd` $MODULES
cache:
  directories:
    - "$HOME/.m2/repository"
    - "$HOME/.rvm"
    - "$NVM_DIR"
