Skip to content

Commit b5cfafb

Browse files
perf(ui+ci): cache build artifacts and run vite in single process
Introduce a content-addressable cache for the embedded UI HTML and refactor the build script to invoke vite once per Node process instead of three times. * New ui/scripts/build.mjs runs vite build() in a loop within one process, removing the cross-env dev dependency and avoiding redundant plugin/JIT warm-up. Local build time drops from ~2.4s to ~1.5s. * New .github/actions/build-ui composite action restores pkg/github/ui_dist/{get-me,issue-write,pr-write}.html from cache keyed on hashes of ui/ sources and the lockfile. On cache hit it skips Node setup and the build entirely; on miss it sets up Node and runs script/build-ui as before. Saves ~6s per workflow on Go-only PRs, which is the common case across seven workflows. * Replace the duplicated setup-node + Build UI pair in seven workflows (go, lint, docs-check, license-check, goreleaser, mcp-diff, code-scanning) with a single uses: ./.github/actions/build-ui line. code-scanning keeps a dedicated setup-node for the JavaScript CodeQL path. Output files are byte-identical to the pre-refactor build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent bce4a16 commit b5cfafb

11 files changed

Lines changed: 68 additions & 74 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: Build UI
2+
description: Restore cached UI HTML artifacts, or set up Node and run script/build-ui on cache miss.
3+
4+
runs:
5+
using: composite
6+
steps:
7+
- name: Cache UI artifacts
8+
id: cache-ui
9+
uses: actions/cache@v5
10+
with:
11+
path: |
12+
pkg/github/ui_dist/get-me.html
13+
pkg/github/ui_dist/issue-write.html
14+
pkg/github/ui_dist/pr-write.html
15+
key: ui-dist-v1-${{ hashFiles('ui/package-lock.json', 'ui/package.json', 'ui/index.html', 'ui/tsconfig*.json', 'ui/vite.config.ts', 'ui/src/**', 'ui/scripts/**') }}
16+
17+
- name: Set up Node.js
18+
if: steps.cache-ui.outputs.cache-hit != 'true'
19+
uses: actions/setup-node@v6
20+
with:
21+
node-version: "20"
22+
cache: npm
23+
cache-dependency-path: ui/package-lock.json
24+
25+
- name: Build UI
26+
if: steps.cache-ui.outputs.cache-hit != 'true'
27+
shell: bash
28+
run: script/build-ui
29+
30+
- name: Report UI cache status
31+
shell: bash
32+
run: |
33+
if [ "${{ steps.cache-ui.outputs.cache-hit }}" = "true" ]; then
34+
echo "UI artifacts restored from cache (skipped build)."
35+
else
36+
echo "UI artifacts rebuilt from source."
37+
fi

.github/workflows/code-scanning.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ jobs:
7878
go-version: ${{ fromJSON(steps.resolve-environment.outputs.environment).configuration.go.version }}
7979
cache: false
8080

81-
- name: Set up Node.js
82-
if: matrix.language == 'go' || matrix.language == 'javascript'
81+
- name: Set up Node.js (for JavaScript CodeQL)
82+
if: matrix.language == 'javascript'
8383
uses: actions/setup-node@v6
8484
with:
8585
node-version: "20"
@@ -88,7 +88,7 @@ jobs:
8888

8989
- name: Build UI
9090
if: matrix.language == 'go'
91-
run: script/build-ui
91+
uses: ./.github/actions/build-ui
9292

9393
- name: Autobuild
9494
uses: github/codeql-action/autobuild@v4

.github/workflows/docs-check.yml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,8 @@ jobs:
1616
- name: Checkout code
1717
uses: actions/checkout@v6
1818

19-
- name: Set up Node.js
20-
uses: actions/setup-node@v6
21-
with:
22-
node-version: "20"
23-
cache: "npm"
24-
cache-dependency-path: ui/package-lock.json
25-
2619
- name: Build UI
27-
run: script/build-ui
20+
uses: ./.github/actions/build-ui
2821

