diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dfc6b89000f4..8e71f2b9fa8a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -605,7 +605,19 @@ jobs: restore-keys: | ${{ runner.os }}-build-all-v3- + - name: Restore dist build cache + id: dist_build_cache + uses: actions/cache/restore@v5 + with: + path: | + dist/ + dist-runtime/ + extensions/*/src/host/**/.bundle.hash + extensions/*/src/host/**/*.bundle.js + key: ${{ runner.os }}-dist-build-${{ needs.preflight.outputs.checkout_revision }} + - name: Build dist + if: steps.dist_build_cache.outputs.cache-hit != 'true' env: NODE_OPTIONS: --max-old-space-size=8192 run: pnpm build:ci-artifacts @@ -614,14 +626,6 @@ jobs: if: needs.preflight.outputs.run_control_ui_i18n == 'true' run: pnpm ui:i18n:check - - name: Cache dist build - uses: actions/cache@v5 - with: - path: | - dist/ - dist-runtime/ - key: ${{ runner.os }}-dist-build-${{ needs.preflight.outputs.checkout_revision }} - - name: Pack built runtime artifacts run: tar --posix -cf dist-runtime-build.tar.zst --use-compress-program zstdmt dist dist-runtime @@ -751,6 +755,18 @@ jobs: done exit "$failures" + - name: Save dist build cache + if: steps.dist_build_cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v5 + continue-on-error: true + with: + path: | + dist/ + dist-runtime/ + extensions/*/src/host/**/.bundle.hash + extensions/*/src/host/**/*.bundle.js + key: ${{ steps.dist_build_cache.outputs.cache-primary-key }} + - name: Upload gateway watch regression artifacts if: always() && needs.preflight.outputs.run_check_additional == 'true' uses: actions/upload-artifact@v7 diff --git a/test/scripts/ci-workflow-guards.test.ts b/test/scripts/ci-workflow-guards.test.ts index 89a949df0382..76c8d7738ec2 100644 --- a/test/scripts/ci-workflow-guards.test.ts +++ b/test/scripts/ci-workflow-guards.test.ts @@ -146,6 +146,35 @@ describe("ci workflow guards", () => { expect(buildArtifactSteps.some((step) => step.run === "pnpm ui:build")).toBe(false); }); + it("restores the dist build cache before building and saves only cache misses", () => { + const workflow = readCiWorkflow(); + const buildArtifactSteps = workflow.jobs["build-artifacts"].steps; + const stepNames = buildArtifactSteps.map((step) => step.name); + const restoreStep = buildArtifactSteps.find((step) => step.name === "Restore dist build cache"); + const buildDistStep = buildArtifactSteps.find((step) => step.name === "Build dist"); + const saveStep = buildArtifactSteps.find((step) => step.name === "Save dist build cache"); + + expect(stepNames.indexOf("Restore dist build cache")).toBeLessThan( + stepNames.indexOf("Build dist"), + ); + expect(stepNames.indexOf("Build dist")).toBeLessThan( + stepNames.indexOf("Pack built runtime artifacts"), + ); + expect(stepNames.indexOf("Run built artifact checks")).toBeLessThan( + stepNames.indexOf("Save dist build cache"), + ); + expect(restoreStep.uses).toBe("actions/cache/restore@v5"); + expect(buildDistStep.if).toBe("steps.dist_build_cache.outputs.cache-hit != 'true'"); + expect(saveStep.uses).toBe("actions/cache/save@v5"); + expect(saveStep.if).toBe("steps.dist_build_cache.outputs.cache-hit != 'true'"); + expect(saveStep.with.key).toBe("${{ steps.dist_build_cache.outputs.cache-primary-key }}"); + expect(restoreStep.with.path).toContain("dist/"); + expect(restoreStep.with.path).toContain("dist-runtime/"); + expect(restoreStep.with.path).toContain("extensions/*/src/host/**/.bundle.hash"); + expect(restoreStep.with.path).toContain("extensions/*/src/host/**/*.bundle.js"); + expect(buildArtifactSteps.map((step) => step.name)).not.toContain("Cache dist build"); + }); + it("gives quiet Node test shards enough no-output runway", () => { const workflow = readCiWorkflow(); const nodeTestJob = workflow.jobs["checks-node-core-test-nondist-shard"];