Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
797ae4c
Add mobench BrowserStack benchmark pipeline
Apr 3, 2026
85e3e79
Wire Browserstack env into mobile bench CI
Apr 3, 2026
5129b19
Add missing iOS simulator Rust target for CI
Apr 3, 2026
1c52323
Install Rust directly in mobile bench workflow
Apr 3, 2026
7d7ab5c
Fix mobile benchmark artifact builds in CI
Apr 4, 2026
27c4af0
Forward BrowserStack secrets to reusable workflow
Apr 4, 2026
1ef658f
Run PR benchmarks via reusable workflow
Apr 4, 2026
852641b
Fix fork mobile benchmark runners
Apr 4, 2026
52e1a5d
Use portable checks in mobile bench install
Apr 4, 2026
d33dbb5
Add bench-mobile UniFFI exports for CI builds
Apr 4, 2026
f85f034
Fix BrowserStack mobile benchmark recovery
Apr 4, 2026
316951f
Serialize Android mobile benchmark scope
Apr 4, 2026
73c340c
Use mobench 0.1.29 release in CI
Apr 5, 2026
ea7f265
Simplify mobench 0.1.29 release install
Apr 5, 2026
541ceae
Fix mobench 0.1.29 install in Android and summary jobs
Apr 7, 2026
9ecee23
Use short prove-only profile for mobile CI
Apr 8, 2026
c14fac5
Fix mobile bench empty-sample CI handling
Apr 9, 2026
6cea0e5
Fix mobench patch application in CI
Apr 9, 2026
3c27dc9
Clarify mobench 0.1.30 upstream requirements
Apr 9, 2026
c61852c
Accept nested mobench summary layout in validation
Apr 9, 2026
927b69e
Fix iOS embedded bench spec path
Apr 9, 2026
8ce085d
Handle nested summary layout in summary job
Apr 9, 2026
e74d28e
Fix iOS mobench spec propagation
Apr 9, 2026
8206aae
Fix mobench install assertions in summary jobs
Apr 9, 2026
ecf9105
Restore iOS mobench resource metrics
Apr 9, 2026
d21f468
Preserve raw iOS peak memory in summaries
Apr 9, 2026
210837a
Add mobench 0.1.30 upgrade agent brief
Apr 10, 2026
b661dd0
Add worst BrowserStack device profile
Apr 11, 2026
03320df
Adjust worst iOS device profile
Apr 11, 2026
7937d66
Use oldest viable iOS worst profile
Apr 11, 2026
931bb7a
Rewrite mobench 0.1.30 upstream brief
Apr 11, 2026
df8cbda
Upgrade mobench to 0.1.30
Apr 11, 2026
33c6219
Adjust mobench device profiles
Apr 11, 2026
7515da0
Use iPhone SE 2020 for worst iOS bench
Apr 11, 2026
5fc783b
Validate mobench CSV resource metrics
Apr 12, 2026
f5e4d58
Use upstream mobench summary rendering
Apr 12, 2026
9aee147
Pin mobench CPU total formatting fix
Apr 12, 2026
c3286c2
fix mobile bench reporting and CI fetch retries
Apr 13, 2026
499c351
fix mobench 0.1.31 workflow compatibility
Apr 13, 2026
487ee0b
fix mobench android abi selection
Apr 13, 2026
08d56dd
fix: align mobile bench workflow with mobench compatibility
Apr 14, 2026
01b2393
chore: bump mobench to 0.1.34
Apr 23, 2026
96a79a5
chore: bump mobench to 0.1.35
Apr 24, 2026
22a9029
chore: test mobench 0.1.36 branch
Apr 27, 2026
b379e80
chore: repin mobench harness fix
Apr 27, 2026
6b10c75
chore: update mobench integration to 0.1.37
Apr 27, 2026
4e99127
Merge commit 'refs/tmp/v1-head' into codex/pr398-resolve-v1
Apr 27, 2026
a0ad517
ci: rely on mobench output contract
Apr 27, 2026
c62cb96
ci: add oprf and p256 mobench fixtures
Apr 28, 2026
5778898
ci: harden mobench sticky comment reporting
Apr 28, 2026
408da31
ci: run mobench smoke on low-end devices
Apr 29, 2026
7615476
ci: lower mobench ios deployment target
Apr 29, 2026
591e5ad
ci: patch generated ios deployment target
Apr 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 100 additions & 0 deletions .github/workflows/mobile-bench-pr-auto.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
name: Mobile Bench PR Auto

