98 lines
3.0 KiB
YAML
98 lines
3.0 KiB
YAML
name: Performance Comparison for Pull Requests
|
|
|
|
on:
|
|
pull_request:
|
|
branches: [master]
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
|
|
jobs:
|
|
benchmark-pr:
|
|
name: Performance benchmark comparison
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout PR branch
|
|
uses: actions/checkout@v4
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha }}
|
|
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v5
|
|
with:
|
|
go-version: 'stable'
|
|
|
|
# Save commit SHAs for display
|
|
- name: Save commit info
|
|
id: commits
|
|
run: |
|
|
BASE_SHA="${{ github.event.pull_request.base.sha }}"
|
|
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
|
|
echo "base_short=${BASE_SHA:0:7}" >> $GITHUB_OUTPUT
|
|
echo "head_short=${HEAD_SHA:0:7}" >> $GITHUB_OUTPUT
|
|
|
|
# Run benchmark on PR branch
|
|
- name: Run benchmark on PR branch
|
|
run: |
|
|
go test -bench '.' -benchtime=2s -benchmem ./... | tee pr-bench.txt
|
|
|
|
# Checkout base branch and run benchmark
|
|
- name: Checkout base branch
|
|
uses: actions/checkout@v4
|
|
with:
|
|
ref: ${{ github.event.pull_request.base.sha }}
|
|
clean: false
|
|
path: base
|
|
|
|
- name: Run benchmark on base branch
|
|
working-directory: base
|
|
run: |
|
|
go test -bench '.' -benchtime=2s -benchmem ./... | \
|
|
tee ../base-bench.txt
|
|
|
|
# Install benchstat for comparison
|
|
- name: Install benchstat
|
|
run: go install golang.org/x/perf/cmd/benchstat@latest
|
|
|
|
# Compare benchmarks using benchstat
|
|
- name: Compare benchmarks with benchstat
|
|
id: benchstat
|
|
run: |
|
|
cat > comparison.md << 'EOF'
|
|
## Benchmark Comparison
|
|
|
|
Comparing base branch (`${{ steps.commits.outputs.base_short }}`)
|
|
vs PR branch (`${{ steps.commits.outputs.head_short }}`)
|
|
|
|
```
|
|
EOF
|
|
benchstat base-bench.txt pr-bench.txt >> comparison.md || true
|
|
echo '```' >> comparison.md
|
|
|
|
# Post-process to append percentage + emoji column (🚀 faster < -10%, 🐌 slower > +10%, otherwise ➡️)
|
|
if [ ! -f comparison.md ]; then
|
|
echo "comparison.md not found after benchstat." >&2
|
|
exit 1
|
|
fi
|
|
python3 .github/scripts/benchmark_formatter.py
|
|
|
|
# Save PR number
|
|
- name: Save PR number
|
|
run: |
|
|
PR_NUMBER="${{ github.event.pull_request.number }}"
|
|
if [ -z "$PR_NUMBER" ]; then
|
|
echo "Error: Pull request number is not available in event payload." >&2
|
|
exit 1
|
|
fi
|
|
echo "$PR_NUMBER" > pr_number.txt
|
|
|
|
# Upload benchmark results
|
|
- name: Upload benchmark results
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: benchmark-results
|
|
path: |
|
|
comparison.md
|
|
pr_number.txt
|