#
# 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-bionic
    - 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-xenial 16.04 LTS"
        - DISTRO=ubuntu-xenial
        - TRAVIS_BUILD_STAGE=docker
    - script: true
      env:
        - JOB="Docker Build ubuntu-bionic 18.04 LTS"
        - DISTRO=ubuntu-bionic
        - 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: autotools --------------------
    # TODO: Remove them once migrated to CMake
    - script: build/docker/run.sh
      env:
        - JOB="Autotools (Ubuntu Bionic)"
        - SCRIPT="autotools.sh"

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

    # ------------------------- 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: dist -------------------------
    - script: build/docker/run.sh
      env:
        - JOB="make dist"
        - SCRIPT="make-dist.sh"

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

    # ------------------------- phase: coverity ---------------------
    # We build the coverity scan build once monthly using a travis cron job
    - if: (env(COVERITY_SCAN_NOTIFICATION_EMAIL) IS present) AND (branch IN (master)) AND (type IN (cron))
      script: build/docker/run.sh
      env:
        - JOB="Coverity Scan"
        - SCRIPT="covscan.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

