Skip to content
Merged
Changes from all commits
Commits
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
135 changes: 121 additions & 14 deletions .github/workflows/generate-stats.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,35 +10,142 @@ on:
- 'package.json'

jobs:
generate-stats:
# Install time measurements run in parallel on fresh runners for fair comparison
next-install:
runs-on: ubuntu-latest
outputs:
time: ${{ steps.measure.outputs.time }}
steps:
- name: Checkout code
uses: actions/checkout@v4

permissions:
contents: write
pull-requests: write
- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24'

- name: Measure Next.js install time
id: measure
run: |
cp -r packages/starter-next-js /tmp/next-test
cd /tmp/next-test
START=$(date +%s%N)
pnpm install
END=$(date +%s%N)
ELAPSED=$((($END - $START) / 1000000))
echo "time=$ELAPSED" >> $GITHUB_OUTPUT
echo "Next.js install time: ${ELAPSED}ms"

react-router-install:
runs-on: ubuntu-latest
outputs:
time: ${{ steps.measure.outputs.time }}
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24'

- name: Measure React Router install time
id: measure
run: |
cp -r packages/starter-react-router /tmp/react-router-test
cd /tmp/react-router-test
START=$(date +%s%N)
pnpm install
END=$(date +%s%N)
ELAPSED=$((($END - $START) / 1000000))
echo "time=$ELAPSED" >> $GITHUB_OUTPUT
echo "React Router install time: ${ELAPSED}ms"

tanstack-install:
runs-on: ubuntu-latest
outputs:
time: ${{ steps.measure.outputs.time }}
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js (no cache for clean measurements)
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24'
# No cache - we want clean measurements

- name: Measure install time (clean, no cache)
id: install
- name: Measure TanStack Start install time
id: measure
run: |
cp -r packages/starter-tanstack-start-react /tmp/tanstack-test
cd /tmp/tanstack-test
START=$(date +%s%N)
pnpm install --frozen-lockfile
pnpm install
END=$(date +%s%N)
ELAPSED=$((($END - $START) / 1000000))
echo "time=$ELAPSED" >> $GITHUB_OUTPUT
echo "Install time: ${ELAPSED}ms"
echo "TanStack Start install time: ${ELAPSED}ms"

nuxt-install:
runs-on: ubuntu-latest
outputs:
time: ${{ steps.measure.outputs.time }}
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24'

- name: Measure Nuxt install time
id: measure
run: |
cp -r packages/starter-nuxt /tmp/nuxt-test
cd /tmp/nuxt-test
START=$(date +%s%N)
pnpm install
END=$(date +%s%N)
ELAPSED=$((($END - $START) / 1000000))
echo "time=$ELAPSED" >> $GITHUB_OUTPUT
echo "Nuxt install time: ${ELAPSED}ms"

# Main job that measures builds and generates stats
generate-stats:
runs-on: ubuntu-latest
needs: [next-install, react-router-install, tanstack-install, nuxt-install]

permissions:
contents: write
pull-requests: write

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24'

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Measure Next.js builds
id: next
Expand Down Expand Up @@ -123,7 +230,7 @@ jobs:
# Save Next.js stats
mkdir -p packages/starter-next-js
echo '{
"installTimeMs": ${{ steps.install.outputs.time }},
"installTimeMs": ${{ needs.next-install.outputs.time }},
"coldBuildTimeMs": ${{ steps.next.outputs.cold }},
"warmBuildTimeMs": ${{ steps.next.outputs.warm }},
"timingMeasuredAt": "'$TIMESTAMP'",
Expand All @@ -133,7 +240,7 @@ jobs:
# Save React Router stats
mkdir -p packages/starter-react-router
echo '{
"installTimeMs": ${{ steps.install.outputs.time }},
"installTimeMs": ${{ needs.react-router-install.outputs.time }},
"coldBuildTimeMs": ${{ steps.react_router.outputs.cold }},
"warmBuildTimeMs": ${{ steps.react_router.outputs.warm }},
"timingMeasuredAt": "'$TIMESTAMP'",
Expand All @@ -143,7 +250,7 @@ jobs:
# Save TanStack Start stats
mkdir -p packages/starter-tanstack-start-react
echo '{
"installTimeMs": ${{ steps.install.outputs.time }},
"installTimeMs": ${{ needs.tanstack-install.outputs.time }},
"coldBuildTimeMs": ${{ steps.tanstack.outputs.cold }},
"warmBuildTimeMs": ${{ steps.tanstack.outputs.warm }},
"timingMeasuredAt": "'$TIMESTAMP'",
Expand All @@ -153,7 +260,7 @@ jobs:
# Save Nuxt stats
mkdir -p packages/starter-nuxt
echo '{
"installTimeMs": ${{ steps.install.outputs.time }},
"installTimeMs": ${{ needs.nuxt-install.outputs.time }},
"coldBuildTimeMs": ${{ steps.nuxt.outputs.cold }},
"warmBuildTimeMs": ${{ steps.nuxt.outputs.warm }},
"timingMeasuredAt": "'$TIMESTAMP'",
Expand Down