#
# 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
# https://docs.travis-ci.com/user/reference/linux
dist: focal
language: cpp

services:
  - docker

install:
  # https://docs.travis-ci.com/user/common-build-problems/#build-times-out-because-no-output-was-received
  # adding `travis_wait` because kerl building in the docker file takes >10 min for building erlang
  # without printing to stdout, resulting in build failures
  - if [[ `uname` == "Linux" ]]; then travis_wait 40 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-focal
    - BUILD_LIBS="CPP C_GLIB 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
    - script: true
      env:
        - JOB="Docker Build ubuntu-focal 20.04 LTS"
        - DISTRO=ubuntu-focal
        - TRAVIS_BUILD_STAGE=docker

    # ========================= stage: thrift =======================
    # ------------------------- phase: cross ------------------------
    - stage: thrift
      script: build/docker/run.sh
      env:
        - JOB="Cross Language Tests (Binary Protocol)"
        - SCRIPT="cross-test.sh"
        - BUILD_ARG="-'(binary)'"

    - stage: thrift
      script: build/docker/run.sh
      env:
        - JOB="Cross Language Tests (Header, JSON Protocols)"
        - SCRIPT="cross-test.sh"
        - BUILD_ARG="-'(header|json)'"

    - stage: thrift
      script: build/docker/run.sh
      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"

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

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

    - script: build/docker/run.sh
      env:
        - JOB="CMake"
        - BUILD_ARG="-DCMAKE_BUILD_TYPE=Release"

    # ------------------------- 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: swift ------------------------
    # We lint the podspec
    - os: osx
      osx_image: xcode11.3
      language: swift
      script:
        - gem update cocoapods
        - pod lib lint --allow-warnings --swift-version=5.1
      env:
        - JOB="pod lib lint"

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

