Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
ec616ea
Add compact mobench integration for v1
dcbuild3r May 24, 2026
9478615
Trigger mobile benchmarks [mobench:both]
dcbuild3r May 24, 2026
bdfeb50
Consolidate mobile bench PR checks
dcbuild3r Jun 9, 2026
cc62f53
Merge remote-tracking branch 'origin/v1' into codex/pr451-v1-conflict…
dcbuild3r Jun 9, 2026
64afa00
Fix mobile bench PR trigger [mobench:both]
dcbuild3r Jun 11, 2026
8e65c06
Fix v1 mobench CI timeouts [mobench:android]
dcbuild3r Jun 20, 2026
a38b007
Treat partial Android mobench results as publishable
dcbuild3r Jun 20, 2026
ae3d6c0
Run full mobile benchmarks at five samples [mobench:both:5]
dcbuild3r Jun 21, 2026
bd3719a
Simplify mobench CI integration
dcbuild3r Jul 13, 2026
a94754a
Simplify mobench crate integration
dcbuild3r Jul 15, 2026
36585a3
Address mobench review findings
dcbuild3r Jul 16, 2026
bb36bc0
Fix mobile fixture artifact gating
dcbuild3r Jul 16, 2026
29c3b6d
Update mobench integration to 0.1.45
dcbuild3r Jul 17, 2026
96ae4f3
Allow secure fork mobench preparation
dcbuild3r Jul 18, 2026
9eae686
Raise iOS mobench deployment target
dcbuild3r Jul 18, 2026
5e648b0
Install mobile targets for pinned Rust toolchain
dcbuild3r Jul 18, 2026
a118a4c
Update mobile benchmarks to mobench 0.1.46
dcbuild3r Jul 19, 2026
6effd46
Pin mobench integration branch
dcbuild3r Jul 19, 2026
7ec200b
Advance mobench integration pin
dcbuild3r Jul 19, 2026
7c3aa25
Advance Mobench integration branch pin
dcbuild3r Jul 19, 2026
4579883
Advance mobench integration branch
dcbuild3r Jul 19, 2026
c8beef9
Advance mobench integration branch
dcbuild3r Jul 19, 2026
0e1dfeb
Refresh Mobench integration branch
dcbuild3r Jul 19, 2026
a4c72f8
chore: refresh mobench integration pin
dcbuild3r Jul 19, 2026
4826c36
chore: refresh mobench integration pin
dcbuild3r Jul 20, 2026
16cf0ee
chore: use mobench 0.1.47 release
dcbuild3r Jul 20, 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
22 changes: 19 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,32 @@ jobs:
runs-on: ubuntu-24.04-arm
steps:
- uses: actions/checkout@v4
- name: Free runner disk before build and tests
shell: bash
run: |
set -euo pipefail
df -h
sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost "$AGENT_TOOLSDIRECTORY" || true
docker system prune -af || true
df -h
- name: Setup rust toolchain, cache and bins
uses: moonrepo/setup-rust@v1
with:
channel: nightly-2026-03-04
cache-base: main
- run: cargo build --all-targets --all-features --verbose
- run: cargo test --no-fail-fast --all-features --verbose --lib --tests --bins -- --nocapture
- name: Setup Noir
uses: noir-lang/noirup@v0.1.2
with:
toolchain: v1.0.0-beta.11
- name: Generate mobile benchmark Noir artifacts
run: bench-mobile/scripts/generate-fixtures.sh
env:
MOBENCH_CI_PREPARE: "1"
- run: cargo build --all-targets --all-features
- run: cargo test --no-fail-fast --all-features --lib --tests --bins -- --nocapture
env:
RUST_BACKTRACE: 1
- run: cargo test --doc --all-features --verbose
- run: cargo test --doc --all-features

cargo_clippy:
name: Clippy
Expand Down
168 changes: 168 additions & 0 deletions .github/workflows/mobile-bench-pr-command.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
name: Mobile Bench PR Command

