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

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-graviton2
      # This is required for arm64-graviton2.
      # https://docs.travis-ci.com/user/multi-cpu-architectures/#example-multi-architecture-build-matrix
      group: edge
      # This is required for arm64-graviton2.
      # https://docs.travis-ci.com/user/multi-cpu-architectures/#testing-on-multiple-cpu-architectures
      virt: vm
      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.
        DOCKER_RUN_ARGS: >-
          "
          -e ARROW_BUILD_STATIC=OFF
          -e ARROW_GCS=OFF
          -e ARROW_ORC=OFF
          -e ARROW_USE_GLOG=OFF
          -e CMAKE_UNITY_BUILD=ON
          "
        # The LLVM's APT repository doesn't provide arm64 binaries.
        # We should use LLVM provided by Ubuntu.
        LLVM: "10"
        UBUNTU: "20.04"

    - name: "Go on ARM"
      os: linux
      arch: arm64-graviton2
      group: edge
      virt: vm
      env:
        <<: *global_env
        ARCH: arm64v8
        ARROW_CI_MODULES: "GO"
        DOCKER_IMAGE_ID: debian-go

    - 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_GCS=OFF
          -e ARROW_MIMALLOC=OFF
          -e ARROW_ORC=OFF
          -e ARROW_SUBSTRAIT=OFF
          -e ARROW_PARQUET=OFF
          -e ARROW_S3=OFF
          -e CMAKE_UNITY_BUILD=ON
          -e CMAKE_BUILD_PARALLEL_LEVEL=2
          -e PARQUET_BUILD_EXAMPLES=OFF
          -e PARQUET_BUILD_EXECUTABLES=OFF
          -e Protobuf_SOURCE=BUNDLED
          -e gRPC_SOURCE=BUNDLED
          "
        # The LLVM's APT repository causes download error for s390x binary
        # We should use the LLVM provided by the default APT repository
        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

    - name: "Python on s390x"
      os: linux
      arch: s390x
      env:
        <<: *global_env
        ARCH: s390x
        ARROW_CI_MODULES: "PYTHON"
        DOCKER_IMAGE_ID: ubuntu-python
        # 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_GCS=OFF
          -e ARROW_MIMALLOC=OFF
          -e ARROW_ORC=OFF
          -e ARROW_PARQUET=OFF
          -e ARROW_PYTHON=ON
          -e ARROW_S3=OFF
          -e CMAKE_UNITY_BUILD=ON
          -e CMAKE_BUILD_PARALLEL_LEVEL=2
          -e PARQUET_BUILD_EXAMPLES=OFF
          -e PARQUET_BUILD_EXECUTABLES=OFF
          -e Protobuf_SOURCE=BUNDLED
          -e gRPC_SOURCE=BUNDLED
          "

  allow_failures:
    - name: "Java on s390x"
    - name: "Python 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:
  - sudo -H pip3 install --upgrade pip
  - sudo -H pip3 install 'docker-compose>=1.27.0'
  - sudo -H pip3 install -e dev/archery[docker]

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