name: Benchmark

permissions: {}

on:
  push:
    branches:
      - ci
  schedule:
    - cron: '0 */12 * * *'

jobs:

  test:
    runs-on: ubuntu-latest

    services:
      redis:
        image: redis
        ports:
          - 6379:6379

      postgres:
        image: postgres:9.6
        ports:
          - 5432:5432
        env:
          POSTGRES_USER: peertube
          POSTGRES_HOST_AUTH_METHOD: trust

    env:
      PGUSER: peertube
      PGHOST: localhost

    steps:
      - uses: actions/checkout@v4

      - uses: './.github/actions/reusable-prepare-peertube-build'
        with:
          node-version: '18.x'

      - uses: './.github/actions/reusable-prepare-peertube-run'

      - name: Build
        run: |
          startClient=`date +%s`
          npm run build:server
          npm run build:client
          endClient=`date +%s`
          clientBuildTime=$((endClient-startClient))

          startServer=`date +%s`
          npm run build:server
          endServer=`date +%s`
          serverBuildTime=$((endServer-startServer))

          echo '{"clientBuildTime":'$clientBuildTime',"serverBuildTime":'$serverBuildTime'}'> build-time.json

      - name: Startup
        run: |
          npm run clean:server:test

          startCold=`date +%s%3N`
          NODE_APP_INSTANCE=1 NODE_ENV=test node dist/server --benchmark-startup
          endCold=`date +%s%3N`
          coldStartupTime=$(echo "scale=2; ($endCold-$startCold)/1000" | bc)

          startHot=`date +%s%3N`
          NODE_APP_INSTANCE=1 NODE_ENV=test node dist/server --benchmark-startup
          endHot=`date +%s%3N`
          hotStartupTime=$(echo "scale=2; ($endHot-$startHot)/1000" | bc)

          echo '{"coldStartupTime":'$coldStartupTime',"hotStartupTime":'$hotStartupTime'}'> startup-time.json

      - name: Run benchmark
        run: |
          npm run benchmark-server -- -o benchmark.json

      - name: Display result
        run: |
          cat benchmark.json build-time.json startup-time.json

      - name: Upload benchmark result
        uses: './.github/actions/reusable-deploy'
        with:
          source: benchmark.json build-time.json startup-time.json
          destination: peertube-stats
          knownHosts: ${{ secrets.STATS_DEPLOYEMENT_KNOWN_HOSTS }}
          deployKey: ${{ secrets.STATS_DEPLOYEMENT_KEY }}
          deployUser: ${{ secrets.STATS_DEPLOYEMENT_USER }}
          deployHost: ${{ secrets.STATS_DEPLOYEMENT_HOST }}