on:
issue_comment:
types: [created]

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

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
permissions:
contents: read
pull-requests: read
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:-triad}" in
smoke|triad|worst) device_profile="${device_profile:-triad}" ;;
*) echo "::warning::Invalid device_profile '${device_profile}', defaulting to 'triad'"; device_profile="triad" ;;
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: |
set -euo pipefail
head_sha=$(gh api "$PR_URL" --jq '.head.sha')
[[ "$head_sha" =~ ^[0-9a-f]{40}$ ]] || { echo "::error::Expected a full PR head SHA"; exit 1; }
echo "head_sha=$head_sha" >> "$GITHUB_OUTPUT"

resolve-device-matrices:
name: Resolve BrowserStack device matrices
needs: resolve
if: needs.resolve.outputs.trusted == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
ios_devices: ${{ steps.resolve.outputs.ios_devices }}
android_devices: ${{ steps.resolve.outputs.android_devices }}
steps:
- id: resolve
shell: bash
env:
DEVICE_PROFILE: ${{ needs.resolve.outputs.device_profile }}
run: |
set -euo pipefail
case "$DEVICE_PROFILE" in
smoke|worst) ios_devices='[{"device":"iPhone SE 2022","os_version":"15"}]' ;;
triad) ios_devices='[{"device":"iPhone SE 2022","os_version":"15"},{"device":"iPhone 14","os_version":"16"},{"device":"iPhone 16 Pro Max","os_version":"18"}]' ;;
*) echo "::error::Unsupported iOS device profile '$DEVICE_PROFILE'."; exit 1 ;;
esac
case "$DEVICE_PROFILE" in
smoke|worst) android_devices='[{"device":"Samsung Galaxy M32","os_version":"11.0"}]' ;;
triad) android_devices='[{"device":"Samsung Galaxy S24","os_version":"14.0"},{"device":"Google Pixel 7","os_version":"13.0"},{"device":"Samsung Galaxy M32","os_version":"11.0"}]' ;;
*) echo "::error::Unsupported Android device profile '$DEVICE_PROFILE'."; exit 1 ;;
esac
echo "ios_devices=$ios_devices" >> "$GITHUB_OUTPUT"
echo "android_devices=$android_devices" >> "$GITHUB_OUTPUT"

browserstack:
name: Run BrowserStack benchmarks
needs: [resolve, resolve-device-matrices]
if: needs.resolve.outputs.trusted == 'true'
permissions:
actions: read
checks: write
contents: read
pull-requests: write
uses: worldcoin/mobile-bench-rs/.github/workflows/reusable-bench.yml@8a2dfbb2ba941aa6a6582bf49dae482cc87779df
secrets:
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
with:
crate_path: ./bench-mobile
functions: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]'
functions_ios: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]'
functions_android: '["bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove","bench_mobile::bench_passport_complete_age_check_prove"]'
platform: ${{ needs.resolve.outputs.platform }}
prepare_script: bench-mobile/scripts/generate-fixtures.sh
device_profile: custom
ios_devices: ${{ needs.resolve-device-matrices.outputs.ios_devices }}
android_devices: ${{ needs.resolve-device-matrices.outputs.android_devices }}
iterations: ${{ needs.resolve.outputs.iterations }}
warmup: ${{ needs.resolve.outputs.warmup }}
mobench_version: "0.1.47"
max_completion_timeout_secs: 7200
rust_toolchain: nightly-2026-03-04
ffi_backend: native-c-abi
pr_number: ${{ needs.resolve.outputs.pr_number }}
allow_non_pr: false
requested_by: ${{ needs.resolve.outputs.requested_by }}
head_sha: ${{ needs.resolve.outputs.head_sha }}
153 changes: 153 additions & 0 deletions .github/workflows/mobile-bench.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
name: Mobile Benchmarks

on:
workflow_dispatch:
inputs:
functions_ios:
description: "Optional iOS-specific benchmark functions"
required: false
type: string
default: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]'
functions_android:
description: "Optional Android-specific benchmark functions"
required: false
type: string
default: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]'
platform:
description: "android | ios | both"
required: false
type: choice
default: both
options:
- android
- ios
- both
device_profile:
description: "Device profile to run"
required: false
type: choice
default: "triad"
options:
- smoke
- triad
- worst
device_profile_ios:
description: "Optional iOS-specific device profile"
required: false
type: string
default: ""
device_profile_android:
description: "Optional Android-specific device profile"
required: false
type: string
default: ""
iterations:
description: "Number of benchmark iterations"
required: false
type: string
default: "2"
warmup:
description: "Number of warmup iterations"
required: false
type: string
default: "1"
pr_number:
description: "PR number for reporting"
required: true
type: string
head_sha:
description: "Exact commit SHA to benchmark"
required: true
type: string

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

