Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 190 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
name: CI

on:
pull_request:
branches: [main]

env:
DATABASE_URL: postgres://beacon:beacon@localhost:5432/beacon?sslmode=disable
PORT: 4000

jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: extractions/setup-just@v2

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"

- uses: erlef/setup-beam@v1
with:
otp-version: "28"
gleam-version: "1.13"
rebar3-version: "3.25"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Lint
run: just lint

test-sdk:
name: Test SDK
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: extractions/setup-just@v2

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Test SDK
run: just test-sdk

test-api:
name: Test API
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: extractions/setup-just@v2

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"

- uses: erlef/setup-beam@v1
with:
otp-version: "28"
gleam-version: "1.13"
rebar3-version: "3.25"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Download Gleam deps
run: cd apps/api && gleam deps download

- name: Test API
run: just test-api

test-dashboard:
name: Test Dashboard
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: extractions/setup-just@v2

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Test Dashboard
run: just test-dashboard

bench-size:
name: SDK Bundle Size
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: extractions/setup-just@v2

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build SDK
run: just build-sdk

- name: Check bundle size
run: just bench-sdk-size

test-integration:
name: Integration Tests
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_USER: beacon
POSTGRES_PASSWORD: beacon
POSTGRES_DB: beacon
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U beacon"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- uses: extractions/setup-just@v2

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"

- uses: erlef/setup-beam@v1
with:
otp-version: "28"
gleam-version: "1.13"
rebar3-version: "3.25"

- name: Install dbmate
run: |
curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64
chmod +x /usr/local/bin/dbmate

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Download Gleam deps
run: cd apps/api && gleam deps download

- name: Run migrations
run: just db-migrate

- name: Build API
run: just build-api

- name: Start API server
run: |
cd apps/api && gleam run -m beacon &
for i in {1..30}; do
curl -s http://localhost:4000/health && break
sleep 1
done

- name: Run integration tests
run: just test-integration
78 changes: 78 additions & 0 deletions .github/workflows/load-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Load Tests

on:
pull_request:
branches: [main]

env:
DATABASE_URL: postgres://beacon:beacon@localhost:5432/beacon?sslmode=disable
PORT: 4000

jobs:
load-test:
name: k6 Load Test
runs-on: ubuntu-latest
continue-on-error: true
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_USER: beacon
POSTGRES_PASSWORD: beacon
POSTGRES_DB: beacon
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U beacon"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- uses: extractions/setup-just@v2

- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"

- uses: erlef/setup-beam@v1
with:
otp-version: "28"
gleam-version: "1.13"
rebar3-version: "3.25"

- uses: grafana/setup-k6-action@v1

- name: Install dbmate
run: |
curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64
chmod +x /usr/local/bin/dbmate

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Download Gleam deps
run: cd apps/api && gleam deps download

- name: Run migrations
run: just db-migrate

- name: Build API
run: just build-api

- name: Start API server
run: |
cd apps/api && gleam run -m beacon &
for i in {1..30}; do
curl -s http://localhost:4000/health && break
sleep 1
done

- name: Run load test
run: k6 run --quiet scripts/load-test.k6.js

- name: Validate persistence
run: just bench-validate
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,4 @@ For detailed documentation, see the `docs/` folder:
- [API Reference](docs/api.md) - Server endpoints
- [WebSocket Protocol](docs/protocol.md) - Wire protocol
- [Identity Tracking](docs/identity.md) - User identification system
- [CI/CD](docs/ci.md) - GitHub Actions workflows
34 changes: 34 additions & 0 deletions apps/dashboard/eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import js from "@eslint/js";
import svelte from "eslint-plugin-svelte";
import ts from "typescript-eslint";
import globals from "globals";

export default ts.config(
js.configs.recommended,
...ts.configs.recommended,
...svelte.configs.recommended,
{
languageOptions: {
globals: {
...globals.browser,
...globals.node,
},
},
},
{
files: ["**/*.svelte", "**/*.svelte.ts"],
languageOptions: {
parserOptions: {
parser: ts.parser,
},
},
rules: {
// TODO: fix these in a future PR
"svelte/no-navigation-without-resolve": "off",
"svelte/require-each-key": "off",
},
},
{
ignores: [".svelte-kit/", "build/", "node_modules/"],
},
);
8 changes: 6 additions & 2 deletions apps/dashboard/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,30 @@
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"test": "vitest",
"test": "vitest --passWithNoTests",
"lint": "eslint .",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"zero": "dotenv -- zero-cache-dev --schema-path=src/lib/zero/schema.ts"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
"@sveltejs/adapter-node": "^5.2.0",
"@sveltejs/kit": "^2.49.0",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@types/node": "^22.0.0",
"autoprefixer": "^10.4.20",
"dotenv-cli": "^11.0.0",
"eslint": "^9.15.0",
"eslint-plugin-svelte": "^3.13.0",
"globals": "^16.5.0",
"postcss": "^8.4.49",
"svelte": "^5.45.2",
"svelte-check": "^4.1.0",
"tailwindcss": "^3.4.15",
"typescript": "^5.7.0",
"typescript-eslint": "^8.48.0",
"vite": "^6.0.0",
"vitest": "^2.1.0"
"vitest": "^4.0.0"
},
"dependencies": {
"@rocicorp/zero": "^0.24.3000000000",
Expand Down
1 change: 1 addition & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ just lint # Lint and format
| [WebSocket Protocol](./protocol.md) | Wire protocol specification |
| [Identity Tracking](./identity.md) | User identification system |
| [Benchmarking](./bench.md) | Performance benchmarks |
| [CI/CD](./ci.md) | GitHub Actions workflows |

## Environment

Expand Down
Loading