-
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Try to move benchmark CI to this repo
- Loading branch information
Showing
1 changed file
with
175 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,175 @@ | ||
name: benchmark | ||
on: | ||
workflow_dispatch: | ||
pull_request_review: | ||
types: [submitted] | ||
pull_request: | ||
branches: [main] | ||
types: [synchronize] | ||
paths: | ||
- Sources/*.swift | ||
- Benchmarks/ | ||
- .github/workflows/benchmark.yml | ||
|
||
jobs: | ||
benchmark-vs-thresholds: | ||
# Run the job only if it's a manual workflow dispatch, or if this event is a pull-request approval event, or if someone has rerun the job. | ||
if: github.event_name == 'workflow_dispatch' || github.event.review.state == 'approved' || github.run_attempt > 1 | ||
|
||
# https://runs-on.com/features/custom-runners/ | ||
runs-on: | ||
labels: | ||
- runs-on | ||
- runner=2cpu-4ram | ||
- run-id=${{ github.run_id }} | ||
|
||
container: swift:noble | ||
|
||
defaults: | ||
run: | ||
shell: bash --noprofile --norc -e -u -o pipefail {0} | ||
|
||
env: | ||
PR_COMMENT: null # will be populated later | ||
|
||
steps: | ||
- name: Configure RunsOn | ||
uses: runs-on/action@v1 | ||
|
||
- name: Check out code | ||
uses: actions/checkout@v4 | ||
with: | ||
fetch-depth: 0 | ||
|
||
- name: Configure git | ||
run: git config --global --add safe.directory "${GITHUB_WORKSPACE}" | ||
|
||
# jemalloc is a dependency of the Benchmarking package | ||
# actions/cache will detect zstd and will become much faster. | ||
- name: Install jemalloc, curl, jq and zstd | ||
run: | | ||
apt-get update -y | ||
apt-get install -y libjemalloc-dev curl jq zstd | ||
- name: Restore .build | ||
id: restore-cache | ||
uses: actions/cache/restore@v4 | ||
with: | ||
path: Benchmarks/.build | ||
key: "swiftpm-benchmark-build-${{ runner.os }}-${{ github.event.pull_request.base.sha || github.event.after }}" | ||
restore-keys: "swiftpm-benchmark-build-${{ runner.os }}-" | ||
|
||
- name: Run benchmarks for branch '${{ github.head_ref || github.ref_name }}' | ||
run: | | ||
swift package -c release --disable-sandbox \ | ||
--package-path Benchmarks \ | ||
benchmark baseline update \ | ||
'${{ github.head_ref || github.ref_name }}' | ||
- name: Read benchmark result | ||
id: read-benchmark | ||
run: | | ||
swift package -c release --disable-sandbox \ | ||
--package-path Benchmarks \ | ||
benchmark baseline read \ | ||
'${{ github.head_ref || github.ref_name }}' \ | ||
--no-progress \ | ||
--format markdown \ | ||
>> result.text | ||
# Read the result to the output of the step | ||
echo 'result<<EOF' >> "${GITHUB_OUTPUT}" | ||
cat result.text >> "${GITHUB_OUTPUT}" | ||
echo 'EOF' >> "${GITHUB_OUTPUT}" | ||
- name: Compare branch '${{ github.head_ref || github.ref_name }}' against thresholds | ||
id: compare-benchmark | ||
run: | | ||
TIMESTAMP=$(date -u +"%Y-%m-%d %H:%M:%S UTC") | ||
ENCODED_TIMESTAMP=$(date -u +"%Y-%m-%dT%H%%3A%M%%3A%SZ") | ||
TIMESTAMP_LINK="https://www.timeanddate.com/worldclock/fixedtime.html?iso=$ENCODED_TIMESTAMP" | ||
echo "## Benchmark check running at [$TIMESTAMP]($TIMESTAMP_LINK)" >> summary.text | ||
# Disable 'set -e' to prevent the script from exiting on non-zero exit codes | ||
set +e | ||
swift package -c release --disable-sandbox \ | ||
--package-path Benchmarks \ | ||
benchmark thresholds check \ | ||
'${{ github.head_ref || github.ref_name }}' \ | ||
--path "$PWD/Benchmarks/Thresholds/" \ | ||
--no-progress \ | ||
--format markdown \ | ||
>> summary.text | ||
echo "exit-status=$?" >> "${GITHUB_OUTPUT}" | ||
set -e | ||
echo 'summary<<EOF' >> "${GITHUB_OUTPUT}" | ||
cat summary.text >> "${GITHUB_OUTPUT}" | ||
echo 'EOF' >> "${GITHUB_OUTPUT}" | ||
- name: Cache .build | ||
if: steps.restore-cache.outputs.cache-hit != 'true' | ||
uses: actions/cache/save@v4 | ||
with: | ||
path: Benchmarks/.build | ||
key: "swiftpm-benchmark-build-${{ runner.os }}-${{ github.event.pull_request.base.sha || github.event.after }}" | ||
|
||
- name: Construct comment | ||
run: | | ||
EXIT_CODE='${{ steps.compare-benchmark.outputs.exit-status }}' | ||
echo 'PR_COMMENT<<EOF' >> "${GITHUB_ENV}" | ||
echo '## [Benchmark](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) Report' >> "${GITHUB_ENV}" | ||
case "${EXIT_CODE}" in | ||
0) | ||
echo '**✅ Pull request has no significant performance differences ✅**' >> "${GITHUB_ENV}" | ||
;; | ||
1) | ||
echo '**❌ Pull request has significant performance differences 📊**' >> "${GITHUB_ENV}" | ||
;; | ||
2) | ||
echo '**❌ Pull request has significant performance regressions 📉**' >> "${GITHUB_ENV}" | ||
;; | ||
4) | ||
echo '**❌ Pull request has significant performance improvements 📈**' >> "${GITHUB_ENV}" | ||
;; | ||
*) | ||
echo '**❌ Benchmark comparison failed to complete properly with exit code $EXIT_CODE ❌**' >> "${GITHUB_ENV}" | ||
;; | ||
esac | ||
echo '<details>' >> "${GITHUB_ENV}" | ||
echo ' <summary> Click to expand comparison result </summary>' >> "${GITHUB_ENV}" | ||
echo '' >> "${GITHUB_ENV}" | ||
echo '${{ steps.compare-benchmark.outputs.summary }}' >> "${GITHUB_ENV}" | ||
echo '' >> "${GITHUB_ENV}" | ||
echo '</details>' >> "${GITHUB_ENV}" | ||
echo '' >> "${GITHUB_ENV}" | ||
echo '<details>' >> "${GITHUB_ENV}" | ||
echo ' <summary> Click to expand benchmark result </summary>' >> "${GITHUB_ENV}" | ||
echo '' >> "${GITHUB_ENV}" | ||
echo '${{ steps.read-benchmark.outputs.result }}' >> "${GITHUB_ENV}" | ||
echo '' >> "${GITHUB_ENV}" | ||
echo '</details>' >> "${GITHUB_ENV}" | ||
echo 'EOF' >> "${GITHUB_ENV}" | ||
- name: Output the comment as job summary | ||
run: echo '${{ env.PR_COMMENT }}' >> "${GITHUB_STEP_SUMMARY}" | ||
|
||
- name: Comment in PR | ||
if: startsWith(github.event_name, 'pull_request') | ||
uses: thollander/actions-comment-pull-request@v3 | ||
with: | ||
message: ${{ env.PR_COMMENT }} | ||
comment-tag: benchmark-ci-comment | ||
|
||
- name: Exit with correct status | ||
run: | | ||
EXIT_CODE='${{ steps.compare-benchmark.outputs.exit-status }}' | ||
echo "Previous exit code was: $EXIT_CODE" | ||
exit $EXIT_CODE |