2922
- name: Set up Go
3023
uses: actions/setup-go@v6

.github/workflows/go.yml

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,8 @@ jobs:
2525
- name: Check out code
2626
uses: actions/checkout@v6
2727

28-
- name: Set up Node.js
29-
uses: actions/setup-node@v6
30-
with:
31-
node-version: "20"
32-
cache: "npm"
33-
cache-dependency-path: ui/package-lock.json
34-
3528
- name: Build UI
36-
shell: bash
37-
run: script/build-ui
29+
uses: ./.github/actions/build-ui
3830

3931
- name: Set up Go
4032
uses: actions/setup-go@v6

.github/workflows/goreleaser.yml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,8 @@ jobs:
1616
- name: Check out code
1717
uses: actions/checkout@v6
1818

19-
- name: Set up Node.js
20-
uses: actions/setup-node@v6
21-
with:
22-
node-version: "20"
23-
cache: "npm"
24-
cache-dependency-path: ui/package-lock.json
25-
2619
- name: Build UI
27-
run: script/build-ui
20+
uses: ./.github/actions/build-ui
2821

2922
- name: Set up Go
3023
uses: actions/setup-go@v6

.github/workflows/license-check.yml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,8 @@ jobs:
3232
GH_TOKEN: ${{ github.token }}
3333
run: gh pr checkout ${{ github.event.pull_request.number }}
3434

35-
- name: Set up Node.js
36-
uses: actions/setup-node@v6
37-
with:
38-
node-version: "20"
39-
cache: "npm"
40-
cache-dependency-path: ui/package-lock.json
41-
4235
- name: Build UI
43-
run: script/build-ui
36+
uses: ./.github/actions/build-ui
4437

4538
- name: Set up Go
4639
uses: actions/setup-go@v6

.github/workflows/lint.yml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,8 @@ jobs:
1414
runs-on: ubuntu-latest
1515
steps:
1616
- uses: actions/checkout@v6
17-
- uses: actions/setup-node@v6
18-
with:
19-
node-version: "20"
20-
cache: "npm"
21-
cache-dependency-path: ui/package-lock.json
2217
- name: Build UI
23-
run: script/build-ui
18+
uses: ./.github/actions/build-ui
2419
- uses: actions/setup-go@v6
2520
with:
2621
go-version: '1.25'

.github/workflows/mcp-diff.yml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,8 @@ jobs:
1919
with:
2020
fetch-depth: 0
2121

22-
- name: Set up Node.js
23-
uses: actions/setup-node@v6
24-
with:
25-
node-version: '20'
26-
2722
- name: Build UI
28-
run: script/build-ui
23+
uses: ./.github/actions/build-ui
2924

3025
- name: Run MCP Server Diff
3126
uses: SamMorrowDrums/mcp-server-diff@v2.3.5

ui/package-lock.json

Lines changed: 7 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ui/package.json

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88
"node": "^20.19.0 || >=22.12.0"
99
},
1010
"scripts": {
11-
"build": "npm run build:get-me && npm run build:issue-write && npm run build:pr-write",
12-
"build:get-me": "cross-env APP=get-me vite build",
13-
"build:issue-write": "cross-env APP=issue-write vite build",
14-
"build:pr-write": "cross-env APP=pr-write vite build",
11+
"build": "node scripts/build.mjs",
1512
"dev": "npm run build",
1613
"typecheck": "tsc --noEmit",
1714
"clean": "rm -rf dist"
@@ -31,7 +28,6 @@
3128
"@types/react": "^18.0.0",
3229
"@types/react-dom": "^18.0.0",
3330
"@vitejs/plugin-react": "^6.0.2",
34-
"cross-env": "^7.0.3",
3531
"typescript": "^5.7.0",
3632
"vite": "^8.0.13",
3733
"vite-plugin-singlefile": "^2.3.3"

0 commit comments

Comments
 (0)