# 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: Python API

on:
  push:
    branches:
      - dev
    paths:
      - 'dolphinscheduler-python/**'
  pull_request:
    paths:
      - 'dolphinscheduler-python/**'

concurrency:
  group: py-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

defaults:
  run:
    working-directory: dolphinscheduler-python/pydolphinscheduler

# We have to update setuptools wheel to package with package_data, LICENSE, NOTICE
env:
  DEPENDENCES: pip setuptools wheel tox

jobs:
  lint:
    name: Lint
    timeout-minutes: 15
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.7
        uses: actions/setup-python@v2
        with:
          python-version: 3.7
      - name: Install Dependences
        run: |
          python -m pip install --upgrade ${{ env.DEPENDENCES }}
      - name: Run All Lint Check
        run: |
          python -m tox -vv -e lint
  pytest:
    name: Pytest
    timeout-minutes: 15
    needs: lint
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        python-version: [3.6, 3.7, 3.8, 3.9]
        os: [ubuntu-18.04, macOS-latest, windows-latest]
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install Dependences
        run: |
          python -m pip install --upgrade ${{ env.DEPENDENCES }}
      - name: Run All Tests
        run: |
          python -m tox -vv -e code-test
  doc-build:
    name: Docs Build Test
    timeout-minutes: 15
    needs: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.7
        uses: actions/setup-python@v2
        with:
          python-version: 3.7
      - name: Install Dependences
        run: |
          python -m pip install --upgrade ${{ env.DEPENDENCES }}
      - name: Run Tests Build Docs
        run: |
          python -m tox -vv -e doc-build-test
  local-ci:
    name: Local CI
    timeout-minutes: 15
    needs:
      - pytest
      - doc-build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.7
        uses: actions/setup-python@v2
        with:
          python-version: 3.7
      - name: Install Dependences
        run: |
          python -m pip install --upgrade ${{ env.DEPENDENCES }}
      - name: Run Tests Build Docs
        run: |
          python -m tox -vv -e local-ci
  build-image:
    name: Build Image
    runs-on: ubuntu-latest
    # Switch to project root directory to run mvnw command
    defaults:
      run:
        working-directory: ./
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
      - name: Sanity Check
        uses: ./.github/actions/sanity-check
      - name: Cache local Maven repository
        uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-maven-
      - name: Build Image
        run: |
          ./mvnw -B clean install \
          -Dmaven.test.skip \
          -Dmaven.javadoc.skip \
          -Dmaven.checkstyle.skip \
          -Pdocker,release -Ddocker.tag=ci \
          -pl dolphinscheduler-standalone-server -am
      - name: Export Docker Images
        run: |
          docker save apache/dolphinscheduler-standalone-server:ci -o /tmp/standalone-image.tar \
          && du -sh /tmp/standalone-image.tar
      - uses: actions/upload-artifact@v2
        name: Upload Docker Images
        with:
          name: standalone-image
          path: /tmp/standalone-image.tar
          retention-days: 1
  integrate-test:
    name: Integrate Test
    timeout-minutes: 20
    needs:
      - build-image
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/download-artifact@v2
        name: Download Docker Images
        with:
          name: standalone-image
          path: /tmp
      - name: Load Docker Images
        run: |
          docker load -i /tmp/standalone-image.tar
      - name: Set up Python 3.7
        uses: actions/setup-python@v2
        with:
          python-version: 3.7
      - name: Install Dependences
        run: |
          python -m pip install --upgrade ${{ env.DEPENDENCES }}
      - name: Run Tests Build Docs
        run: |
          python -m tox -vv -e integrate-test
