# 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: java

# On 12-12-2017, Travis updated their trusty image, which caused integration tests to fail.
# The group: config instructs Travis to use the previous trusty image.
# Please see https://github.com/apache/incubator-druid/pull/5155 for more information.
sudo: false
dist: trusty
group: deprecated-2017Q4

language: node_js
node_js:
  - "10"

jdk:
  - oraclejdk8

cache:
  directories:
    - $HOME/.m2

matrix:
  include:
      # license checks
    - env:
       - NAME="license checks"
      install: true
      script: MAVEN_OPTS='-Xmx3000m' mvn clean verify -Prat -DskipTests -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -Drat.consoleOutput=true

      # strict compilation
    - env:
        - NAME="strict compilation"
      install: true
      # Strict compilation requires more than 2 GB
      script: MAVEN_OPTS='-Xmx3000m' mvn clean -Pstrict -pl '!benchmarks' compile test-compile -B --fail-at-end

      # processing module test
    - env:
        - NAME="processing module test"
      install: MAVEN_OPTS='-Xmx3000m' mvn install -q -ff -DskipTests -B
      before_script: unset _JAVA_OPTIONS
      script:
        # Set MAVEN_OPTS for Surefire launcher
        - MAVEN_OPTS='-Xmx512m' mvn test -B -pl processing
        - sh -c "dmesg | egrep -i '(oom|out of memory|kill process|killed).*' -C 1 || exit 0"
        - free -m

      # processing module tests with SQL Compatibility enabled
    - env:
        - NAME="processing module test with SQL Compatibility"
      install: MAVEN_OPTS='-Xmx3000m' mvn install -q -ff -DskipTests -B
      before_script: unset _JAVA_OPTIONS
      script:
        # Set MAVEN_OPTS for Surefire launcher
        - MAVEN_OPTS='-Xmx512m' mvn test -B -Ddruid.generic.useDefaultValueForNull=false -pl processing
        - sh -c "dmesg | egrep -i '(oom|out of memory|kill process|killed).*' -C 1 || exit 0"
        - free -m

      # server module test
    - env:
        - NAME="server module test"
      install: MAVEN_OPTS='-Xmx3000m' mvn install -q -ff -DskipTests -B
      before_script: unset _JAVA_OPTIONS
      script:
        # Set MAVEN_OPTS for Surefire launcher
        - MAVEN_OPTS='-Xmx512m' mvn test -B -pl server

      # server module test with SQL Compatibility enabled
    - env:
        - NAME="server module test with SQL Compatibility enabled"
      install: MAVEN_OPTS='-Xmx3000m' mvn install -q -ff -DskipTests -B
      before_script: unset _JAVA_OPTIONS
      script:
        # Set MAVEN_OPTS for Surefire launcher
        - MAVEN_OPTS='-Xmx512m' mvn test -B -pl server -Ddruid.generic.useDefaultValueForNull=false


      # other modules test
    - env:
        - NAME="other modules test"
        - AWS_REGION=us-east-1 # set a aws region for unit tests
      install: MAVEN_OPTS='-Xmx3000m' mvn install -q -ff -DskipTests -B
      before_script: unset _JAVA_OPTIONS
      script:
        # Set MAVEN_OPTS for Surefire launcher
        - MAVEN_OPTS='-Xmx512m' mvn test -B -pl '!processing,!server'
        - sh -c "dmesg | egrep -i '(oom|out of memory|kill process|killed).*' -C 1 || exit 0"
        - free -m

      # other modules test with SQL Compatibility enabled
    - env:
        - NAME="other modules test with SQL Compatibility"
        - AWS_REGION=us-east-1 # set a aws region for unit tests
      install: MAVEN_OPTS='-Xmx3000m' mvn install -q -ff -DskipTests -B
      before_script: unset _JAVA_OPTIONS
      script:
        # Set MAVEN_OPTS for Surefire launcher
        - MAVEN_OPTS='-Xmx512m' mvn test -B -Ddruid.generic.useDefaultValueForNull=false -pl '!processing,!server'
        - sh -c "dmesg | egrep -i '(oom|out of memory|kill process|killed).*' -C 1 || exit 0"
        - free -m

      # run integration tests
    - sudo: required
      services:
        - docker
      env:
        - NAME="integration test part 1"
        - DOCKER_IP=127.0.0.1
      install:
        # Only errors will be shown with the -q option. This is to avoid generating too many logs which make travis build failed.
        - mvn install -q -ff -DskipTests -B
      script:
        - $TRAVIS_BUILD_DIR/ci/travis_script_integration.sh
      after_failure:
        - for v in ~/shared/logs/*.log ; do
          echo $v logtail ======================== ; tail -100 $v ;
          done
        - for v in broker middlemanager overlord router coordinator historical ; do
          echo $v dmesg ======================== ;
          docker exec -it druid-$v sh -c 'dmesg | tail -3' ;
          done

      # run integration tests
    - sudo: required
      services:
        - docker
      env:
        - NAME="integration test part 2"
        - DOCKER_IP=127.0.0.1
      install:
        # Only errors will be shown with the -q option. This is to avoid generating too many logs which make travis build failed.
        - mvn install -q -ff -DskipTests -B
      script:
        - $TRAVIS_BUILD_DIR/ci/travis_script_integration_part2.sh
      after_failure:
        - for v in ~/shared/logs/*.log ; do
          echo $v logtail ======================== ; tail -100 $v ;
          done
        - for v in broker middlemanager overlord router coordinator historical ; do
          echo $v dmesg ======================== ;
          docker exec -it druid-$v sh -c 'dmesg | tail -3' ;
          done
