# 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

matrix:
  include:
    - stage: "Cache"
      name: "Cache Dependencies - no explicit jdk specified"
      script: >-
        if [ ! -d "$HOME"/.m2/repository ] || [ ! "$(ls -A "$HOME"/.m2/repository)" ] ; then
          echo "Cached Maven repository does not exist, downloading dependencies..."
          mvn -V -T 1C -pl !./nifi-nar-bundles/nifi-hive-bundle/nifi-hive3-nar,!./nifi-nar-bundles/nifi-hive-bundle/nifi-hive3-processors dependency:go-offline -Dsilent -ntp --fail-never \
          | grep -v -F -f .travis-output-filters -e "Failed to execute goal on project"
        else
          echo "Cached Maven repository exists, skipping dependency cache"
        fi
    - stage: "Cache"
      name: "Cache Dependencies - openjdk8"
      jdk: openjdk8
      script: >-
        if [ ! -d "$HOME"/.m2/repository ] || [ ! "$(ls -A "$HOME"/.m2/repository)" ] ; then
          echo "Cached Maven repository does not exist, downloading dependencies..."
          mvn -V -T 1C -pl !./nifi-nar-bundles/nifi-hive-bundle/nifi-hive3-nar,!./nifi-nar-bundles/nifi-hive-bundle/nifi-hive3-processors dependency:go-offline -Dsilent -ntp --fail-never \
          | grep -v -F -f .travis-output-filters -e "Failed to execute goal on project"
        else
          echo "Cached Maven repository exists, skipping dependency cache"
        fi
    # For the build stages, use -pl to exclude the following from the build to reduce build time:
    #   non-api nar modules
    #   assembly modules
    #   nifi-maven-archetype directories that have "__" in the name
    - stage: "Build"
      name: "Build Java 8 EN"
      jdk: openjdk8
      script: >-
        mvn clean install -V -T 1C
        -pl `find . -type d \( -name "*-nar" -or -name "*-assembly" -or -name "*hive3*" -or -name "nifi-system-test*" \) -and -not -name "*api-nar" -and -not -path "*/target/*" -and -not -name "*__*" -printf "!./%P,"`
        -Pcontrib-check,include-grpc -Ddir-only
        -Dmaven.surefire.arguments="-Duser.language=en -Duser.region=US"
        | grep -v -F -f .travis-output-filters
        && test ${PIPESTATUS[0]} -eq 0
    - stage: "Build"
      name: "Build Java 8 FR"
      jdk: openjdk8
      script: >-
        mvn clean install -V -T 1C
        -pl `find . -type d \( -name "*-nar" -or -name "*-assembly" -or -name "*hive3*" -or -name "nifi-system-test*" \) -and -not -name "*api-nar" -and -not -path "*/target/*" -and -not -name "*__*" -printf "!./%P,"`
        -Pcontrib-check,include-grpc -Ddir-only
        -Dmaven.surefire.arguments="-Duser.language=fr -Duser.region=FR"
        | grep -v -F -f .travis-output-filters
        && test ${PIPESTATUS[0]} -eq 0
    - stage: "Build"
      name: "Build Java 8 JA"
      jdk: openjdk8
      script: >-
        mvn clean install -V -T 1C
        -pl `find . -type d \( -name "*-nar" -or -name "*-assembly" -or -name "*hive3*" -or -name "nifi-system-test*" \) -and -not -name "*api-nar" -and -not -path "*/target/*" -and -not -name "*__*" -printf "!./%P,"`
        -Pcontrib-check,include-grpc -Ddir-only
        -Dmaven.surefire.arguments="-Duser.language=ja -Duser.region=JP"
        | grep -v -F -f .travis-output-filters
        && test ${PIPESTATUS[0]} -eq 0
    - stage: "Build"
      name: "Build Java 11 EN"
      # Do not specify "jdk:" here, install-jdk.sh will download the JDK set JAVA_HOME appropriately
      before_script:
        # Download the newest version of sormuras' install-jdk.sh to /tmp
        # install-jdk.sh is used by Travis internally, sormoras is the maintainer of that script
        - wget -O /tmp/install-jdk.sh https://github.com/sormuras/bach/raw/master/install-jdk.sh
        # Need to specifically install AdoptOpenJDK 11.0.4 (Linux, HotSpot) since Travis does not offer it by default
        # The link to the AdoptOpenJDK 11.0.4 .tar.gz is taken directly from AdoptOpenJDK's website
        - >-
          source /tmp/install-jdk.sh
          --url 'https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.4%2B11/OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz'
      script:
        - >-
          mvn clean install -V -T 1C
          -pl `find . -type d \( -name "*-nar" -or -name "*-assembly" -or -name "*hive3*" -or -name "nifi-system-test*" \) -and -not -name "*api-nar" -and -not -path "*/target/*" -and -not -name "*__*" -printf "!./%P,"`
          -Pcontrib-check,include-grpc -Ddir-only
          -Dmaven.surefire.arguments="-Duser.language=en -Duser.region=US"
          | grep -v -F -f .travis-output-filters
          && test ${PIPESTATUS[0]} -eq 0

os:
  - linux

# Caches mvn repository in order to speed up builds
cache:
  directories:
    - $HOME/.m2
    - $HOME/.npm

before_cache:
  # Remove nifi repo again to save travis from caching it
  - rm -rf $HOME/.m2/repository/org/apache/nifi/

# before_install aids in a couple workarounds for issues within the Travis-CI environment
#   1. Workaround for buffer overflow issues with OpenJDK versions of java as per https://github.com/travis-ci/travis-ci/issues/5227#issuecomment-165135711
#   2. Workaround for non-existent Maven repository as per: https://github.com/travis-ci/travis-ci/issues/4629#issuecomment-131214465
before_install:
  - sudo hostname "$(hostname | cut -c1-63)"
  - sed -e "s/^\\(127\\.0\\.0\\.1.*\\)/\\1 $(hostname | cut -c1-63)/" /etc/hosts | sudo tee /etc/hosts
  - sed -i.bak -e 's|https://nexus.codehaus.org/snapshots/|https://oss.sonatype.org/content/repositories/codehaus-snapshots/|g' ~/.m2/settings.xml
  - echo "MAVEN_OPTS='-Xmx2g -XX:+UseG1GC'" > ~/.mavenrc
  - cat ~/.mavenrc
  # Remove nifi repo again to save travis from caching it
  - rm -rf $HOME/.m2/repository/org/apache/nifi/
  # Install Maven 3.6.1
  - wget -O /tmp/apache-maven-3.6.1-bin.tar.gz https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
  - tar xzf /tmp/apache-maven-3.6.1-bin.tar.gz -C /tmp
  - export M2_HOME=/tmp/apache-maven-3.6.1
  - export PATH=$M2_HOME/bin:$PATH

install: true
