name: CI on: push: branches: [master, develop] pull_request: branches: [master, develop] vars: docker_prefix: "http://harbor.cleverthis.com/docker/" env: UV_VERSION: "0.8.0" PYTHON_VERSION: "3.13" NOX_DEFAULT_VENV_BACKEND: "uv" jobs: benchmark-publish: if: forgejo.event_name == 'push' runs-on: docker-benchmark container: ${{vars.docker_prefix}}python:3.13-slim steps: - name: Install system dependencies (nodejs for checkout, git for merge tests) run: | apt-get update && apt-get install -y -qq nodejs git && rm -rf /var/lib/apt/lists/* - name: Checkout full history uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install dependencies run: | python -m pip install -U pip python -m pip install asv virtualenv uv==${{ env.UV_VERSION }} nox - name: Restore prior ASV benchmarks env: 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 }} run: | python -m pip install awscli mkdir -p build/asv/results aws s3 sync "s3://${ASV_S3_BUCKET}/asv/results" build/asv/results --delete || true - name: Run asv via nox run: | nox -s benchmark - name: Upload updated benchmarks and website to S3 env: 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 }} run: | python -m pip install awscli aws s3 sync build/asv/results "s3://${ASV_S3_BUCKET}/asv/results" --delete aws s3 sync build/asv/html "s3://${ASV_S3_BUCKET}/asv/html" --delete - name: Archive the results run: | tar cf /tmp/asv-results.tar build/asv/results build/asv/html - name: Upload benchmark artifacts if: always() uses: actions/upload-artifact@v3 with: name: asv-results-pr path: /tmp/asv-results.tar retention-days: 30 benchmark-regression: # Runs benchmark regression on pull requests to detect performance regressions. # This job is informational only — it is NOT listed in status-check's required # needs, so a benchmark regression does not block PR merges. if: forgejo.event_name == 'pull_request' runs-on: docker-benchmark container: ${{vars.docker_prefix}}python:3.13-slim steps: - name: Install system dependencies (nodejs for checkout, git for ASV) run: | apt-get update && apt-get install -y -qq nodejs git curl && rm -rf /var/lib/apt/lists/* - name: Checkout full history uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install dependencies run: | python -m pip install -U pip python -m pip install asv virtualenv uv==${{ env.UV_VERSION }} nox - name: Sync prior benchmark results from S3 env: 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 }} run: | if [ -n "${AWS_ACCESS_KEY_ID}" ] && [ -n "${ASV_S3_BUCKET}" ]; then python -m pip install awscli mkdir -p build/asv/results aws s3 sync "s3://${ASV_S3_BUCKET}/asv/results/" build/asv/results/ || echo "No existing results to sync" else echo "Skipping S3 sync - AWS credentials not configured" fi - name: Run benchmark regression via nox env: NOX_DEFAULT_VENV_BACKEND: uv ASV_BASE_SHA: master run: | mkdir -p build nox -s benchmark_regression 2>&1 | tee build/nox-benchmark-regression-output.log - 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: 30