#
# Copyright 2021 The Sigstore Authors.
#
# Licensed 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: CI

on:
  push:
    branches:
      - main
      - 'release-**'
  pull_request:
    branches:
      - main
      - 'release-**'

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(cat Dockerfile|grep golang | awk ' { print $2 } ' | cut -d '@' -f 1 | cut -d ':' -f 2 | uniq)" >> $GITHUB_ENV
      - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
        with:
          go-version: ${{ env.GOVERSION }}

      - name: Build
        run: make -C $GITHUB_WORKSPACE all
      - name: Fuzz-Build
        run: make -C $GITHUB_WORKSPACE fuzz
      - name: Test
        run: go test -v -coverprofile=coverage.txt -covermode=atomic ./...
      - name: Upload Coverage Report
        uses: codecov/codecov-action@54bcd8715eee62d40e33596ef5e8f0f48dbbccab # v4.1.0
        with:
          flags: unittests
      - name: Ensure no files were modified as a result of the build
        run: git update-index --refresh && git diff-index --quiet HEAD -- || git diff --exit-code

  container-build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(cat Dockerfile|grep golang | awk ' { print $2 } ' | cut -d '@' -f 1 | cut -d ':' -f 2 | uniq)" >> $GITHUB_ENV
      - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
        with:
          go-version: ${{ env.GOVERSION }}

      - uses: ko-build/setup-ko@ace48d793556083a76f1e3e6068850c1f4a369aa # v0.6

      - name: container
        run: |
          make ko-local
          docker run --rm $(cat rekorImagerefs) version
          docker run --rm $(cat cliImagerefs) version
          docker run --rm $(cat redisImagerefs) --version

  e2e:
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: download minisign
        # run: sudo add-apt-repository ppa:dysfunctionalprogramming/minisign && sudo apt-get update && sudo apt-get install minisign
        run: sudo add-apt-repository ppa:savoury1/minisign && sudo apt-get update && sudo apt-get install minisign

      - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(cat Dockerfile|grep golang | awk ' { print $2 } ' | cut -d '@' -f 1 | cut -d ':' -f 2 | uniq)" >> $GITHUB_ENV
      - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
        with:
          go-version: ${{ env.GOVERSION }}
      - name: install gocovmerge
        run: make gocovmerge

      - name: CLI
        run: ./tests/e2e-test.sh
      - name: Refactor-e2e # this will a WIP to move all the tests to respective packages
        run: ./e2e-test.sh
      - name: Upload logs if they exist
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
        if: failure()
        with:
          name: E2E Docker Compose logs
          path: /tmp/docker-compose.log
      - name: Upload Coverage Report
        uses: codecov/codecov-action@54bcd8715eee62d40e33596ef5e8f0f48dbbccab # v4.1.0
        with:
          files: /tmp/rekor-merged.cov,/tmp/pkg-rekor-merged.cov
          flags: e2etests

  sharding-e2e:
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: download minisign
        # run: sudo add-apt-repository ppa:dysfunctionalprogramming/minisign && sudo apt-get update && sudo apt-get install minisign
        run: sudo add-apt-repository ppa:savoury1/minisign && sudo apt-get update && sudo apt-get install minisign
      - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
      - name: Docker Build
        run: docker-compose build
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(cat Dockerfile|grep golang | awk ' { print $2 } ' | cut -d '@' -f 1 | cut -d ':' -f 2 | uniq)" >> $GITHUB_ENV
      - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
        with:
          go-version: ${{ env.GOVERSION }}

      - name: Sharding Test
        run: ./tests/sharding-e2e-test.sh
      - name: Upload logs if they exist
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
        if: failure()
        with:
          name: Sharding E2E Docker Compose logs
          path: /tmp/docker-compose.log

  issue-872-e2e:
    runs-on: ubuntu-latest
    needs: build

    steps:
      - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
      - name: Docker Build
        run: docker-compose build
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(cat Dockerfile|grep golang | awk ' { print $2 } ' | cut -d '@' -f 1 | cut -d ':' -f 2 | uniq)" >> $GITHUB_ENV
      - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
        with:
          go-version: ${{ env.GOVERSION }}

      - name: Test for Attestation begin returned that was previously persisted in tlog
        run: ./tests/issue-872-e2e-test.sh
      - name: Upload logs if they exist
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
        if: failure()
        with:
          name: Docker Compose logs
          path: /tmp/*docker-compose.log

  harness:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
      - name: Create git branch
        run: git switch -c harness-test-branch
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(cat Dockerfile|grep golang | awk ' { print $2 } ' | cut -d '@' -f 1 | cut -d ':' -f 2 | uniq)" >> $GITHUB_ENV
      - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
        with:
          go-version: ${{ env.GOVERSION }}

      - name: Run test harness
        run: ./tests/rekor-harness.sh
      - name: Upload logs if they exist
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
        if: failure()
        with:
          name: E2E Docker Compose logs
          path: /tmp/docker-compose.log