ci: gate demo deploy

This commit is contained in:
SnapOtter
2026-07-04 13:45:47 +08:00
parent f6f7b5a4bc
commit 7b6765030b
4 changed files with 137 additions and 0 deletions
@@ -9,6 +9,15 @@ function workflowText(): string {
return readFileSync(workflowPath, "utf8");
}
function expectBefore(workflow: string, earlier: string, later: string) {
const earlierIndex = workflow.indexOf(earlier);
const laterIndex = workflow.indexOf(later);
expect(earlierIndex, `${earlier} should exist in the workflow`).toBeGreaterThanOrEqual(0);
expect(laterIndex, `${later} should exist in the workflow`).toBeGreaterThanOrEqual(0);
expect(earlierIndex, `${earlier} should run before ${later}`).toBeLessThan(laterIndex);
}
describe("demo deployment workflow", () => {
it("deploys the demo app to the Cloudflare Pages demo project", () => {
const workflow = workflowText();
@@ -22,6 +31,22 @@ describe("demo deployment workflow", () => {
expect(workflow).toContain("CLOUDFLARE_ACCOUNT_ID: $" + "{{ secrets.CLOUDFLARE_ACCOUNT_ID }}");
});
it("runs focused demo gates before publishing to Cloudflare", () => {
const workflow = workflowText();
const deployCommand =
"npx wrangler pages deploy apps/demo/dist --project-name snapotter-demo --branch main --commit-dirty=true";
for (const gateCommand of [
"pnpm vitest run --config vitest.config.ts tests/unit/infra/demo-theme.test.ts tests/unit/infra/deploy-demo-workflow.test.ts tests/unit/infra/demo-mock-api.test.ts",
"pnpm --filter @snapotter/demo exec tsc --noEmit",
"pnpm --filter @snapotter/demo build",
"pnpm playwright install --with-deps chromium",
"pnpm playwright test --config playwright.demo.config.ts",
]) {
expectBefore(workflow, gateCommand, deployCommand);
}
});
it("rebuilds when the demo shell, real app UI, shared code, or build inputs change", () => {
const workflow = workflowText();
@@ -32,7 +57,14 @@ describe("demo deployment workflow", () => {
'"package.json"',
'"pnpm-lock.yaml"',
'"pnpm-workspace.yaml"',
'"turbo.json"',
'"tsconfig.base.json"',
'".github/actions/setup/**"',
'"playwright.demo.config.ts"',
'"tests/e2e-demo/**"',
'"tests/unit/infra/demo-theme.test.ts"',
'"tests/unit/infra/demo-mock-api.test.ts"',
'"tests/unit/infra/deploy-demo-workflow.test.ts"',
'".github/workflows/deploy-demo.yml"',
]) {
expect(workflow).toContain(pathFilter);