Skip to content

Commit 43a18b5

Browse files
committed
ci(pages): validate static deployment artifacts
1 parent 5ef7b3c commit 43a18b5

9 files changed

Lines changed: 317 additions & 53 deletions

File tree

.github/workflows/ci.yml

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@ jobs:
2323
timeout-minutes: 20
2424
steps:
2525
- name: Checkout
26-
uses: actions/checkout@v4
26+
uses: actions/checkout@v7
27+
with:
28+
persist-credentials: false
2729

2830
- name: Setup pnpm
29-
uses: pnpm/action-setup@v4
31+
uses: pnpm/action-setup@v6
3032

3133
- name: Setup Node.js
32-
uses: actions/setup-node@v4
34+
uses: actions/setup-node@v7
3335
with:
3436
node-version: '24'
3537
cache: pnpm
@@ -48,13 +50,37 @@ jobs:
4850

4951
- name: Upload visual failure artifacts
5052
if: failure()
51-
uses: actions/upload-artifact@v4
53+
uses: actions/upload-artifact@v7
5254
with:
5355
name: playwright-results
5456
path: |
5557
apps/blocks/playwright-report
5658
apps/blocks/test-results
5759
if-no-files-found: ignore
5860

61+
pages:
62+
runs-on: ubuntu-latest
63+
timeout-minutes: 20
64+
steps:
65+
- name: Checkout
66+
uses: actions/checkout@v7
67+
with:
68+
persist-credentials: false
69+
70+
- name: Setup pnpm
71+
uses: pnpm/action-setup@v6
72+
73+
- name: Setup Node.js
74+
uses: actions/setup-node@v7
75+
with:
76+
node-version: '24'
77+
cache: pnpm
78+
79+
- name: Install dependencies
80+
run: pnpm install --frozen-lockfile
81+
82+
- name: Build and verify Pages artifact
83+
run: pnpm build:pages
84+
5985
# npm releases are intentionally manual. This workflow only validates package
6086
# tags; it contains no registry token, trusted-publishing step, or publish job.

.github/workflows/pages.yml

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,31 @@ on:
66
workflow_dispatch: {}
77

88
concurrency:
9-
group: pages
10-
cancel-in-progress: true
9+
group: pages-${{ github.ref }}
10+
cancel-in-progress: false
1111

1212
permissions:
1313
contents: read
14-
pages: write
15-
id-token: write
1614

1715
jobs:
1816
build:
1917
runs-on: ubuntu-latest
2018
timeout-minutes: 20
2119
steps:
2220
- name: Checkout
23-
uses: actions/checkout@v4
21+
uses: actions/checkout@v7
22+
with:
23+
persist-credentials: false
2424

2525
- name: Setup pnpm
26-
uses: pnpm/action-setup@v4
26+
uses: pnpm/action-setup@v6
2727

2828
- name: Setup Node.js
29-
uses: actions/setup-node@v4
29+
uses: actions/setup-node@v7
3030
with:
3131
node-version: '24'
3232
cache: pnpm
3333

34-
- name: Configure GitHub Pages
35-
uses: actions/configure-pages@v5
36-
3734
- name: Install dependencies
3835
run: pnpm install --frozen-lockfile
3936

@@ -43,34 +40,24 @@ jobs:
4340
- name: Build static Blocks site
4441
run: pnpm build:pages
4542