on:
pull_request:
types: [labeled]
workflow_run:
workflows: ["Cargo Build & Test"]
types: [completed]

permissions:
contents: read
actions: write
pull-requests: read
checks: read

jobs:
resolve:
name: Check compile gate and resolve context
runs-on: ubuntu-latest
if: >-
(github.event_name == 'pull_request' && github.event.action == 'labeled') ||
(github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success')
outputs:
should_run: ${{ steps.pr.outputs.should_run }}
pr_number: ${{ steps.pr.outputs.pr_number }}
head_sha: ${{ steps.pr.outputs.head_sha }}
requested_by: ${{ steps.pr.outputs.requested_by }}
steps:
- name: Resolve PR context
id: pr
env:
GH_TOKEN: ${{ github.token }}
EVENT_NAME: ${{ github.event_name }}
PR_NUMBER_EVENT: ${{ github.event.pull_request.number }}
HEAD_SHA_PR: ${{ github.event.pull_request.head.sha }}
BASE_REF_PR: ${{ github.event.pull_request.base.ref }}
HEAD_SHA_WR: ${{ github.event.workflow_run.head_sha }}
REPO: ${{ github.repository }}
run: |
set -euo pipefail

if [ "$EVENT_NAME" = "pull_request" ]; then
PR_NUMBER="$PR_NUMBER_EVENT"
HEAD_SHA="$HEAD_SHA_PR"
REQUESTED_BY="auto:pull_request"
else
pr_json=$(gh api "repos/${REPO}/pulls?state=open&sort=updated&direction=desc&per_page=50" \
--jq ".[] | select(.head.sha == \"${HEAD_SHA_WR}\") | {number, base_ref: .base.ref}" \
| head -1)
if [ -z "$pr_json" ]; then
echo "::notice::No open PR found for SHA ${HEAD_SHA_WR}, skipping"
echo "should_run=false" >> "$GITHUB_OUTPUT"
exit 0
fi

PR_NUMBER=$(jq -r '.number' <<<"$pr_json")
HEAD_SHA="$HEAD_SHA_WR"
REQUESTED_BY="auto:workflow_run"
fi

has_label=$(gh api "repos/${REPO}/issues/${PR_NUMBER}/labels" \
--jq '.[].name' | grep -qx 'bench' && echo "true" || echo "false")
if [ "$has_label" != "true" ]; then
echo "::notice::PR #${PR_NUMBER} does not have 'bench' label, skipping"
echo "should_run=false" >> "$GITHUB_OUTPUT"
exit 0
fi

gate_status=$(gh api "repos/${REPO}/commits/${HEAD_SHA}/check-runs" \
--jq '.check_runs[] | select(.name == "Cargo Build & Test" or (.app.name == "GitHub Actions" and .name == "Cargo Build & Test")) | .conclusion' \
| head -1)
if [ "$gate_status" != "success" ]; then
echo "::notice::Compile gate 'Cargo Build & Test' not yet passed for ${HEAD_SHA} (status: ${gate_status:-pending})"
echo "should_run=false" >> "$GITHUB_OUTPUT"
exit 0
fi

echo "pr_number=${PR_NUMBER}" >> "$GITHUB_OUTPUT"
echo "head_sha=${HEAD_SHA}" >> "$GITHUB_OUTPUT"
echo "requested_by=${REQUESTED_BY}" >> "$GITHUB_OUTPUT"
echo "should_run=true" >> "$GITHUB_OUTPUT"

browserstack:
name: Run BrowserStack benchmarks
needs: resolve
if: needs.resolve.outputs.should_run == 'true'
uses: ./.github/workflows/mobile-bench-reusable.yml
secrets: inherit
with:
crate_path: ./bench-mobile
functions: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_oprf_prove","bench_mobile::bench_p256_bigcurve_prove"]'
functions_ios: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_oprf_prove","bench_mobile::bench_p256_bigcurve_prove"]'
functions_android: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_oprf_prove","bench_mobile::bench_p256_bigcurve_prove"]'
platform: both
device_profile: smoke
iterations: "2"
warmup: "1"
pr_number: ${{ needs.resolve.outputs.pr_number }}
requested_by: ${{ needs.resolve.outputs.requested_by }}
head_sha: ${{ needs.resolve.outputs.head_sha }}
118 changes: 118 additions & 0 deletions .github/workflows/mobile-bench-pr-command.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
name: Mobile Bench PR Command

on:
issue_comment:
types: [created]

permissions:
contents: read
actions: write
pull-requests: read
issues: read

jobs:
resolve:
name: Parse /mobench and resolve context
if: >-
github.event_name == 'issue_comment' &&
github.event.action == 'created' &&
github.event.issue.pull_request &&
startsWith(github.event.comment.body, '/mobench')
runs-on: ubuntu-latest
outputs:
trusted: ${{ steps.trust.outputs.trusted }}
platform: ${{ steps.parse.outputs.platform }}
device_profile: ${{ steps.parse.outputs.device_profile }}
iterations: ${{ steps.parse.outputs.iterations }}
warmup: ${{ steps.parse.outputs.warmup }}
head_sha: ${{ steps.pr.outputs.head_sha }}
pr_number: ${{ github.event.issue.number }}
requested_by: ${{ github.event.comment.user.login }}
steps:
- name: Check trust
id: trust
env:
AUTHOR_ASSOCIATION: ${{ github.event.comment.author_association }}
run: |
if echo "OWNER,MEMBER,COLLABORATOR" | tr ',' '\n' | grep -qx "$AUTHOR_ASSOCIATION"; then
echo "trusted=true" >> "$GITHUB_OUTPUT"
else
echo "::warning::Untrusted author association: $AUTHOR_ASSOCIATION"
echo "trusted=false" >> "$GITHUB_OUTPUT"
fi

- name: Parse command
if: steps.trust.outputs.trusted == 'true'
id: parse
env:
COMMENT_BODY: ${{ github.event.comment.body }}
run: |
set -euo pipefail
line=$(echo "$COMMENT_BODY" | head -1)

extract_val() {
echo "$line" | sed -n "s/.*${1}=\([^ ]*\).*/\1/p"
}

platform=$(extract_val platform)
device_profile=$(extract_val device_profile)
iterations=$(extract_val iterations)
warmup=$(extract_val warmup)

case "${platform:-both}" in
android|ios|both) platform="${platform:-both}" ;;
*) echo "::warning::Invalid platform '${platform}', defaulting to 'both'"; platform="both" ;;
esac

