# 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: Continuous Integration

on:
  push:
    branches: [ master ]
    tags: [ '*' ]
  pull_request:
    branches: [ master ]
    types: [ opened, synchronize, reopened ]
  schedule:
    - cron: '30 1 * * 1,3,5'

permissions: read-all

jobs:
  ci:
    runs-on: ubuntu-22.04
    env:
      PUSH_NIGHTLY: ${{ (github.event_name == 'push' || github.event_name == 'schedule') && github.ref == 'refs/heads/master' }}
      PUSH_RELEASE: ${{ github.event_name == 'push' && github.ref_type == 'tag' }}
    steps:
      # Checkout just this repo and run scanCode before we do anything else
      - name: Checkout runtime repo
        uses: actions/checkout@v3
        with:
          path: runtime
      - name: Scan Code
        uses: apache/openwhisk-utilities/scancode@master

      # Install core OpenWhisk artifacts needed to build/test anything else
      - name: Checkout OpenWhisk core repo
        uses: actions/checkout@v3
        with:
          repository: apache/openwhisk
          path: core
      - name: Setup Java
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '11'
      - name: Compile and Install Core OpenWhisk
        working-directory: core
        run: |
          ./gradlew :tests:compileTestScala
          ./gradlew install

      # Build this repository
      - name: Build Runtime
        working-directory: runtime
        run: |
          ./gradlew distDocker

      # Test this repository
      - name: Test Runtime
        working-directory: runtime
        run: |
          ./gradlew :tests:checkScalafmtAll
          ./gradlew :tests:test

      # Conditionally publish runtime images to DockerHub
      # Important: naming convention for release tags is runtime@version
      - name: Docker Login
        if: ${{ env.PUSH_NIGHTLY  == 'true' || env.PUSH_RELEASE == 'true' }}
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USER_OPENWHISK }}
          password: ${{ secrets.DOCKERHUB_TOKEN_OPENWHISK }}
      - name: Push Nightly Images
        if: ${{ env.PUSH_NIGHTLY  == 'true' }}
        working-directory: runtime
        run: |
          SHORT_COMMIT=$(git rev-parse --short "$GITHUB_SHA")
          ./gradlew :actionloop:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly
          ./gradlew :actionloop:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT
          ./gradlew :golang1.19:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly
          ./gradlew :golang1.19:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT
          ./gradlew :golang1.20:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly
          ./gradlew :golang1.20:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT
      - name: Push Release Images
        if: ${{ env.PUSH_RELEASE == 'true' }}
        working-directory: runtime
        run: |
          RUNTIME_VERSION=${GITHUB_REF_NAME%@*}
          IMAGE_TAG=${GITHUB_REF_NAME##*@}
          if [[ ${RUNTIME_VERSION} =~ 1\.[0-9]+ ]]; then
            RUNTIME="golang$RUNTIME_VERSION"
          elif [ ${RUNTIME_VERSION} == "actionloop" ]; then
            RUNTIME="actionloop"
          fi
          ./gradlew $RUNTIME:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$IMAGE_TAG