concurrency:
group: mobench-${{ inputs.pr_number != '' && inputs.pr_number || github.run_id }}
cancel-in-progress: false

jobs:
resolve-device-matrices:
name: Resolve BrowserStack device matrices
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
ios_devices: ${{ steps.resolve.outputs.ios_devices }}
android_devices: ${{ steps.resolve.outputs.android_devices }}
steps:
- id: resolve
shell: bash
env:
DEVICE_PROFILE: ${{ inputs.device_profile }}
DEVICE_PROFILE_IOS: ${{ inputs.device_profile_ios }}
DEVICE_PROFILE_ANDROID: ${{ inputs.device_profile_android }}
run: |
set -euo pipefail
ios_profile="${DEVICE_PROFILE_IOS:-$DEVICE_PROFILE}"
android_profile="${DEVICE_PROFILE_ANDROID:-$DEVICE_PROFILE}"
case "$ios_profile" in
smoke|worst) ios_devices='[{"device":"iPhone SE 2022","os_version":"15"}]' ;;
triad) ios_devices='[{"device":"iPhone SE 2022","os_version":"15"},{"device":"iPhone 14","os_version":"16"},{"device":"iPhone 16 Pro Max","os_version":"18"}]' ;;
*) echo "::error::Unsupported iOS device profile '$ios_profile'."; exit 1 ;;
esac
case "$android_profile" in
smoke|worst) android_devices='[{"device":"Samsung Galaxy M32","os_version":"11.0"}]' ;;
triad) android_devices='[{"device":"Samsung Galaxy S24","os_version":"14.0"},{"device":"Google Pixel 7","os_version":"13.0"},{"device":"Samsung Galaxy M32","os_version":"11.0"}]' ;;
*) echo "::error::Unsupported Android device profile '$android_profile'."; exit 1 ;;
esac
echo "ios_devices=$ios_devices" >> "$GITHUB_OUTPUT"
echo "android_devices=$android_devices" >> "$GITHUB_OUTPUT"

browserstack-preflight:
name: BrowserStack preflight
runs-on: ubuntu-latest
environment: Browserstack
outputs:
available: ${{ steps.check.outputs.available }}
env:
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
steps:
- name: Check BrowserStack secrets
id: check
shell: bash
run: |
if [ -n "$BROWSERSTACK_USERNAME" ] && [ -n "$BROWSERSTACK_ACCESS_KEY" ]; then
echo "available=true" >> "$GITHUB_OUTPUT"
else
echo "available=false" >> "$GITHUB_OUTPUT"
fi

browserstack:
name: BrowserStack benchmarks
needs: [browserstack-preflight, resolve-device-matrices]
if: ${{ needs.browserstack-preflight.outputs.available == 'true' }}
uses: worldcoin/mobile-bench-rs/.github/workflows/reusable-bench.yml@8a2dfbb2ba941aa6a6582bf49dae482cc87779df
secrets:
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
with:
crate_path: ./bench-mobile
functions: '["bench_mobile::bench_passport_complete_age_check_prove","bench_mobile::bench_passport_fragmented_age_check_prove","bench_mobile::bench_oprf_prove"]'
functions_ios: ${{ inputs.functions_ios }}
functions_android: ${{ inputs.functions_android }}
platform: ${{ inputs.platform }}
prepare_script: bench-mobile/scripts/generate-fixtures.sh
device_profile: custom
ios_devices: ${{ needs.resolve-device-matrices.outputs.ios_devices }}
android_devices: ${{ needs.resolve-device-matrices.outputs.android_devices }}
iterations: ${{ inputs.iterations }}
warmup: ${{ inputs.warmup }}
mobench_version: "0.1.47"
max_completion_timeout_secs: 7200
rust_toolchain: nightly-2026-03-04
ffi_backend: native-c-abi
pr_number: ${{ inputs.pr_number }}
allow_non_pr: false
head_sha: ${{ inputs.head_sha }}
requested_by: ${{ github.actor }}
Loading
Loading