ci.yml RawHistoryFolder
1name: CI
2
3on:
4 push:
5 branches: [main]
6 paths:
7 - '**.go'
8 - '**.js'
9 - '**.css'
10 - 'go.mod'
11 - 'go.sum'
12 - 'package.json'
13 - 'package-lock.json'
14 - 'internal/htmlharness/**'
15 - '.golangci.yml'
16 - '.github/workflows/**'
17 pull_request:
18 paths:
19 - '**.go'
20 - '**.js'
21 - '**.css'
22 - 'go.mod'
23 - 'go.sum'
24 - 'package.json'
25 - 'package-lock.json'
26 - 'internal/htmlharness/**'
27 - '.golangci.yml'
28 - '.github/workflows/**'
29
30permissions:
31 contents: read
32
33jobs:
34 ci:
35 permissions:
36 contents: read
37 pull-requests: read
38 uses: bnema/gh-actions/.github/workflows/go-ci.yml@bdc22c9d0e0527bd1c369d4304034cdf2cde9ade # main
39 with:
40 go-version: stable
41 test-flags: '-race -v ./...'
42
43 browser:
44 runs-on: ubuntu-latest
45 timeout-minutes: 20
46 steps:
47 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
48 with:
49 persist-credentials: false
50 - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
51 with:
52 node-version: '24'
53 cache: npm
54 - run: npm ci
55 - run: npx playwright install --with-deps chromium firefox webkit
56 - run: npm run test:browser
57 - if: always()
58 uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
59 with:
60 name: browser-evidence
61 path: test-results/
62 retention-days: 14
63
64 quality:
65 needs: [ci, browser]
66 runs-on: ubuntu-latest
67 steps:
68 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
69 with:
70 persist-credentials: false
71 - uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7
72 with:
73 go-version: stable
74 - name: Check production import direction
75 shell: bash
76 run: |
77 if go list -f '{{join .Imports "\n"}}' . | grep -q '/ansi'; then
78 echo 'the VT root must not import the ANSI package'
79 exit 1
80 fi
81 if ! go list -f '{{join .Imports "\n"}}' ./ansi | grep -q '/core'; then
82 echo 'the ANSI package must consume the core model'
83 exit 1
84 fi
85 if ! go list -f '{{join .Imports "\n"}}' ./html | grep -q '/core'; then
86 echo 'the HTML package must consume the core model'
87 exit 1
88 fi
89 if ! go list -f '{{join .Imports "\n"}}' ./html/browser | grep -q '/html'; then
90 echo 'the browser adapter must consume the HTML package'
91 exit 1
92 fi
93 forbidden="$(go list -deps ./html/... | grep -E '^(github\.com/bnema/vev-vt$|github\.com/bnema/vev($|/)|net/http$|.*/websocket($|/))' || true)"
94 if [ -n "$forbidden" ]; then
95 echo "$forbidden"
96 exit 1
97 fi
98 - name: VT fuzz smoke
99 run: go test . -run '^$' -fuzz FuzzVTInputDoesNotPanic -fuzztime=10s
100 - name: ANSI fuzz smoke
101 run: go test . -run '^$' -fuzz FuzzANSIRenderingDoesNotPanic -fuzztime=10s
102 - name: VTH3 fuzz smoke
103 run: go test . -run '^$' -fuzz FuzzHistoryPreflightMatchesUnmarshal -fuzztime=10s
104 - name: HTML event fuzz smoke
105 run: go test ./html/browser -run '^$' -fuzz FuzzDecodeEvent -fuzztime=10s
106 - name: Benchmark smoke
107 run: go test ./... -run '^$' -bench='(VT|History|Snapshot|ANSI|Renderer)' -benchmem -benchtime=1x
108 - name: External consumer smoke
109 run: scripts/consumer-smoke.sh