name: Benchmark

# Actions access a common cache entry and may corrupt it.
concurrency:
  # If PR, cancel prev commits. head_ref = source branch name on pull_request, null if push
  # if push, default to github.run_id so retries of the same commit do not overwrite each other
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

on:
  push:
    branches:
      - stable
      - unstable
      - benchmark # For debugging
  pull_request:
    branches:
      - stable
      - unstable
  workflow_dispatch:

jobs:
  run:
    runs-on: buildjet-4vcpu-ubuntu-2204
    # Skip for dependabot PRs, secrets are not made available and will fail
    # Don't run on forks. Forks don't have access to the S3 credentials and the workflow will fail
    if: |
      github.actor != 'dependabot[bot]' &&
      ( github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository )

    steps:
      # <common-build> - Uses YAML anchors in the future
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          check-latest: true
          cache: yarn
      - name: Node.js version
        id: node
        run: echo "v8CppApiVersion=$(node --print "process.versions.modules")" >> $GITHUB_OUTPUT
      - name: Restore dependencies
        uses: actions/cache@master
        id: cache-deps
        with:
          path: |
            node_modules
            packages/*/node_modules
          key: ${{ runner.os }}-${{ steps.node.outputs.v8CppApiVersion }}-${{ hashFiles('**/yarn.lock', '**/package.json') }}
      - name: Install & build
        if: steps.cache-deps.outputs.cache-hit != 'true'
        run: yarn install --frozen-lockfile && yarn build
      - name: Build
        run: yarn build
        if: steps.cache-deps.outputs.cache-hit == 'true'
      # </common-build>

      # Restore performance downloaded states
      - name: Restore performance state cache
        uses: actions/cache@master
        with:
          path: packages/state-transition/test-cache
          key: perf-states-${{ hashFiles('packages/state-transition/test/perf/params.ts') }}

      - name: Run benchmarks
        run: yarn benchmark
        env:
          # To download content for tests
          INFURA_ETH2_CREDENTIALS: ${{ secrets.INFURA_ETH2_CREDENTIALS }}
          # To write to PRs and commits
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # benchmark options
          BENCHMARK_S3: true
          # S3 credentials
          S3_ACCESS_KEY: ${{ secrets.S3_BENCH_LODESTAR_ACCESS_KEY }}
          S3_SECRET_KEY: ${{ secrets.S3_BENCH_LODESTAR_SECRET_KEY }}
          S3_REGION: ${{ secrets.S3_BENCH_LODESTAR_REGION }}
          S3_BUCKET: ${{ secrets.S3_BENCH_LODESTAR_BUCKET }}
          S3_ENDPOINT: ${{ secrets.S3_BENCH_LODESTAR_ENDPOINT }}
          # Key prefix to separate benchmark data from multiple repositories
          S3_KEY_PREFIX: ${{ github.repository }}/${{ runner.os }}
