
# 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:
    name: Build
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
        with:
          persist-credentials: false
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(awk -F'[:@]' '/FROM golang/{print $2; exit}' Dockerfile)" >> $GITHUB_ENV
      - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
        with:
          go-version: ${{ env.GOVERSION }}
          cache: false

      - name: Build
        run: make -C $GITHUB_WORKSPACE all
      - name: Test
        run: go test -v -coverprofile=coverage.txt -covermode=atomic ./...
      - name: Upload Coverage Report
        uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.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:
    name: Container Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
        with:
          persist-credentials: false
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(awk -F'[:@]' '/FROM golang/{print $2; exit}' Dockerfile)" >> $GITHUB_ENV
      - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
        with:
          go-version: ${{ env.GOVERSION }}
          cache: false

      - uses: ko-build/setup-ko@61b4d1d396f5b2e7d6bb6fefdce3dc38d1a13445 # v0.10

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

  e2e:
    name: E2E Tests
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: Set up Homebrew
        id: set-up-homebrew
        uses: Homebrew/actions/setup-homebrew@40e9946c182a64b3db1bf51be0dcb915f7802aa9
      - name: download minisign
        run: |
          brew install minisign
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
        with:
          persist-credentials: false
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(awk -F'[:@]' '/FROM golang/{print $2; exit}' Dockerfile)" >> $GITHUB_ENV
      - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
        with:
          go-version: ${{ env.GOVERSION }}
          cache: false
      - name: install gocovmerge
        run: make gocovmerge

      - name: CLI mysql index
        run: ./tests/e2e-test.sh
        env:
          INDEX_BACKEND: mysql
      - name: CLI redis index
        run: ./tests/e2e-test.sh
        env:
          INDEX_BACKEND: redis
      - name: Refactor-e2e mysql index # this will a WIP to move all the tests to respective packages
        run: ./e2e-test.sh
        env:
          INDEX_BACKEND: mysql
      - name: Refactor-e2e redis index # this will a WIP to move all the tests to respective packages
        run: ./e2e-test.sh
        env:
          INDEX_BACKEND: redis
      - name: Upload logs if they exist
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        if: failure()
        with:
          name: E2E Docker Compose logs
          path: /tmp/docker-compose.log
      - name: Upload Coverage Report
        uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
        with:
          files: /tmp/rekor-merged.cov,/tmp/pkg-rekor-merged.cov
          flags: e2etests

  backfill:
    name: Backfill Tests
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: Set up Homebrew
        id: set-up-homebrew
        uses: Homebrew/actions/setup-homebrew@40e9946c182a64b3db1bf51be0dcb915f7802aa9
      - name: download minisign
        run: |
          brew install minisign
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
        with:
          persist-credentials: false
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(awk -F'[:@]' '/FROM golang/{print $2; exit}' Dockerfile)" >> $GITHUB_ENV
      - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
        with:
          go-version: ${{ env.GOVERSION }}
          cache: false
      - name: Install backfill test dependencies
        run: |
          go install ./cmd/rekor-cli
          sudo add-apt-repository ppa:savoury1/minisign && sudo apt-get update && sudo apt-get install minisign
          sudo apt install redis-tools default-mysql-client -y
      - name: Backfill test redis
        run: ./tests/backfill-test.sh
        env:
          INDEX_BACKEND: redis
      - name: Backfill test mysql
        run: ./tests/backfill-test.sh
        env:
          INDEX_BACKEND: mysql
      - name: Cleanup index test
        run: ./tests/cleanup-index-test.sh
        env:
          INDEX_BACKEND: redis
      - name: Copy index test
        run: ./tests/copy-index-test.sh
      - name: Upload logs if they exist
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        if: failure()
        with:
          name: E2E Docker Compose logs
          path: /tmp/docker-compose.log

  sharding-e2e:
    name: Sharding E2E Tests
    runs-on: ubuntu-latest
    needs: build

    steps:
      - name: Set up Homebrew
        id: set-up-homebrew
        uses: Homebrew/actions/setup-homebrew@40e9946c182a64b3db1bf51be0dcb915f7802aa9
      - name: download minisign
        run: |
          brew install minisign
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
        with:
          persist-credentials: false
      - name: Docker Build
        run: docker compose build
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(awk -F'[:@]' '/FROM golang/{print $2; exit}' Dockerfile)" >> $GITHUB_ENV
      - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
        with:
          go-version: ${{ env.GOVERSION }}
          cache: false

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

  issue-872-e2e:
    name: Issue 872 E2E Test
    runs-on: ubuntu-latest
    needs: build

    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
        with:
          persist-credentials: false
      - name: Docker Build
        run: docker compose build
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(awk -F'[:@]' '/FROM golang/{print $2; exit}' Dockerfile)" >> $GITHUB_ENV
      - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
        with:
          go-version: ${{ env.GOVERSION }}
          cache: false

      - 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@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        if: failure()
        with:
          name: Docker Compose logs
          path: /tmp/*docker-compose.log

  client-algorithms-e2e:
    name: Client Algorithms E2E Tests
    runs-on: ubuntu-latest
    needs: build

    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
        with:
          persist-credentials: false
      - name: Docker Build
        run: docker compose build
      - name: Extract version of Go to use
        run: echo "GOVERSION=$(awk -F'[:@]' '/FROM golang/{print $2; exit}' Dockerfile)" >> $GITHUB_ENV
      - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
        with:
          go-version: ${{ env.GOVERSION }}
          cache: false

      - name: Test for supported client algorithms
        run: ./tests/client-algos-e2e-test.sh
      - name: Upload logs if they exist
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        if: failure()
        with:
          name: Docker Compose logs
          path: /tmp/*docker-compose.log

  harness:
    name: Test Harness
    runs-on: ubuntu-latest
    needs: build
    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
        with:
          persist-credentials: false

      - name: Free up disk space
        run: |
          sudo rm -rf /usr/share/dotnet || true
          sudo rm -rf /opt/ghc || true
          sudo rm -rf "/usr/local/share/boost" || true
          sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true
          sudo df -h

      - name: Create git branch
        run: git switch -c harness-test-branch

      - name: Extract version of Go to use
        run: echo "GOVERSION=$(awk -F'[:@]' '/FROM golang/{print $2; exit}' Dockerfile)" >> $GITHUB_ENV

      - uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
        with:
          go-version: ${{ env.GOVERSION }}
          check-latest: true
          cache: false

      - name: Run test harness
        run: ./tests/rekor-harness.sh

      - name: Upload logs if they exist
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        if: failure()
        with:
          name: E2E Docker Compose logs
          path: /tmp/docker-compose.log
