#
# 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
# see: build/docker/README.md
# 

sudo: required
dist: trusty
language: cpp

services:
  - docker

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

stages:
  - docker    # docker images
  - thrift    # thrift build jobs

env:
  global:
    - SCRIPT="cmake.sh"
    - BUILD_ARG=""
    - BUILD_ENV="-e CC=gcc -e CXX=g++ -e THRIFT_CROSSTEST_CONCURRENCY=4"
    - DISTRO=ubuntu-artful
    - BUILD_LIBS="CPP C_GLIB HASKELL JAVA PYTHON TESTING TUTORIALS"  # only meaningful for CMake builds
    - TRAVIS_BUILD_STAGE=test
    # DOCKER_REPO (this works for all builds as a source for docker images - you can override for fork builds in your Travis settings)
    - DOCKER_REPO="thrift/thrift-build"
    # DOCKER_USER (provide in your Travis settings if you want to build and update docker images once, instead of on every job)
    # DOCKER_PASS (same)

jobs:
  include:
    # ========================= 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"

    # 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)'"

    - 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)'"

    - 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)'"

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

    # 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"
        - BUILD_ARG="--without-python --without-py3"

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

    # 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="-e CC=clang -e CXX=clang++"

    - 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"

    - script: build/docker/run.sh
      env:
        - JOB="Autotools (Ubuntu Xenial)"
        - DISTRO=ubuntu-xenial
        - SCRIPT="autotools.sh"

    - script: build/docker/run.sh
      env:
        - JOB="Autotools (Ubuntu Trusty)"
        - DISTRO=ubuntu-trusty
        - SCRIPT="autotools.sh"

    # ------------------------- phase: dist -------------------------
    - script: build/docker/run.sh
      env:
        - JOB="make dist"
        - DISTRO=ubuntu-xenial
        - SCRIPT="make-dist.sh"

    - script: build/docker/run.sh
      env:
        - JOB="Debian Packages"
        - DISTRO=ubuntu-xenial
        - SCRIPT="dpkg.sh"

  ### ------------------------- phase: osx -------------------------
  # disabled due to the time delays it imposes on build jobs
  # - os: osx
  #   osx_image: xcode9
  #   script: build/docker/scripts/autotools.sh

