################################################################################
#  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: "flink-connector-aws: nightly build"
on:
  schedule:
    - cron: "0 0 * * *"
jobs:
  compile_and_test:
    if: github.repository_owner == 'apache'
    strategy:
      matrix:
        flink: [1.18-SNAPSHOT, 1.19-SNAPSHOT, 1.20-SNAPSHOT]
        java: [ '8, 11, 17']
    uses: ./.github/workflows/common.yml
    with:
      flink_version: ${{ matrix.flink }}
      jdk_version: ${{ matrix.java }}
      flink_url: https://s3.amazonaws.com/flink-nightly/flink-${{ matrix.flink }}-bin-scala_2.12.tgz
      cache_flink_binary: false
    secrets: inherit

  python_test:
    strategy:
      matrix:
        flink: [1.18-SNAPSHOT, 1.19-SNAPSHOT, 1.20-SNAPSHOT]
    uses: apache/flink-connector-shared-utils/.github/workflows/python_ci.yml@ci_utils
    with:
      flink_version: ${{ matrix.flink }}

