Skip to content

feat: #1 scaffold Crate — monorepo, GraphQL API, Postgres, React client, tests, docs #1

feat: #1 scaffold Crate — monorepo, GraphQL API, Postgres, React client, tests, docs

feat: #1 scaffold Crate — monorepo, GraphQL API, Postgres, React client, tests, docs #1

Workflow file for this run

name: CI/CD
on:
pull_request:
branches: [main]
push:
branches: [main]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
quality:
name: Format, lint, typecheck, test, build
runs-on: [self-hosted, linux, x64]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10.33.0
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Check formatting
run: pnpm format:check
- name: Lint
run: pnpm lint
- name: Typecheck
run: pnpm typecheck
- name: Unit tests (server + client)
run: pnpm test
- name: Build (server + client)
run: pnpm build
# Bundle budget: fail the build if the main JS chunk creeps past 500 kB.
# This is one of our documented bærekraft measures — see docs/architecture.md.
- name: Enforce client bundle budget
run: |
set -euo pipefail
MAX_BYTES=512000
for f in client/dist/assets/*.js; do
size=$(stat -c%s "$f")
echo "$f = ${size} bytes"
if [ "$size" -gt "$MAX_BYTES" ]; then
echo "::error::Bundle budget exceeded: $f is ${size} bytes (max ${MAX_BYTES})."
exit 1
fi
done
deploy:
name: Deploy to the group VM
needs: quality
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: [self-hosted, linux, x64]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10.33.0
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build server and client
run: pnpm build
env:
VITE_GRAPHQL_URL: /graphql
- name: Deploy client to Apache
run: |
set -euo pipefail
find /var/www/html/project2 -mindepth 1 -delete
cp -r client/dist/. /var/www/html/project2/
chmod -R a+rX /var/www/html/project2
- name: Restart the GraphQL API
run: sudo systemctl restart crate-api
- name: Smoke check
run: |
set -euo pipefail
sleep 2
curl -fsS -o /dev/null -w 'GET /project2/ : %{http_code}\n' http://localhost/project2/
curl -fsS -o /dev/null -w 'POST /graphql : %{http_code}\n' \
-X POST http://localhost/graphql \
-H 'content-type: application/json' \
-d '{"query":"{ genres { name } }"}'