# 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: build-branch
on:
  pull_request:
  push:
  schedule:
    - cron: 30 0,12 * * *
jobs:
  build:
    name: compile
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@master
      - uses: actions/cache@v2
        with:
          path: |
            ~/.pnpm-store
            **/node_modules
          key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-
      - uses: ./.github/buildenv
        with:
          args: ./hadoop-ozone/dev-support/checks/build.sh
  rat:
    name: rat
    runs-on: ubuntu-18.04
    steps:
        - uses: actions/checkout@master
        - uses: ./.github/buildenv
          with:
             args: ./hadoop-ozone/dev-support/checks/rat.sh
        - name: Summary of failures
          run: cat target/${{ github.job }}/summary.txt
          if: always()
        - uses: actions/upload-artifact@master
          if: always()
          with:
            name: rat
            path: target/rat
          continue-on-error: true
  author:
    name: author
    runs-on: ubuntu-18.04
    steps:
        - uses: actions/checkout@master
        - run: hadoop-ozone/dev-support/checks/author.sh
        - name: Summary of failures
          run: cat target/${{ github.job }}/summary.txt
          if: always()
        - uses: actions/upload-artifact@master
          if: always()
          with:
            name: author
            path: target/author
          continue-on-error: true
  unit:
    name: unit
    runs-on: ubuntu-18.04
    steps:
        - uses: actions/checkout@master
        - uses: ./.github/buildenv
          with:
             args: ./hadoop-ozone/dev-support/checks/unit.sh
        - name: Summary of failures
          run: cat target/${{ github.job }}/summary.txt
          if: always()
        - uses: actions/upload-artifact@master
          if: always()
          with:
            name: unit
            path: target/unit
          continue-on-error: true
  checkstyle:
    name: checkstyle
    runs-on: ubuntu-18.04
    steps:
        - uses: actions/checkout@master
        - uses: ./.github/buildenv
          with:
             args: ./hadoop-ozone/dev-support/checks/checkstyle.sh
        - name: Summary of failures
          run: cat target/${{ github.job }}/summary.txt
          if: always()
        - uses: actions/upload-artifact@master
          if: always()
          with:
            name: checkstyle
            path: target/checkstyle
          continue-on-error: true
  findbugs:
    name: findbugs
    runs-on: ubuntu-18.04
    steps:
        - uses: actions/checkout@master
        - uses: ./.github/buildenv
          with:
             args: ./hadoop-ozone/dev-support/checks/findbugs.sh
        - name: Summary of failures
          run: cat target/${{ github.job }}/summary.txt
          if: always()
        - uses: actions/upload-artifact@master
          if: always()
          with:
            name: findbugs
            path: target/findbugs
          continue-on-error: true
  acceptance:
    name: acceptance
    runs-on: ubuntu-18.04
    strategy:
      matrix:
        suite:
          - secure
          - unsecure
          - misc
      fail-fast: false
    steps:
      - uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: maven-repo-${{ hashFiles('**/pom.xml') }}
      - uses: actions/cache@v2
        with:
            path: |
              ~/.pnpm-store
              **/node_modules
            key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
            restore-keys: |
              ${{ runner.os }}-pnpm-
      - name: checkout to /mnt/ozone
        run: |
          sudo chmod 777 /mnt
          git clone 'https://github.com/${{ github.repository }}.git' /mnt/ozone
          cd /mnt/ozone
          if [[ '${{ github.event_name }}' == 'pull_request' ]]; then
            git fetch --verbose origin '${{ github.ref }}'
          else
            git fetch --verbose origin '${{ github.sha }}'
          fi
          git checkout FETCH_HEAD
          git reset --hard
      - name: run a full build
        run: |
          cd /mnt/ozone
          hadoop-ozone/dev-support/checks/build.sh -Pcoverage
      - run: sudo pip install robotframework
      - run: |
          cd /mnt/ozone/hadoop-ozone/dist/target/ozone-* && sudo mkdir .aws && sudo chmod 777 .aws && sudo chown 1000 .aws
          cd /mnt/ozone && hadoop-ozone/dev-support/checks/acceptance.sh
        env:
          KEEP_IMAGE: false
          OZONE_ACCEPTANCE_SUITE: ${{ matrix.suite }}
          OZONE_WITH_COVERAGE: true
          OZONE_VOLUME_OWNER: 1000
      - uses: actions/upload-artifact@master
        if: always()
        with:
          name: acceptance-${{ matrix.suite }}
          path: /mnt/ozone/target/acceptance
        continue-on-error: true
      - run: |
          #Never cache local artifacts
          rm -rf ~/.m2/repository/org/apache/hadoop/hdds
          rm -rf ~/.m2/repository/org/apache/hadoop/ozone
        if: always()
  integration:
    name: integration
    runs-on: ubuntu-18.04
    strategy:
      matrix:
        profile:
          - client
          - filesystem-hdds
          - ozone
      fail-fast: false
    steps:
        - run: sudo mkdir mnt && sudo mount --bind /mnt `pwd`/mnt && sudo chmod 777 mnt
        - uses: actions/checkout@master
          with:
            path: mnt/ozone
        - uses: ./mnt/ozone/.github/buildenv
          with:
             args: ./mnt/ozone/hadoop-ozone/dev-support/checks/integration.sh -P${{ matrix.profile }}
        - name: Summary of failures
          run: cat mnt/ozone/target/${{ github.job }}/summary.txt
          if: always()
        - uses: actions/upload-artifact@master
          if: always()
          with:
            name: it-${{ matrix.profile }}
            path: mnt/ozone/target/integration
          continue-on-error: true
  coverage:
    name: coverage
    runs-on: ubuntu-18.04
    needs:
       - acceptance
       - integration
       - unit
    steps:
       - uses: actions/checkout@v2
       - uses: ./.github/buildenv
         with:
            args: ./hadoop-ozone/dev-support/checks/build.sh
       - uses: actions/download-artifact@v2
         with:
            path: target/artifacts
       - run: ./hadoop-ozone/dev-support/checks/coverage.sh
       - uses: ./.github/buildenv
         if: github.repository == 'apache/hadoop-ozone' && github.event_name != 'pull_request'
         with:
           args: ./hadoop-ozone/dev-support/checks/sonar.sh
         env:
           SONAR_TOKEN: ${{ secrets.SONARCLOUD_TOKEN }}
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
       - name: Upload coverage to Codecov
         uses: codecov/codecov-action@v1
         with:
           file: ./target/coverage/all.xml
           name: codecov-umbrella
           fail_ci_if_error: true
       - uses: actions/upload-artifact@master
         with:
           name: coverage
           path: target/coverage
         continue-on-error: true
