#
# 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.
#

# build Apache Thrift on Travis CI - https://travis-ci.org/

#
# Docker Integration
# 
# DOCKER_REPO
#   [required] The repository name (within your account).
# DOCKER_PASS
#   [optional, secure] Your docker account password.
#   If you do not set this, each build job in the "test"
#   stage might rebuild the docker image and extend build
#   time by about 10 minutes per job.  If you do set this
#   then each build job in the "docker" stage" will build
#   the docker image if Dockerfile has changed, and then
#   push the new tag up to your docker hub account.
# DOCKER_USER
#   [required] Your docker hub account name.
#
# The resulting tag is:
#   $DOCKER_USER/$DOCKER_REPO:$DISTRO
# example (and the default):
#   apache/thrift:ubuntu-xenial
#

sudo: required
dist: trusty
language: cpp

services:
  - docker

install:
  - if [[ `uname` == "Linux" ]]; then build/docker/refresh.sh; fi

stages:
# - osx       # up front for now (for testing)
  - docker    # docker images
  - thrift    # thrift build jobs

env:
  global:
    - SCRIPT="cmake.sh"
    - BUILD_ARG=""
    - BUILD_ENV="-e CC=clang -e CXX=clang++"
    - DISTRO=ubuntu-xenial
    - BUILD_LIBS="CPP C_GLIB HASKELL JAVA PYTHON TESTING TUTORIALS"  # only meaningful for CMake builds
    - TRAVIS_BUILD_STAGE=test
    - DEFAULT_DOCKER_USER="apache"
    - DEFAULT_DOCKER_REPO="thrift"

jobs:
  include:
    # ------------------------- phase: osx --------------------------
    # - stage: osx
    #   os: osx
    #   osx_image: xcode9
    #   script: build/docker/scripts/autotools.sh

    # ========================= stage: docker =========================
    - stage: docker
      script: true
      env:
        - JOB="Docker Build ubuntu-trusty 14.04"
        - DISTRO=ubuntu-trusty
        - TRAVIS_BUILD_STAGE=docker
    - script: true
      env:
        - JOB="Docker Build ubuntu-xenial 16.04"
        - DISTRO=ubuntu-xenial
        - TRAVIS_BUILD_STAGE=docker
    - script: true
      env:
        - JOB="Docker Build ubuntu-artful 17.10"
        - DISTRO=ubuntu-artful
        - TRAVIS_BUILD_STAGE=docker

    # ========================= stage: thrift =======================
    # ------------------------- phase: cross ------------------------
    # apache/thrift official PR builds can exceed 50 minutes per job so combine all cross tests
    - stage: thrift
      script: build/docker/run.sh
      if: repo = apache/thrift
      env:
        - JOB="Cross Language Tests"
        - SCRIPT="cross-test.sh"
        - BUILD_ARG=""
        - BUILD_ENV="-e CC=clang -e CXX=clang++ -e THRIFT_CROSSTEST_CONCURRENCY=4"

    # fork based PR builds cannot exceed 50 minutes per job
    - stage: thrift
      script: build/docker/run.sh
      if: repo != apache/thrift
      env:
        - JOB="Cross Language Tests (Binary Protocol)"
        - SCRIPT="cross-test.sh"
        - BUILD_ARG="-'(binary)'"
        - BUILD_ENV="-e CC=clang -e CXX=clang++ -e THRIFT_CROSSTEST_CONCURRENCY=4"

    - stage: thrift
      script: build/docker/run.sh
      if: repo != apache/thrift
      env:
        - JOB="Cross Language Tests (Header, JSON Protocols)"
        - SCRIPT="cross-test.sh"
        - BUILD_ARG="-'(header|json)'"
        - BUILD_ENV="-e CC=clang -e CXX=clang++ -e THRIFT_CROSSTEST_CONCURRENCY=4"

    - stage: thrift
      script: build/docker/run.sh
      if: repo != apache/thrift
      env:
        - JOB="Cross Language Tests (Compact and Multiplexed Protocols)"
        - SCRIPT="cross-test.sh"
        - BUILD_ARG="-'(compact|multiplexed)'"
        - BUILD_ENV="-e CC=clang -e CXX=clang++ -e THRIFT_CROSSTEST_CONCURRENCY=4"

    # ------------------------- phase: sca --------------------------
    # QA jobs for code analytics and metrics
    - stage: thrift
      script: build/docker/run.sh
      env:
        - JOB="Static Code Analysis"
        - SCRIPT="sca.sh"
        - DISTRO=ubuntu-artful

    # C and C++ undefined behavior.
    # A binary crashes if undefined behavior occurs and produces a stack trace.
    # python is disabled, see: THRIFT-4360
    - script: build/docker/run.sh
      env:
        - JOB="UBSan"
        - SCRIPT="ubsan.sh"
        - DISTRO=ubuntu-artful
        - BUILD_ARG="--without-python --without-py3"

    # ------------------------- phase: cmake ------------------------
    - script: build/docker/run.sh
      env:
        - JOB="CMake (Ubuntu Xenial)"

    # C++ specific options: compiler plug-in, threading model
    - script: build/docker/run.sh
      env:
        - JOB="C++98 (Boost Thread)"
        - SCRIPT="cmake.sh"
        - BUILD_LIBS="CPP TESTING TUTORIALS"
        - BUILD_ARG="-DCMAKE_CXX_STANDARD=98 -DCMAKE_CXX_STANDARD_REQUIRED=ON -DCMAKE_CXX_EXTENSIONS=OFF --DWITH_BOOSTTHREADS=ON -DWITH_PYTHON=OFF -DWITH_C_GLIB=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"
        - BUILD_ENV=""

    - script: build/docker/run.sh
      env:
        - JOB="C++ (Std Thread) and Plugin"
        - SCRIPT="cmake.sh"
        - BUILD_LIBS="CPP TESTING TUTORIALS"
        - BUILD_ARG="-DWITH_PLUGIN=ON -DWITH_STDTHREADS=ON -DWITH_PYTHON=OFF -DWITH_C_GLIB=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"
        - BUILD_ENV="-e CC=clang -e CXX=clang++"

    # ------------------------- phase: autotools --------------------
    # TODO: Remove them once migrated to CMake
    - script: build/docker/run.sh
      env:
        - JOB="Autotools (Ubuntu Artful)"
        - DISTRO=ubuntu-artful
        - SCRIPT="autotools.sh"
        - BUILD_ENV="-e CC=gcc -e CXX=g++"

    - script: build/docker/run.sh
      env:
        - JOB="Autotools (Ubuntu Xenial)"
        - DISTRO=ubuntu-xenial
        - SCRIPT="autotools.sh"
        - BUILD_ENV="-e CC=gcc -e CXX=g++"

    - script: build/docker/run.sh
      env:
        - JOB="Autotools (Ubuntu Trusty)"
        - DISTRO=ubuntu-trusty
        - SCRIPT="autotools.sh"
        - BUILD_ENV="-e CC=gcc -e CXX=g++"

    # ------------------------- phase: dist -------------------------
    - script: build/docker/run.sh
      env:
        - JOB="make dist"
        - SCRIPT="make-dist.sh"
        - BUILD_ENV="-e CC=gcc -e CXX=g++"

    - script: build/docker/run.sh
      env:
        - JOB="Debian Packages"
        - SCRIPT="dpkg.sh"
        - BUILD_ENV="-e CC=gcc -e CXX=g++"
