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

dist: bionic

language: minimal

cache:
  directories:
    - $TRAVIS_BUILD_DIR/.docker

addons:
  apt:
    packages:
      - python3-pip

services:
  - docker

jobs:
  include:
    - name: "C++ on ARM"
      os: linux
      arch: arm64
      env:
        ARCH: arm64v8
        ARROW_CI_MODULES: "CPP"
        DOCKER_IMAGE_ID: ubuntu-cpp
        # ARROW_USE_GLOG=OFF is needed to avoid build error caused by
        # glog and CMAKE_UNITY_BUILD=ON.
        #
        # Disable ARROW_S3 because it often causes "No output has
        # been received in the last 10m0s, this potentially indicates
        # a stalled build or something wrong with the build itself."
        # on Travis CI.
        DOCKER_RUN_ARGS: >-
          "
          -e ARROW_BUILD_STATIC=OFF
          -e ARROW_ORC=OFF
          -e ARROW_S3=OFF
          -e ARROW_USE_GLOG=OFF
          -e CMAKE_UNITY_BUILD=ON
          "
        # We need to use smaller build when cache doesn't exist
        # because Travis CI has "No output has been received in the
        # last 10m0s" limitation. If we build many modules, we reach
        # the limitation.
        DOCKER_RUN_ARGS_NO_CACHE: >-
          "
          -e ARROW_BUILD_TESTS=OFF
          -e ARROW_GANDIVA=OFF
          -e ARROW_PARQUET=OFF
          "
        # The LLVM's APT repository provides only arm64 binaries.
        # We should use LLVM provided by Ubuntu.
        LLVM: "10"
        UBUNTU: "20.04"

    - name: "C++ on s390x"
      os: linux
      arch: s390x
      env:
        ARCH: s390x
        ARROW_CI_MODULES: "CPP"
        DOCKER_IMAGE_ID: ubuntu-cpp
        # Can't use CMAKE_UNITY_BUILD=ON because of compiler crash.
        # Can't enable ARROW_MIMALLOC because of failures in memory pool tests.
        # Can't enable ARROW_S3 because compiler is killed while compiling
        # aws-sdk-cpp.
        DOCKER_RUN_ARGS: >-
          "
          -e ARROW_BUILD_STATIC=OFF
          -e ARROW_FLIGHT=ON
          -e ARROW_MIMALLOC=OFF
          -e ARROW_ORC=OFF
          -e ARROW_PARQUET=OFF
          -e ARROW_S3=OFF
          -e PARQUET_BUILD_EXAMPLES=OFF
          -e PARQUET_BUILD_EXECUTABLES=OFF
          -e Protobuf_SOURCE=BUNDLED
          -e cares_SOURCE=BUNDLED
          -e gRPC_SOURCE=BUNDLED
          "
        # The LLVM's APT repository provides only arm64 binaries.
        # We should use LLVM provided by Ubuntu.
        LLVM: "10"
        UBUNTU: "20.04"

    - name: "Go on s390x"
      os: linux
      arch: s390x
      env:
        ARCH: s390x
        ARROW_CI_MODULES: "GO"
        DOCKER_IMAGE_ID: debian-go

    - name: "Java on s390x"
      os: linux
      arch: s390x
      env:
        ARCH: s390x
        ARROW_CI_MODULES: "JAVA"
        DOCKER_IMAGE_ID: debian-java
        JDK: 11

  allow_failures:
    - arch: s390x

env:
  DOCKER_BUILDKIT: 0
  COMPOSE_DOCKER_CLI_BUILD: 1
  ARROW_ENABLE_TIMING_TESTS: "OFF"

before_install:
  - eval "$(python ci/detect-changes.py)"
  - |
    arrow_ci_affected=no
    for arrow_ci_module in ${ARROW_CI_MODULES}; do
      arrow_ci_affected_variable=ARROW_CI_${arrow_ci_module}_AFFECTED
      if [ "$(eval "echo \$${arrow_ci_affected_variable}")" = "1" ]; then
        arrow_ci_affected=yes
      fi
    done
    if [ "${arrow_ci_affected}" = "no" ]; then
      travis_terminate 0
    fi

install:
  - pip3 install -e dev/archery[docker]

script:
  - sudo sysctl -w kernel.core_pattern="core.%e.%p"
  # This isn't allowed on Travis CI:
  #   /home/travis/.travis/functions: line 109: ulimit: core file size: cannot modify limit: Operation not permitted
  - |
    ulimit -c unlimited || :
  - |
    if [ $(ls $TRAVIS_BUILD_DIR/.docker | wc -l) -eq 0 ]; then
      DOCKER_RUN_ARGS="${DOCKER_RUN_ARGS} ${DOCKER_RUN_ARGS_NO_CACHE}"
    fi
  - |
    archery docker run \
      ${DOCKER_RUN_ARGS} \
      --volume ${PWD}/build:/build \
      ${DOCKER_IMAGE_ID}

after_success:
  - |
    if [ "${TRAVIS_EVENT_TYPE}" = "push" -a \
         "${TRAVIS_REPO_SLUG}" = "apache/arrow" ]; then
      archery docker push ${DOCKER_IMAGE_ID} || :
    fi
