# 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

# Note that the global "env" setting isn't inherited automatically by
# matrix entries with their own "env", so we have to insert it explicitly.
env: &global_env
  ARROW_ENABLE_TIMING_TESTS: "OFF"
  COMPOSE_DOCKER_CLI_BUILD: 1
  DOCKER_BUILDKIT: 0
  DOCKER_VOLUME_PREFIX: $TRAVIS_BUILD_DIR/.docker/

jobs:
  include:
    - name: "C++ on ARM"
      os: linux
      arch: arm64
      env:
        <<: *global_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.
        #
        # Limiting CPP_MAKE_PARALLELISM is required to avoid random compiler
        # crashes.
        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
          -e CPP_MAKE_PARALLELISM=4
          "
        # 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:
        <<: *global_env
        ARCH: s390x
        ARROW_CI_MODULES: "CPP"
        DOCKER_IMAGE_ID: ubuntu-cpp
        # 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 CMAKE_UNITY_BUILD=ON
          -e CPP_MAKE_PARALLELISM=4
          -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:
        <<: *global_env
        ARCH: s390x
        ARROW_CI_MODULES: "GO"
        DOCKER_IMAGE_ID: debian-go

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

  allow_failures:
    - name: "Go on s390x"
    - name: "Java on s390x"

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