46-
- name: Assemble Pages artifact
47-
run: |
48-
rm -rf _site
49-
mkdir -p _site/r
50-
cp -R apps/blocks/out/. _site/
51-
cp apps/registry/public/r/*.json _site/r/
52-
test -f _site/index.html
53-
test -f _site/blocks/index.html
54-
test -f _site/r/registry.json
55-
test -f _site/r/chat.json
56-
test -f _site/r/schema-builder.json
57-
grep -q '/blocks/_next/' _site/index.html
58-
! grep -R 'github.io/dashboard' _site
59-
6043
- name: Upload Pages artifact
61-
uses: actions/upload-pages-artifact@v4
44+
uses: actions/upload-pages-artifact@v5
6245
with:
63-
path: _site
46+
path: .artifacts/pages
6447

6548
deploy:
49+
if: github.ref == 'refs/heads/main'
6650
needs: build
6751
runs-on: ubuntu-latest
52+
permissions:
53+
pages: write
54+
id-token: write
6855
environment:
6956
name: github-pages
7057
url: ${{ steps.deployment.outputs.page_url }}
7158
steps:
7259
- name: Deploy GitHub Pages
7360
id: deployment
74-
uses: actions/deploy-pages@v4
61+
uses: actions/deploy-pages@v5
7562

7663
# npm publication is a maintainer-run local process and is intentionally absent.

apps/blocks/src/app/sitemap.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { MetadataRoute } from 'next';
22

33
import { BASE_PRIMITIVES } from '@/lib/base-primitives';
4-
import { SITE_ORIGIN, withBase } from '@/lib/site';
4+
import { BASE_PATH, SITE_ORIGIN, withBase } from '@/lib/site';
55

66
export const dynamic = 'force-static';
77

@@ -12,9 +12,10 @@ export default function sitemap(): MetadataRoute.Sitemap {
1212
'/blocks/styling',
1313
...BASE_PRIMITIVES.map(({ name }) => `/blocks/ui/${name}`),
1414
];
15+
const trailingSlash = BASE_PATH ? '/' : '';
1516

1617
return paths.map((path) => ({
17-
url: `${SITE_ORIGIN}${withBase(path)}`,
18+
url: `${SITE_ORIGIN}${withBase(path)}${trailingSlash}`,
1819
changeFrequency: path === '/' ? 'weekly' : 'monthly',
1920
priority: path === '/' ? 1 : path === '/blocks' || path === '/blocks/styling' ? 0.9 : 0.7,
2021
}));

apps/blocks/src/components/docs/demos/ui-breadcrumb.demo.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
'use client';
22

3+
import Link from 'next/link';
4+
35
import {
46
Breadcrumb,
57
BreadcrumbEllipsis,
@@ -19,11 +21,15 @@ export function BasicBreadcrumbDemo() {
1921
<Breadcrumb aria-label="Component location">
2022
<BreadcrumbList>
2123
<BreadcrumbItem>
22-
<BreadcrumbLink href="/">Constructive</BreadcrumbLink>
24+
<BreadcrumbLink asChild>
25+
<Link href="/">Constructive</Link>
26+
</BreadcrumbLink>
2327
</BreadcrumbItem>
2428
<BreadcrumbSeparator />
2529
<BreadcrumbItem>
26-
<BreadcrumbLink href="/blocks">Components</BreadcrumbLink>
30+
<BreadcrumbLink asChild>
31+
<Link href="/blocks">Components</Link>
32+
</BreadcrumbLink>
2733
</BreadcrumbItem>
2834
<BreadcrumbSeparator />
2935
<BreadcrumbItem>
@@ -43,15 +49,19 @@ export function CollapsedBreadcrumbDemo() {
4349
<Breadcrumb aria-label="Collapsed component location">
4450
<BreadcrumbList>
4551
<BreadcrumbItem>
46-
<BreadcrumbLink href="/">Constructive</BreadcrumbLink>
52+
<BreadcrumbLink asChild>
53+
<Link href="/">Constructive</Link>
54+
</BreadcrumbLink>
4755
</BreadcrumbItem>
4856
<BreadcrumbSeparator />
4957
<BreadcrumbItem>
5058
<BreadcrumbEllipsis />
5159
</BreadcrumbItem>
5260
<BreadcrumbSeparator />
5361
<BreadcrumbItem>
54-
<BreadcrumbLink href="/blocks">Components</BreadcrumbLink>
62+
<BreadcrumbLink asChild>
63+
<Link href="/blocks">Components</Link>
64+
</BreadcrumbLink>
5565
</BreadcrumbItem>
5666
<BreadcrumbSeparator />
5767
<BreadcrumbItem>
@@ -71,11 +81,15 @@ export function CustomSeparatorBreadcrumbDemo() {
7181
<Breadcrumb aria-label="Settings location">
7282
<BreadcrumbList>
7383
<BreadcrumbItem>
74-
<BreadcrumbLink href="/">Constructive</BreadcrumbLink>
84+
<BreadcrumbLink asChild>
85+
<Link href="/">Constructive</Link>
86+
</BreadcrumbLink>
7587
</BreadcrumbItem>
7688
<BreadcrumbSeparator>/</BreadcrumbSeparator>
7789
<BreadcrumbItem>
78-
<BreadcrumbLink href="/blocks">Components</BreadcrumbLink>
90+
<BreadcrumbLink asChild>
91+
<Link href="/blocks">Components</Link>
92+
</BreadcrumbLink>
7993
</BreadcrumbItem>
8094
<BreadcrumbSeparator>/</BreadcrumbSeparator>
8195
<BreadcrumbItem>

apps/blocks/src/components/docs/demos/ui-card.demo.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use client';
22

3+
import Link from 'next/link';
34
import { ArrowUpRight, MoreHorizontal, TrendingUp } from 'lucide-react';
45

56
import { Badge } from '@constructive-io/ui/badge';
@@ -78,7 +79,7 @@ export function CardVariantsDemo() {
7879
export function InteractiveCardDemo() {
7980
return (
8081
<Demo>
81-
<a
82+
<Link
8283
href="/blocks/ui/card"
8384
className="block w-full max-w-sm rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
8485
>
@@ -91,7 +92,7 @@ export function InteractiveCardDemo() {
9192
<CardDescription>Inspect database health, queries, and recent deployments.</CardDescription>
9293
</CardHeader>
9394
</Card>
94-
</a>
95+
</Link>
9596
</Demo>
9697
);
9798
}

0 commit comments

Comments
 (0)