Skip to content

Commit 8519dc4

Browse files
authored
bench(pm): compare pnpm 10, pnpm 12, and aube (#3323)
* ci(pm): benchmark aube in phase-isolated runs * bench(pm): add pnpm to phase comparison * fix(bench): seed pnpm from full install * fix(bench): force pnpm lockfile generation * fix(bench): reject missing lockfiles and failed prepares * bench(pm): compare pnpm 12 * fix(ci): allow pnpm 12 setup in npm workspace * fix(ci): gate optional benchmark baseline * fix(ci): verify optional baseline conditionally * fix(bench): configure pnpm 10 baseline
1 parent ba792ab commit 8519dc4

4 files changed

Lines changed: 255 additions & 35 deletions

File tree

.github/scripts/render-bench-phases-comment.mjs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,14 @@ const PHASES = [
2626
["p3_cold_install", "p3 · cold install"],
2727
["p4_warm_link", "p4 · warm link"],
2828
];
29-
const PM_ORDER = ["utoo", "utoo-alt", "utoo-next", "utoo-npm", "bun"];
29+
const PM_ORDER = ["utoo", "utoo-alt", "utoo-next", "utoo-npm", "bun", "aube"];
3030
const PM_LABEL = {
3131
utoo: "utoo (PR)",
3232
"utoo-alt": "utoo-alt (PR + alt env)",
3333
"utoo-next": "utoo-next (baseline)",
3434
"utoo-npm": "utoo-npm (published)",
3535
bun: "bun",
36+
aube: "aube",
3637
};
3738

3839
// Relative delta below this is never flagged, whatever the sigmas say.

.github/workflows/pm-e2e-bench.yml

Lines changed: 97 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ name: utoopm-e2e-bench
1010
# pull_request / push with `(pm)` in title/msg → e2e jobs
1111
# pull_request labeled `benchmark` → bench-phases (utoo / utoo-npm / bun)
1212
# workflow_dispatch with `target` choice → manual one-off runs
13-
# (pm-bench-all = full PM shootout vs pnpm/yarn/bun/aube;
13+
# (pm-bench-all = full PM shootout vs pnpm/pnpm12/yarn/bun/aube;
1414
# pm-bench-phases = same as the labeled trigger but ad-hoc;
1515
# pm-bench-pcap = tcpdump capture for resolve phase)
1616
#
@@ -40,7 +40,7 @@ on:
4040
type: choice
4141
options: [both, npmjs, npmmirror]
4242
pm_list:
43-
description: '[pm-bench-all] Comma-separated PMs (e.g. utoo,bun); "all" → utoo,pnpm,yarn,bun,aube'
43+
description: '[pm-bench-all] Comma-separated PMs (e.g. utoo,bun); "all" → utoo,pnpm,pnpm12,yarn,bun,aube'
4444
required: false
4545
default: 'utoo,bun'
4646
type: string
@@ -544,13 +544,34 @@ jobs:
544544
uses: oven-sh/setup-bun@v2
545545
with:
546546
bun-version: latest
547+
- name: Install pnpm 12
548+
id: pnpm12
549+
if: contains(github.event.inputs.phases_pm_list, 'pnpm12')
550+
uses: pnpm/setup@v2
551+
env:
552+
PNPM_CONFIG_PM_ON_FAIL: ignore
553+
with:
554+
version: next-12
555+
dest: ~/setup-pnpm12
556+
install: false
557+
- name: Expose pnpm 12 binary
558+
if: contains(github.event.inputs.phases_pm_list, 'pnpm12')
559+
run: echo "PNPM12_BIN=${{ steps.pnpm12.outputs.dest }}/pnpm" >> "$GITHUB_ENV"
560+
- name: Install pnpm
561+
if: contains(github.event.inputs.phases_pm_list, 'pnpm')
562+
uses: pnpm/action-setup@v4
563+
with:
564+
version: 10
565+
- name: Install aube
566+
if: contains(github.event.inputs.phases_pm_list, 'aube')
567+
run: npm install -g @endevco/aube@1.29.1
547568
- uses: ./.github/actions/install-bench-tools
548569
with:
549570
platform: linux
550571
# utoo-npm (last published release) only changes on releases — bench it
551572
# on manual dispatch only; label-triggered PR runs compare against
552573
# utoo-next, which is the signal that can actually change per PR.
553-
- if: github.event_name == 'workflow_dispatch'
574+
- if: github.event_name == 'workflow_dispatch' && contains(github.event.inputs.phases_pm_list, 'utoo-npm')
554575
uses: ./.github/actions/install-utoo-npm-baseline
555576
# The utoo-next binary is built upstream by build-linux's
556577
# "Build next branch utoo (bench baseline)" step. Just download.
@@ -572,13 +593,18 @@ jobs:
572593
if [ -n "${UTOO_NPM_BIN:-}" ]; then "$UTOO_NPM_BIN" --version; fi
573594
"$UTOO_NEXT_BIN" --version
574595
bun --version
596+
if command -v pnpm >/dev/null; then env npm_config_package_manager_strict=false npm_config_manage_package_manager_versions=false pnpm --version; fi
597+
if [ -n "${PNPM12_BIN:-}" ]; then env PNPM_CONFIG_PM_ON_FAIL=ignore "$PNPM12_BIN" --version; fi
598+
if command -v aube >/dev/null; then aube --version; fi
575599
- name: Define cache wipe function
576600
run: |
577601
cat > /tmp/wipe-bench-state.sh <<'WIPE'
578602
#!/usr/bin/env bash
579603
rm -rf /tmp/pm-bench /tmp/pm-bench-results /tmp/pm-bench-output \
580604
/tmp/utoo-bench-cache /tmp/utoo-npm-bench-cache \
581605
/tmp/utoo-next-bench-cache /tmp/utoo-alt-bench-cache /tmp/bun-bench-cache \
606+
/tmp/pnpm-bench-store /tmp/pnpm12-bench-store \
607+
/tmp/aube-bench-data /tmp/aube-bench-cache \
582608
~/.bun/install/cache ~/.cache/nm 2>/dev/null || true
583609
mkdir -p /tmp/pm-bench-output
584610
WIPE
@@ -664,22 +690,49 @@ jobs:
664690
uses: oven-sh/setup-bun@v2
665691
with:
666692
bun-version: latest
693+
- name: Install pnpm 12
694+
id: pnpm12
695+
if: contains(github.event.inputs.phases_pm_list, 'pnpm12')
696+
uses: pnpm/setup@v2
697+
env:
698+
PNPM_CONFIG_PM_ON_FAIL: ignore
699+
with:
700+
version: next-12
701+
dest: ~/setup-pnpm12
702+
install: false
703+
- name: Expose pnpm 12 binary
704+
if: contains(github.event.inputs.phases_pm_list, 'pnpm12')
705+
run: echo "PNPM12_BIN=${{ steps.pnpm12.outputs.dest }}/pnpm" >> "$GITHUB_ENV"
706+
- name: Install pnpm
707+
if: contains(github.event.inputs.phases_pm_list, 'pnpm')
708+
uses: pnpm/action-setup@v4
709+
with:
710+
version: 10
711+
- name: Install aube
712+
if: contains(github.event.inputs.phases_pm_list, 'aube')
713+
run: npm install -g @endevco/aube@1.29.1
667714
- uses: ./.github/actions/install-bench-tools
668715
with:
669716
platform: mac
670-
- uses: ./.github/actions/install-utoo-npm-baseline
717+
- if: contains(github.event.inputs.phases_pm_list, 'utoo-npm')
718+
uses: ./.github/actions/install-utoo-npm-baseline
671719
- name: Verify tools
672720
run: |
673721
hyperfine --version
674722
utoo --version
675-
"$UTOO_NPM_BIN" --version
723+
if [ -n "${UTOO_NPM_BIN:-}" ]; then "$UTOO_NPM_BIN" --version; fi
676724
bun --version
725+
if command -v pnpm >/dev/null; then env npm_config_package_manager_strict=false npm_config_manage_package_manager_versions=false pnpm --version; fi
726+
if [ -n "${PNPM12_BIN:-}" ]; then env PNPM_CONFIG_PM_ON_FAIL=ignore "$PNPM12_BIN" --version; fi
727+
if command -v aube >/dev/null; then aube --version; fi
677728
- name: Define cache wipe function
678729
run: |
679730
cat > /tmp/wipe-bench-state.sh <<'WIPE'
680731
#!/usr/bin/env bash
681732
rm -rf /tmp/pm-bench /tmp/pm-bench-results /tmp/pm-bench-output \
682733
/tmp/utoo-bench-cache /tmp/utoo-npm-bench-cache /tmp/utoo-alt-bench-cache /tmp/bun-bench-cache \
734+
/tmp/pnpm-bench-store /tmp/pnpm12-bench-store \
735+
/tmp/aube-bench-data /tmp/aube-bench-cache \
683736
~/.bun/install/cache ~/.cache/nm 2>/dev/null || true
684737
mkdir -p /tmp/pm-bench-output
685738
WIPE
@@ -740,7 +793,7 @@ jobs:
740793
# ============================================================
741794
# PM-BENCH-ALL (manual full PM shootout)
742795
# workflow_dispatch with target=pm-bench-all only — comparing utoo
743-
# against pnpm/yarn/bun/aube on cold + warm installs across
796+
# against pnpm/pnpm12/yarn/bun/aube on cold + warm installs across
744797
# configurable registries is slow, so it's never auto-triggered.
745798
# ============================================================
746799

@@ -777,9 +830,22 @@ jobs:
777830
run: |
778831
PM_LIST="${{ github.event.inputs.pm_list || 'utoo,bun' }}"
779832
if [ "$PM_LIST" = "all" ]; then
780-
PM_LIST="utoo,pnpm,yarn,bun,aube"
833+
PM_LIST="utoo,pnpm,pnpm12,yarn,bun,aube"
781834
fi
782835
echo "list=$PM_LIST" >> $GITHUB_OUTPUT
836+
- name: Install pnpm 12
837+
id: pnpm12
838+
if: contains(steps.pm.outputs.list, 'pnpm12')
839+
uses: pnpm/setup@v2
840+
env:
841+
PNPM_CONFIG_PM_ON_FAIL: ignore
842+
with:
843+
version: next-12
844+
dest: ~/setup-pnpm12
845+
install: false
846+
- name: Expose pnpm 12 binary
847+
if: contains(steps.pm.outputs.list, 'pnpm12')
848+
run: echo "PNPM12_BIN=${{ steps.pnpm12.outputs.dest }}/pnpm" >> "$GITHUB_ENV"
783849
- name: Install pnpm
784850
if: contains(steps.pm.outputs.list, 'pnpm')
785851
uses: pnpm/action-setup@v4
@@ -803,7 +869,11 @@ jobs:
803869
hyperfine --version
804870
IFS=',' read -ra PMS <<< "${{ steps.pm.outputs.list }}"
805871
for pm in "${PMS[@]}"; do
806-
echo "$pm: $($pm --version 2>&1 || echo 'not installed')"
872+
if [ "$pm" = "pnpm12" ]; then
873+
echo "$pm: $(env PNPM_CONFIG_PM_ON_FAIL=ignore "$PNPM12_BIN" --version 2>&1 || echo 'not installed')"
874+
else
875+
echo "$pm: $($pm --version 2>&1 || echo 'not installed')"
876+
fi
807877
done
808878
- name: Run benchmark
809879
run: |
@@ -843,9 +913,22 @@ jobs:
843913
run: |
844914
PM_LIST="${{ github.event.inputs.pm_list || 'utoo,bun' }}"
845915
if [ "$PM_LIST" = "all" ]; then
846-
PM_LIST="utoo,pnpm,yarn,bun,aube"
916+
PM_LIST="utoo,pnpm,pnpm12,yarn,bun,aube"
847917
fi
848918
echo "list=$PM_LIST" >> $GITHUB_OUTPUT
919+
- name: Install pnpm 12
920+
id: pnpm12
921+
if: contains(steps.pm.outputs.list, 'pnpm12')
922+
uses: pnpm/setup@v2
923+
env:
924+
PNPM_CONFIG_PM_ON_FAIL: ignore
925+
with:
926+
version: next-12
927+
dest: ~/setup-pnpm12
928+
install: false
929+
- name: Expose pnpm 12 binary
930+
if: contains(steps.pm.outputs.list, 'pnpm12')
931+
run: echo "PNPM12_BIN=${{ steps.pnpm12.outputs.dest }}/pnpm" >> "$GITHUB_ENV"
849932
- name: Install pnpm
850933
if: contains(steps.pm.outputs.list, 'pnpm')
851934
uses: pnpm/action-setup@v4
@@ -869,7 +952,11 @@ jobs:
869952
hyperfine --version
870953
IFS=',' read -ra PMS <<< "${{ steps.pm.outputs.list }}"
871954
for pm in "${PMS[@]}"; do
872-
echo "$pm: $($pm --version 2>&1 || echo 'not installed')"
955+
if [ "$pm" = "pnpm12" ]; then
956+
echo "$pm: $(env PNPM_CONFIG_PM_ON_FAIL=ignore "$PNPM12_BIN" --version 2>&1 || echo 'not installed')"
957+
else
958+
echo "$pm: $($pm --version 2>&1 || echo 'not installed')"
959+
fi
873960
done
874961
- name: Run benchmark
875962
run: |

0 commit comments

Comments
 (0)