#
# 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: Sync Camel Kafka Connector master Branch with latest Camel master

env:
  MAVEN_ARGS: -V -ntp

on:
  schedule:
    # Run at 2 AM every day
    - cron:  '0 2 * * *'
  workflow_dispatch:
jobs:
  build:
    name: Sync Camel Kafka Connector master Branch with latest Camel master
    runs-on: ubuntu-latest
    strategy:
      matrix:
        java: [ '11' ]
    steps:
      - name: Checkout Camel project
        uses: actions/checkout@v2
        with:
          repository: apache/camel
          ref: master
          path: camel
      - name: Set up JDK ${{ matrix.java }}
        uses: AdoptOpenJDK/install-jdk@v1
        with:
          version: ${{ matrix.java }}
      - 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 Camel Project
        run: |
          ./mvnw ${MAVEN_ARGS} \
            -DskipTests \
            clean install
        working-directory: ${{ github.workspace }}/camel
      - name: Checkout camel-kafka-connector project
        uses: actions/checkout@v2
        with:
          ref: master
          fetch-depth: 0
      # first command builds the source check module,
      - name: build tools
        run: |
          ./mvnw ${MAVEN_ARGS} \
            -DskipTests \
            -pl :parent \
            -pl :camel-kafka-connector-aggregator \
            -pl :camel-buildtools \
            clean install
      # second one source check and install :camel-kafka-connector-generator-maven-plugin
      # this is needed to add maven plugin metadata to it,
      - name: build connector-generator-plugin
        run: |
          ./mvnw ${MAVEN_ARGS} \
            -Dcheckstyle.failOnViolation=true \
            -Psourcecheck \
            -DskipTests \
            -pl :camel-kafka-connector-model \
            -pl :camel-kafka-connector-generator-maven-plugin \
            clean install
      # third command source check everything else but :camel-kafka-connector-generator-maven-plugin
      - name: build and itests
        run: |
          ./mvnw ${MAVEN_ARGS} \
            -Dcheckstyle.failOnViolation=true \
            -Psourcecheck \
            -DskipIntegrationTests=false \
            -Dhttp.keepAlive=false \
            -Dmaven.wagon.http.pool=false \
            -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 \
            -pl '!:camel-kafka-connector-generator-maven-plugin' \
            clean test
      - name: archive logs
        uses: actions/upload-artifact@v2
        if: always()
        with:
          name: test-logs-java-${{ matrix.java }}
          path: tests/**/target/tests.log
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v2.4.1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          branch: automatic-periodic-sync
          title: '[Github Actions] Periodic Sync Camel-kafka-connector master Branch'
          body: |
            Periodic Sync of Camel Kafka connector master Branch with main Camel Master.
            see https://github.com/apache/camel-kafka-connector/blob/master/.github/workflows/automatic-sync-camel-master.yml
