# 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

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

      # 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
