CI: Move benchmark regression job out of default PR workflow
CI / lint (pull_request) Successful in 43s
CI / quality (pull_request) Successful in 54s
CI / typecheck (pull_request) Successful in 58s
CI / security (pull_request) Successful in 59s
CI / build (pull_request) Successful in 25s
CI / helm (pull_request) Successful in 32s
CI / push-validation (pull_request) Successful in 28s
CI / e2e_tests (pull_request) Successful in 3m25s
CI / integration_tests (pull_request) Successful in 6m56s
CI / unit_tests (pull_request) Successful in 8m54s
CI / coverage (pull_request) Successful in 14m25s
CI / docker (pull_request) Successful in 16s
CI / status-check (pull_request) Successful in 1s
CI / lint (pull_request) Successful in 43s
CI / quality (pull_request) Successful in 54s
CI / typecheck (pull_request) Successful in 58s
CI / security (pull_request) Successful in 59s
CI / build (pull_request) Successful in 25s
CI / helm (pull_request) Successful in 32s
CI / push-validation (pull_request) Successful in 28s
CI / e2e_tests (pull_request) Successful in 3m25s
CI / integration_tests (pull_request) Successful in 6m56s
CI / unit_tests (pull_request) Successful in 8m54s
CI / coverage (pull_request) Successful in 14m25s
CI / docker (pull_request) Successful in 16s
CI / status-check (pull_request) Successful in 1s
- Extract benchmark-regression into scheduled/dispatchable workflow - Gate benchmark behind nightly schedule (2 AM UTC) and manual dispatch - Add weekly full benchmark suite (3 AM UTC Sundays) - Update CI documentation with benchmark trigger process and reporting - Reduce median PR CI turnaround time to <30 minutes by removing long-running ASV tasks from PR path
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
name: Benchmark Regression (Scheduled)
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Run benchmark regression nightly at 2 AM UTC
|
||||
- cron: "0 2 * * *"
|
||||
workflow_dispatch:
|
||||
# Allow manual trigger for ad-hoc benchmark validation
|
||||
inputs:
|
||||
base_sha:
|
||||
description: "Base commit SHA for regression comparison (default: master)"
|
||||
required: false
|
||||
default: "master"
|
||||
|
||||
env:
|
||||
UV_VERSION: "0.8.0"
|
||||
PYTHON_VERSION: "3.13"
|
||||
NOX_DEFAULT_VENV_BACKEND: "uv"
|
||||
|
||||
jobs:
|
||||
benchmark-regression:
|
||||
runs-on: docker
|
||||
timeout-minutes: 180
|
||||
container:
|
||||
image: python:3.13-slim
|
||||
steps:
|
||||
- name: Install system dependencies (nodejs for checkout, git for full history)
|
||||
run: |
|
||||
apt-get update && apt-get install -y -qq nodejs git && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
# Fetch full history for ASV regression comparison
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install uv and nox
|
||||
run: |
|
||||
pip install -q uv==${{ env.UV_VERSION }} nox
|
||||
|
||||
- name: Cache uv packages
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.cache/uv
|
||||
key: uv-${{ hashFiles('pyproject.toml') }}
|
||||
restore-keys: |
|
||||
uv-
|
||||
|
||||
- name: Run benchmark regression via nox
|
||||
run: |
|
||||
mkdir -p build
|
||||
nox -s benchmark_regression 2>&1 | tee build/nox-benchmark-regression-output.log
|
||||
env:
|
||||
NOX_DEFAULT_VENV_BACKEND: uv
|
||||
# Base SHA for regression comparison (from workflow input or default to master)
|
||||
ASV_BASE_SHA: ${{ github.event.inputs.base_sha || 'master' }}
|
||||
# AWS credentials for S3 benchmark storage
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
|
||||
ASV_S3_BUCKET: ${{ secrets.ASV_S3_BUCKET }}
|
||||
|
||||
- name: Upload benchmark regression log artifact
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: benchmark-regression-logs
|
||||
path: build/nox-benchmark-regression-output.log
|
||||
retention-days: 90
|
||||
|
||||
- name: Upload ASV results
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: asv-results
|
||||
path: asv/results/
|
||||
retention-days: 90
|
||||
|
||||
benchmark-publish:
|
||||
# Publish full benchmark results on a separate schedule (weekly)
|
||||
if: github.event_name == 'schedule' && github.event.schedule == '0 3 * * 0'
|
||||
runs-on: docker
|
||||
timeout-minutes: 120
|
||||
container:
|
||||
image: python:3.13-slim
|
||||
steps:
|
||||
- name: Install system dependencies (nodejs for checkout, git for full history)
|
||||
run: |
|
||||
apt-get update && apt-get install -y -qq nodejs git && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install uv and nox
|
||||
run: |
|
||||
pip install -q uv==${{ env.UV_VERSION }} nox
|
||||
|
||||
- name: Cache uv packages
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.cache/uv
|
||||
key: uv-${{ hashFiles('pyproject.toml') }}
|
||||
restore-keys: |
|
||||
uv-
|
||||
|
||||
- name: Run full benchmark suite via nox
|
||||
run: |
|
||||
mkdir -p build
|
||||
nox -s benchmark 2>&1 | tee build/nox-benchmark-output.log
|
||||
env:
|
||||
NOX_DEFAULT_VENV_BACKEND: uv
|
||||
# AWS credentials for S3 benchmark storage
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
|
||||
ASV_S3_BUCKET: ${{ secrets.ASV_S3_BUCKET }}
|
||||
|
||||
- name: Upload benchmark log artifact
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: benchmark-logs
|
||||
path: build/nox-benchmark-output.log
|
||||
retention-days: 90
|
||||
|
||||
- name: Upload ASV results
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: asv-results-weekly
|
||||
path: asv/results/
|
||||
retention-days: 90
|
||||
@@ -147,11 +147,14 @@ PR template at `.forgejo/pull_request_template.md` in the repository root):
|
||||
|
||||
| Workflow | File | Trigger | Purpose |
|
||||
|----------|------|---------|---------|
|
||||
| CI | `.forgejo/workflows/ci.yml` | Push to `master`/`develop`, PRs to `master` | Full nox-based validation pipeline |
|
||||
| CI | `.forgejo/workflows/ci.yml` | Push to `master`/`develop`, PRs to `master` | Full nox-based validation pipeline (excludes benchmarks) |
|
||||
| Nightly Quality | `.forgejo/workflows/nightly-quality.yml` | Midnight UTC (cron), manual | Comprehensive quality monitoring |
|
||||
| Benchmark Regression | `.forgejo/workflows/benchmark-scheduled.yml` | 2 AM UTC (cron), manual dispatch | Scheduled ASV benchmark regression tests and weekly full benchmark suite |
|
||||
|
||||
### CI Job Dependency Graph
|
||||
|
||||
**PR Validation Pipeline (ci.yml):**
|
||||
|
||||
```
|
||||
lint ──────────────────┐
|
||||
typecheck ─────────────┤
|
||||
@@ -165,6 +168,13 @@ build ──────────────────── (independent)
|
||||
push-validation ────────── (independent — validates CI push credentials)
|
||||
```
|
||||
|
||||
**Benchmark Pipeline (benchmark-scheduled.yml):**
|
||||
|
||||
```
|
||||
benchmark-regression ──────── (nightly at 2 AM UTC, or manual dispatch)
|
||||
benchmark-publish ─────────── (weekly at 3 AM UTC on Sundays, or manual dispatch)
|
||||
```
|
||||
|
||||
### Nox-Based CI
|
||||
|
||||
All CI jobs now run their checks through nox sessions rather than invoking
|
||||
@@ -201,13 +211,46 @@ The nightly workflow provides trend data beyond PR-level checks:
|
||||
Reports are uploaded as artifacts under `nightly-quality-reports` and can be
|
||||
downloaded from the Forgejo Actions UI.
|
||||
|
||||
### Benchmark Regression Testing
|
||||
|
||||
The benchmark regression workflow runs on a separate schedule to avoid blocking
|
||||
PR feedback. This workflow:
|
||||
|
||||
- **Nightly regression tests** (2 AM UTC): Runs `nox -s benchmark_regression` to
|
||||
compare performance against the `master` branch. Detects performance regressions
|
||||
> 50% (configurable via `--factor` in the workflow).
|
||||
- **Weekly full benchmarks** (3 AM UTC Sundays): Runs `nox -s benchmark` to
|
||||
publish complete benchmark results to S3 for trend analysis.
|
||||
- **Manual dispatch**: Both jobs can be triggered manually via the Forgejo UI
|
||||
with optional `base_sha` parameter for custom regression comparisons.
|
||||
|
||||
**Why benchmarks are separate:**
|
||||
|
||||
1. **Developer experience**: PR feedback completes in <30 minutes instead of
|
||||
99-132 minutes when benchmarks are included.
|
||||
2. **Resource efficiency**: Benchmarks require full-history checkout, S3 sync,
|
||||
and long-running ASV tasks that don't provide immediate validation for most
|
||||
code changes.
|
||||
3. **Trend analysis**: Scheduled benchmarks provide historical data for
|
||||
performance tracking without blocking every PR.
|
||||
|
||||
**Triggering benchmarks manually:**
|
||||
|
||||
```bash
|
||||
# Via Forgejo UI: Actions > Benchmark Regression > Run workflow
|
||||
# Or via gh CLI:
|
||||
gh workflow run benchmark-scheduled.yml \
|
||||
-f base_sha=master \
|
||||
-R cleveragents/cleveragents-core
|
||||
```
|
||||
|
||||
## Local Development Workflow
|
||||
|
||||
### Before Pushing a PR
|
||||
|
||||
```bash
|
||||
# Quick validation (runs default nox sessions: lint, format, typecheck,
|
||||
# unit_tests, integration_tests, docs, build, benchmark, coverage_report)
|
||||
# unit_tests, integration_tests, docs, build, coverage_report)
|
||||
nox
|
||||
|
||||
# Or run individual checks matching CI jobs
|
||||
|
||||
Reference in New Issue
Block a user