diff --git a/.github/workflows/generate-stats.yml b/.github/workflows/generate-stats.yml index e4de16b..8de592d 100644 --- a/.github/workflows/generate-stats.yml +++ b/.github/workflows/generate-stats.yml @@ -10,13 +10,67 @@ 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 @@ -24,21 +78,74 @@ jobs: - 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 @@ -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'", @@ -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'", @@ -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'", @@ -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'",