Skip to content

fix: ensure workspace environments are found when searchKind is provided #46

fix: ensure workspace environments are found when searchKind is provided

fix: ensure workspace environments are found when searchKind is provided #46

Workflow file for this run

name: Performance Tests
on:
pull_request:
branches:
- main
- release*
- release/*
- release-*
workflow_dispatch:
permissions:
actions: read
contents: read
pull-requests: write
jobs:
performance:
name: E2E Performance Tests
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
target: x86_64-pc-windows-msvc
- os: ubuntu-latest
target: x86_64-unknown-linux-musl
- os: macos-latest
target: x86_64-apple-darwin
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Post In-Progress Comment (Linux)
if: startsWith(matrix.os, 'ubuntu') && github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2
with:
header: perf-linux
message: |
## Performance Report (Linux) :hourglass_flowing_sand:
Running performance tests... Results will appear here when complete.
- name: Post In-Progress Comment (Windows)
if: startsWith(matrix.os, 'windows') && github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2
with:
header: perf-windows
message: |
## Performance Report (Windows) :hourglass_flowing_sand:
Running performance tests... Results will appear here when complete.
- name: Post In-Progress Comment (macOS)
if: startsWith(matrix.os, 'macos') && github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2
with:
header: perf-macos
message: |
## Performance Report (macOS) :hourglass_flowing_sand:
Running performance tests... Results will appear here when complete.
- name: Set Python to PATH
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Add Conda to PATH (Windows)
if: startsWith(matrix.os, 'windows')
run: |
$path = $env:PATH + ";" + $env:CONDA + "\condabin"
echo "PATH=$path" >> $env:GITHUB_ENV
- name: Add Conda to PATH (Ubuntu)
if: startsWith(matrix.os, 'ubuntu')
run: echo "PATH=$PATH:$CONDA/condabin" >> $GITHUB_ENV
shell: bash
- name: Install Conda + add to PATH (macOS)
if: startsWith(matrix.os, 'macos')
run: |
curl -o ~/miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
bash ~/miniconda.sh -b -p ~/miniconda
echo "PATH=$PATH:$HOME/miniconda/bin" >> $GITHUB_ENV
echo "CONDA=$HOME/miniconda" >> $GITHUB_ENV
shell: bash
- name: Create test Conda environment
run: conda create -n perf-test-env python=3.12 -y
- name: Create test venv
run: python -m venv .venv
shell: bash
- name: Rust Tool Chain setup
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
targets: ${{ matrix.target }}
- name: Cargo Fetch
run: cargo fetch
shell: bash
- name: Build Release
run: cargo build --release --target ${{ matrix.target }}
shell: bash
- name: Run Performance Tests
continue-on-error: true
run: cargo test --release --features ci-perf --target ${{ matrix.target }} --test e2e_performance test_performance_summary -- --nocapture 2>&1 | tee perf-output.txt
env:
RUST_BACKTRACE: 1
RUST_LOG: warn
shell: bash
- name: Extract Performance Metrics
id: metrics
run: |
# Extract JSON metrics from test output
if grep -q "JSON metrics:" perf-output.txt; then
# Extract lines after "JSON metrics:" until the closing brace
sed -n '/JSON metrics:/,/^}/p' perf-output.txt | tail -n +2 > metrics.json
echo "Metrics extracted:"
cat metrics.json
else
echo '{"server_startup_ms": 0, "full_refresh_ms": 0, "environments_count": 0}' > metrics.json
echo "No metrics found, created empty metrics"
fi
shell: bash
- name: Upload PR Performance Results
uses: actions/upload-artifact@v4
with:
name: perf-pr-${{ matrix.os }}
path: metrics.json
- name: Download Baseline Performance
uses: dawidd6/action-download-artifact@v6
id: download-baseline
continue-on-error: true
with:
workflow: perf-baseline.yml
branch: main
name: perf-baseline-${{ matrix.os }}
path: baseline-perf
- name: Generate Performance Report (Linux)
if: startsWith(matrix.os, 'ubuntu')
id: perf-linux
run: |
# Extract PR metrics (P50 values at top level for backwards compatibility)
PR_STARTUP=$(jq -r '.server_startup_ms // 0' metrics.json)
PR_REFRESH=$(jq -r '.full_refresh_ms // 0' metrics.json)
PR_ENVS=$(jq -r '.environments_count // 0' metrics.json)
# Extract P95 values from stats object (if available)
PR_STARTUP_P95=$(jq -r '.stats.server_startup.p95 // .server_startup_ms // 0' metrics.json)
PR_REFRESH_P95=$(jq -r '.stats.full_refresh.p95 // .full_refresh_ms // 0' metrics.json)
# Extract baseline metrics (default to 0 if not available)
if [ -f baseline-perf/metrics.json ]; then
BASELINE_STARTUP=$(jq -r '.server_startup_ms // 0' baseline-perf/metrics.json)
BASELINE_REFRESH=$(jq -r '.full_refresh_ms // 0' baseline-perf/metrics.json)
BASELINE_ENVS=$(jq -r '.environments_count // 0' baseline-perf/metrics.json)
BASELINE_STARTUP_P95=$(jq -r '.stats.server_startup.p95 // .server_startup_ms // 0' baseline-perf/metrics.json)
BASELINE_REFRESH_P95=$(jq -r '.stats.full_refresh.p95 // .full_refresh_ms // 0' baseline-perf/metrics.json)
else
BASELINE_STARTUP=0
BASELINE_REFRESH=0
BASELINE_ENVS=0
BASELINE_STARTUP_P95=0
BASELINE_REFRESH_P95=0
fi
# Calculate diff (positive means slowdown, negative means speedup)
STARTUP_DIFF=$(echo "$PR_STARTUP - $BASELINE_STARTUP" | bc)
REFRESH_DIFF=$(echo "$PR_REFRESH - $BASELINE_REFRESH" | bc)
# Calculate percentage change
if [ "$BASELINE_STARTUP" != "0" ]; then
STARTUP_PCT=$(echo "scale=1; ($STARTUP_DIFF / $BASELINE_STARTUP) * 100" | bc)
else
STARTUP_PCT="N/A"
fi
if [ "$BASELINE_REFRESH" != "0" ]; then
REFRESH_PCT=$(echo "scale=1; ($REFRESH_DIFF / $BASELINE_REFRESH) * 100" | bc)
else
REFRESH_PCT="N/A"
fi
# Determine delta indicators (for perf, negative is good = faster)
if (( $(echo "$REFRESH_DIFF < -100" | bc -l) )); then
DELTA_INDICATOR=":rocket:"
elif (( $(echo "$REFRESH_DIFF < 0" | bc -l) )); then
DELTA_INDICATOR=":white_check_mark:"
elif (( $(echo "$REFRESH_DIFF > 500" | bc -l) )); then
DELTA_INDICATOR=":warning:"
elif (( $(echo "$REFRESH_DIFF > 100" | bc -l) )); then
DELTA_INDICATOR=":small_red_triangle:"
else
DELTA_INDICATOR=":heavy_minus_sign:"
fi
# Set outputs
echo "pr_startup=$PR_STARTUP" >> $GITHUB_OUTPUT
echo "pr_refresh=$PR_REFRESH" >> $GITHUB_OUTPUT
echo "pr_startup_p95=$PR_STARTUP_P95" >> $GITHUB_OUTPUT
echo "pr_refresh_p95=$PR_REFRESH_P95" >> $GITHUB_OUTPUT
echo "baseline_startup=$BASELINE_STARTUP" >> $GITHUB_OUTPUT
echo "baseline_refresh=$BASELINE_REFRESH" >> $GITHUB_OUTPUT
echo "baseline_startup_p95=$BASELINE_STARTUP_P95" >> $GITHUB_OUTPUT
echo "baseline_refresh_p95=$BASELINE_REFRESH_P95" >> $GITHUB_OUTPUT
echo "startup_diff=$STARTUP_DIFF" >> $GITHUB_OUTPUT
echo "refresh_diff=$REFRESH_DIFF" >> $GITHUB_OUTPUT
echo "startup_pct=$STARTUP_PCT" >> $GITHUB_OUTPUT
echo "refresh_pct=$REFRESH_PCT" >> $GITHUB_OUTPUT
echo "delta_indicator=$DELTA_INDICATOR" >> $GITHUB_OUTPUT
# Write step summary
echo "## Performance Report (Linux)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Metric | PR (P50) | PR (P95) | Baseline (P50) | Delta | Change |" >> $GITHUB_STEP_SUMMARY
echo "|--------|----------|----------|----------------|-------|--------|" >> $GITHUB_STEP_SUMMARY
echo "| Server Startup | ${PR_STARTUP}ms | ${PR_STARTUP_P95}ms | ${BASELINE_STARTUP}ms | ${STARTUP_DIFF}ms | ${STARTUP_PCT}% |" >> $GITHUB_STEP_SUMMARY
echo "| Full Refresh | ${PR_REFRESH}ms | ${PR_REFRESH_P95}ms | ${BASELINE_REFRESH}ms | ${REFRESH_DIFF}ms | ${REFRESH_PCT}% ${DELTA_INDICATOR} |" >> $GITHUB_STEP_SUMMARY
echo "| Environments | ${PR_ENVS} | - | ${BASELINE_ENVS} | - | - |" >> $GITHUB_STEP_SUMMARY
shell: bash
- name: Generate Performance Report (Windows)
if: startsWith(matrix.os, 'windows')
id: perf-windows
run: |
# Extract PR metrics (P50 values at top level for backwards compatibility)
$prMetrics = Get-Content -Path "metrics.json" -Raw | ConvertFrom-Json
$prStartup = $prMetrics.server_startup_ms
$prRefresh = $prMetrics.full_refresh_ms
$prEnvs = $prMetrics.environments_count
# Extract P95 values from stats object (if available)
$prStartupP95 = if ($prMetrics.stats.server_startup.p95) { $prMetrics.stats.server_startup.p95 } else { $prStartup }
$prRefreshP95 = if ($prMetrics.stats.full_refresh.p95) { $prMetrics.stats.full_refresh.p95 } else { $prRefresh }
# Extract baseline metrics (default to 0 if not available)
if (Test-Path "baseline-perf/metrics.json") {
$baselineMetrics = Get-Content -Path "baseline-perf/metrics.json" -Raw | ConvertFrom-Json
$baselineStartup = $baselineMetrics.server_startup_ms
$baselineRefresh = $baselineMetrics.full_refresh_ms
$baselineEnvs = $baselineMetrics.environments_count
$baselineStartupP95 = if ($baselineMetrics.stats.server_startup.p95) { $baselineMetrics.stats.server_startup.p95 } else { $baselineStartup }
$baselineRefreshP95 = if ($baselineMetrics.stats.full_refresh.p95) { $baselineMetrics.stats.full_refresh.p95 } else { $baselineRefresh }
} else {
$baselineStartup = 0
$baselineRefresh = 0
$baselineEnvs = 0
$baselineStartupP95 = 0
$baselineRefreshP95 = 0
}
# Calculate diff
$startupDiff = $prStartup - $baselineStartup
$refreshDiff = $prRefresh - $baselineRefresh
# Calculate percentage change
if ($baselineStartup -gt 0) {
$startupPct = [math]::Round(($startupDiff / $baselineStartup) * 100, 1)
} else {
$startupPct = "N/A"
}
if ($baselineRefresh -gt 0) {
$refreshPct = [math]::Round(($refreshDiff / $baselineRefresh) * 100, 1)
} else {
$refreshPct = "N/A"
}
# Determine delta indicator
if ($refreshDiff -lt -100) {
$deltaIndicator = ":rocket:"
} elseif ($refreshDiff -lt 0) {
$deltaIndicator = ":white_check_mark:"
} elseif ($refreshDiff -gt 500) {
$deltaIndicator = ":warning:"
} elseif ($refreshDiff -gt 100) {
$deltaIndicator = ":small_red_triangle:"
} else {
$deltaIndicator = ":heavy_minus_sign:"
}
# Set outputs
echo "pr_startup=$prStartup" >> $env:GITHUB_OUTPUT
echo "pr_refresh=$prRefresh" >> $env:GITHUB_OUTPUT
echo "pr_startup_p95=$prStartupP95" >> $env:GITHUB_OUTPUT
echo "pr_refresh_p95=$prRefreshP95" >> $env:GITHUB_OUTPUT
echo "baseline_startup=$baselineStartup" >> $env:GITHUB_OUTPUT
echo "baseline_refresh=$baselineRefresh" >> $env:GITHUB_OUTPUT
echo "baseline_startup_p95=$baselineStartupP95" >> $env:GITHUB_OUTPUT
echo "baseline_refresh_p95=$baselineRefreshP95" >> $env:GITHUB_OUTPUT
echo "startup_diff=$startupDiff" >> $env:GITHUB_OUTPUT
echo "refresh_diff=$refreshDiff" >> $env:GITHUB_OUTPUT
echo "startup_pct=$startupPct" >> $env:GITHUB_OUTPUT
echo "refresh_pct=$refreshPct" >> $env:GITHUB_OUTPUT
echo "delta_indicator=$deltaIndicator" >> $env:GITHUB_OUTPUT
# Write step summary
echo "## Performance Report (Windows)" >> $env:GITHUB_STEP_SUMMARY
echo "" >> $env:GITHUB_STEP_SUMMARY
echo "| Metric | PR (P50) | PR (P95) | Baseline (P50) | Delta | Change |" >> $env:GITHUB_STEP_SUMMARY
echo "|--------|----------|----------|----------------|-------|--------|" >> $env:GITHUB_STEP_SUMMARY
echo "| Server Startup | ${prStartup}ms | ${prStartupP95}ms | ${baselineStartup}ms | ${startupDiff}ms | ${startupPct}% |" >> $env:GITHUB_STEP_SUMMARY
echo "| Full Refresh | ${prRefresh}ms | ${prRefreshP95}ms | ${baselineRefresh}ms | ${refreshDiff}ms | ${refreshPct}% ${deltaIndicator} |" >> $env:GITHUB_STEP_SUMMARY
echo "| Environments | ${prEnvs} | - | ${baselineEnvs} | - | - |" >> $env:GITHUB_STEP_SUMMARY
shell: pwsh
- name: Generate Performance Report (macOS)
if: startsWith(matrix.os, 'macos')
id: perf-macos
run: |
# Extract PR metrics (P50 values at top level for backwards compatibility)
PR_STARTUP=$(jq -r '.server_startup_ms // 0' metrics.json)
PR_REFRESH=$(jq -r '.full_refresh_ms // 0' metrics.json)
PR_ENVS=$(jq -r '.environments_count // 0' metrics.json)
# Extract P95 values from stats object (if available)
PR_STARTUP_P95=$(jq -r '.stats.server_startup.p95 // .server_startup_ms // 0' metrics.json)
PR_REFRESH_P95=$(jq -r '.stats.full_refresh.p95 // .full_refresh_ms // 0' metrics.json)
# Extract baseline metrics (default to 0 if not available)
if [ -f baseline-perf/metrics.json ]; then
BASELINE_STARTUP=$(jq -r '.server_startup_ms // 0' baseline-perf/metrics.json)
BASELINE_REFRESH=$(jq -r '.full_refresh_ms // 0' baseline-perf/metrics.json)
BASELINE_ENVS=$(jq -r '.environments_count // 0' baseline-perf/metrics.json)
BASELINE_STARTUP_P95=$(jq -r '.stats.server_startup.p95 // .server_startup_ms // 0' baseline-perf/metrics.json)
BASELINE_REFRESH_P95=$(jq -r '.stats.full_refresh.p95 // .full_refresh_ms // 0' baseline-perf/metrics.json)
else
BASELINE_STARTUP=0
BASELINE_REFRESH=0
BASELINE_ENVS=0
BASELINE_STARTUP_P95=0
BASELINE_REFRESH_P95=0
fi
# Calculate diff
STARTUP_DIFF=$((PR_STARTUP - BASELINE_STARTUP))
REFRESH_DIFF=$((PR_REFRESH - BASELINE_REFRESH))
# Set outputs
echo "pr_startup=$PR_STARTUP" >> $GITHUB_OUTPUT
echo "pr_refresh=$PR_REFRESH" >> $GITHUB_OUTPUT
echo "pr_startup_p95=$PR_STARTUP_P95" >> $GITHUB_OUTPUT
echo "pr_refresh_p95=$PR_REFRESH_P95" >> $GITHUB_OUTPUT
echo "baseline_startup=$BASELINE_STARTUP" >> $GITHUB_OUTPUT
echo "baseline_refresh=$BASELINE_REFRESH" >> $GITHUB_OUTPUT
echo "baseline_startup_p95=$BASELINE_STARTUP_P95" >> $GITHUB_OUTPUT
echo "baseline_refresh_p95=$BASELINE_REFRESH_P95" >> $GITHUB_OUTPUT
echo "startup_diff=$STARTUP_DIFF" >> $GITHUB_OUTPUT
echo "refresh_diff=$REFRESH_DIFF" >> $GITHUB_OUTPUT
# Write step summary
echo "## Performance Report (macOS)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Metric | PR (P50) | PR (P95) | Baseline (P50) | Delta |" >> $GITHUB_STEP_SUMMARY
echo "|--------|----------|----------|----------------|-------|" >> $GITHUB_STEP_SUMMARY
echo "| Server Startup | ${PR_STARTUP}ms | ${PR_STARTUP_P95}ms | ${BASELINE_STARTUP}ms | ${STARTUP_DIFF}ms |" >> $GITHUB_STEP_SUMMARY
echo "| Full Refresh | ${PR_REFRESH}ms | ${PR_REFRESH_P95}ms | ${BASELINE_REFRESH}ms | ${REFRESH_DIFF}ms |" >> $GITHUB_STEP_SUMMARY
echo "| Environments | ${PR_ENVS} | - | ${BASELINE_ENVS} | - |" >> $GITHUB_STEP_SUMMARY
shell: bash
- name: Post Performance Comment (Linux)
if: startsWith(matrix.os, 'ubuntu') && github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2
with:
header: perf-linux
message: |
## Performance Report (Linux) ${{ steps.perf-linux.outputs.delta_indicator }}
| Metric | PR (P50) | PR (P95) | Baseline (P50) | Delta | Change |
|--------|----------|----------|----------------|-------|--------|
| Server Startup | ${{ steps.perf-linux.outputs.pr_startup }}ms | ${{ steps.perf-linux.outputs.pr_startup_p95 }}ms | ${{ steps.perf-linux.outputs.baseline_startup }}ms | ${{ steps.perf-linux.outputs.startup_diff }}ms | ${{ steps.perf-linux.outputs.startup_pct }}% |
| Full Refresh | ${{ steps.perf-linux.outputs.pr_refresh }}ms | ${{ steps.perf-linux.outputs.pr_refresh_p95 }}ms | ${{ steps.perf-linux.outputs.baseline_refresh }}ms | ${{ steps.perf-linux.outputs.refresh_diff }}ms | ${{ steps.perf-linux.outputs.refresh_pct }}% |
> Results based on 10 iterations. P50 = median, P95 = 95th percentile.
---
<details>
<summary>Legend</summary>
- :rocket: Significant speedup (>100ms faster)
- :white_check_mark: Faster than baseline
- :heavy_minus_sign: No significant change
- :small_red_triangle: Slower than baseline (>100ms)
- :warning: Significant slowdown (>500ms)
</details>
- name: Post Performance Comment (Windows)
if: startsWith(matrix.os, 'windows') && github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2
with:
header: perf-windows
message: |
## Performance Report (Windows) ${{ steps.perf-windows.outputs.delta_indicator }}
| Metric | PR (P50) | PR (P95) | Baseline (P50) | Delta | Change |
|--------|----------|----------|----------------|-------|--------|
| Server Startup | ${{ steps.perf-windows.outputs.pr_startup }}ms | ${{ steps.perf-windows.outputs.pr_startup_p95 }}ms | ${{ steps.perf-windows.outputs.baseline_startup }}ms | ${{ steps.perf-windows.outputs.startup_diff }}ms | ${{ steps.perf-windows.outputs.startup_pct }}% |
| Full Refresh | ${{ steps.perf-windows.outputs.pr_refresh }}ms | ${{ steps.perf-windows.outputs.pr_refresh_p95 }}ms | ${{ steps.perf-windows.outputs.baseline_refresh }}ms | ${{ steps.perf-windows.outputs.refresh_diff }}ms | ${{ steps.perf-windows.outputs.refresh_pct }}% |
> Results based on 10 iterations. P50 = median, P95 = 95th percentile.
---
<details>
<summary>Legend</summary>
- :rocket: Significant speedup (>100ms faster)
- :white_check_mark: Faster than baseline
- :heavy_minus_sign: No significant change
- :small_red_triangle: Slower than baseline (>100ms)
- :warning: Significant slowdown (>500ms)
</details>
- name: Post Performance Comment (macOS)
if: startsWith(matrix.os, 'macos') && github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2
with:
header: perf-macos
message: |
## Performance Report (macOS)
| Metric | PR (P50) | PR (P95) | Baseline (P50) | Delta |
|--------|----------|----------|----------------|-------|
| Server Startup | ${{ steps.perf-macos.outputs.pr_startup }}ms | ${{ steps.perf-macos.outputs.pr_startup_p95 }}ms | ${{ steps.perf-macos.outputs.baseline_startup }}ms | ${{ steps.perf-macos.outputs.startup_diff }}ms |
| Full Refresh | ${{ steps.perf-macos.outputs.pr_refresh }}ms | ${{ steps.perf-macos.outputs.pr_refresh_p95 }}ms | ${{ steps.perf-macos.outputs.baseline_refresh }}ms | ${{ steps.perf-macos.outputs.refresh_diff }}ms |
> Results based on 10 iterations. P50 = median, P95 = 95th percentile.
---
<details>
<summary>Legend</summary>
- :rocket: Significant speedup (>100ms faster)
- :white_check_mark: Faster than baseline
- :heavy_minus_sign: No significant change
- :small_red_triangle: Slower than baseline (>100ms)
- :warning: Significant slowdown (>500ms)
</details>