name: Benchmark
on:
  push:
    branches:
      - main
  workflow_dispatch:

# Declare default permissions as read only.
permissions: read-all

env:
  DEFAULT_GO_VERSION: "~1.24.0"
jobs:
  benchmark:
    name: Benchmarks
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
        with:
          go-version: ${{ env.DEFAULT_GO_VERSION }}
          check-latest: true
          cache-dependency-path: "**/go.sum"
      - name: Run benchmarks
        run: make benchmark | tee output.txt
      - name: Download previous benchmark data
        uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        with:
          path: ./benchmarks
          # `github.event.before` means the commit before the push (i.e. the previous commit).
          # So we can fetch the exact benchmark data from the previous commit.
          key: ${{ runner.os }}-benchmark-${{ github.event.before }}
      - name: Store benchmarks result
        uses: benchmark-action/github-action-benchmark@d48d326b4ca9ba73ca0cd0d59f108f9e02a381c7 # v1.20.4
        with:
          name: Benchmarks
          tool: 'go'
          output-file-path: output.txt
          external-data-json-path: ./benchmarks/data.json
          github-token: ${{ secrets.GITHUB_TOKEN }}
          gh-pages-branch: benchmarks
          fail-on-alert: true
          alert-threshold: "400%"
          # Add benchmark summary to GitHub workflow run report
          summary-always: true
      - name: Save benchmark data
        uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        # The cache will be saved even if a step fails.
        if: always()
        with:
          path: ./benchmarks
          # Use the current commit SHA as the cache key.
          key: ${{ runner.os }}-benchmark-${{ github.sha }}