case "${device_profile:-smoke}" in
smoke|triad|worst) device_profile="${device_profile:-smoke}" ;;
*) echo "::warning::Invalid device_profile '${device_profile}', defaulting to 'smoke'"; device_profile="smoke" ;;
esac

if ! [[ "${iterations:-2}" =~ ^[0-9]+$ ]]; then
echo "::warning::Invalid iterations '${iterations}', defaulting to '2'"
iterations="2"
else
iterations="${iterations:-2}"
fi

if ! [[ "${warmup:-1}" =~ ^[0-9]+$ ]]; then
echo "::warning::Invalid warmup '${warmup}', defaulting to '1'"
warmup="1"
else
warmup="${warmup:-1}"
fi

echo "platform=${platform}" >> "$GITHUB_OUTPUT"
echo "device_profile=${device_profile}" >> "$GITHUB_OUTPUT"
echo "iterations=${iterations}" >> "$GITHUB_OUTPUT"
echo "warmup=${warmup}" >> "$GITHUB_OUTPUT"

- name: Resolve PR refs
if: steps.trust.outputs.trusted == 'true'
id: pr
env:
GH_TOKEN: ${{ github.token }}
PR_URL: ${{ github.event.issue.pull_request.url }}
run: |
head_sha=$(gh api "$PR_URL" --jq '.head.sha')
echo "head_sha=${head_sha}" >> "$GITHUB_OUTPUT"

browserstack:
name: Run BrowserStack benchmarks
needs: resolve
if: needs.resolve.outputs.trusted == 'true'
uses: ./.github/workflows/mobile-bench-reusable.yml
secrets: inherit
with:
crate_path: ./bench-mobile
functions: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_oprf_prove","bench_mobile::bench_p256_bigcurve_prove"]'
functions_ios: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_oprf_prove","bench_mobile::bench_p256_bigcurve_prove"]'
functions_android: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_oprf_prove","bench_mobile::bench_p256_bigcurve_prove"]'
platform: ${{ needs.resolve.outputs.platform }}
device_profile: ${{ needs.resolve.outputs.device_profile }}
iterations: ${{ needs.resolve.outputs.iterations }}
warmup: ${{ needs.resolve.outputs.warmup }}
pr_number: ${{ needs.resolve.outputs.pr_number }}
requested_by: ${{ needs.resolve.outputs.requested_by }}
head_sha: ${{ needs.resolve.outputs.head_sha }}
Loading
Loading