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

name: CI - Integration - Sql
on:
  pull_request:
    branches:
      - master
  push:
    branches:
      - branch-*

env:
  MAVEN_OPTS: -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.http.retryHandler.class=standard -Dmaven.wagon.http.retryHandler.count=3

jobs:

  sql:
    runs-on: ubuntu-latest
    timeout-minutes: 120

    steps:
      - name: checkout
        uses: actions/checkout@v2

      - name: Changed files check
        id:   changes
        uses: apache/pulsar-test-infra/paths-filter@master
        with:
          filters: |
            # pattern syntax: https://github.com/micromatch/picomatch
            all:
              - '**'
            docs:
              - 'site2/**'
              - 'deployment/**'
              - '.asf.yaml'
              - '*.md'
              - '**/*.md'

      - name: Cache local Maven repository
        if: ${{ steps.changes.outputs.all_count > steps.changes.outputs.docs_count }}
        uses: actions/cache@v2
        with:
          path: |
            ~/.m2/repository/*/*/*
            !~/.m2/repository/org/apache/pulsar
          key: ${{ runner.os }}-m2-dependencies-all-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-m2-dependencies-core-modules-${{ hashFiles('**/pom.xml') }}
            ${{ runner.os }}-m2-dependencies-core-modules-

      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        if: ${{ steps.changes.outputs.all_count > steps.changes.outputs.docs_count }}
        with:
          java-version: 1.8

      - name: Replace maven's wagon-http version
        if: ${{ steps.changes.outputs.all_count > steps.changes.outputs.docs_count }}
        run: sudo ./build/replace_maven-wagon-http-version.sh

      - name: clean disk
        if: ${{ steps.changes.outputs.all_count > steps.changes.outputs.docs_count }}
        run: |
          sudo swapoff -a
          sudo rm -rf /swapfile /usr/share/dotnet /usr/local/lib/android /opt/ghc
          sudo apt clean
          docker rmi $(docker images -q) -f
          df -h

      - name: run install by skip tests
        if: ${{ steps.changes.outputs.all_count > steps.changes.outputs.docs_count }}
        run: mvn -q -B -ntp clean install -DskipTests

      - name: build pulsar image
        if: ${{ steps.changes.outputs.all_count > steps.changes.outputs.docs_count }}
        run: mvn -B -f docker/pulsar/pom.xml install -am -Pdocker -DskipTests -Ddocker.nocache=true

      - name: build pulsar-all image
        if: ${{ steps.changes.outputs.all_count > steps.changes.outputs.docs_count }}
        run: mvn -B -f docker/pulsar-all/pom.xml install -am -Pdocker -DskipTests -Ddocker.nocache=true

      - name: build artifacts and docker pulsar latest test image
        if: ${{ steps.changes.outputs.all_count > steps.changes.outputs.docs_count }}
        run: mvn -B -f tests/docker-images/pom.xml install -am -Pdocker -DskipTests

      - name: run integration tests
        if: ${{ steps.changes.outputs.all_count > steps.changes.outputs.docs_count }}
        run: ./build/run_integration_group.sh SQL
