name: CI Checks
on:
pull_request:
branches: [dev, main]
push:
branches: [dev, main]
permissions:
contents: read
env:
NODE_VERSION: "24.20.0"
jobs:
server:
name: Go server checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: server/go.mod
cache-dependency-path: server/go.sum
- name: Vet
working-directory: server
run: go vet ./...
- name: Test
working-directory: server
run: go test -v ./...
- name: Build
working-directory: server
env:
CGO_ENABLED: "0"
run: go build -trimpath -o /tmp/knowforge-server .
server-db:
name: Go tests on ${{ matrix.db }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- db: postgres
port: 5432
user: postgres
- db: mysql
port: 3306
user: root
services:
postgres:
image: ${{ matrix.db == 'postgres' && 'postgres:16-alpine' || '' }}
env:
POSTGRES_PASSWORD: kftest
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres"
--health-interval 5s --health-timeout 5s --health-retries 20
mysql:
image: ${{ matrix.db == 'mysql' && 'mysql:8.4' || '' }}
env:
MYSQL_ROOT_PASSWORD: kftest
ports:
- 3306:3306
options: >-
--health-cmd "mysqladmin ping -h 127.0.0.1 -uroot -pkftest"
--health-interval 5s --health-timeout 5s --health-retries 30
steps:
- uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: server/go.mod
cache-dependency-path: server/go.sum
- name: Test
working-directory: server
env:
KNOWFORGE_TEST_DB: ${{ matrix.db }}
KNOWFORGE_TEST_DB_HOST: 127.0.0.1
KNOWFORGE_TEST_DB_PORT: ${{ matrix.port }}
KNOWFORGE_TEST_DB_USER: ${{ matrix.user }}
KNOWFORGE_TEST_DB_PASSWORD: kftest
run: go test -p 4 ./...
web:
name: Web checks (typecheck + lint + test + build)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
cache-dependency-path: app/web/pnpm-lock.yaml
- name: Install dependencies
working-directory: app/web
run: pnpm install --frozen-lockfile
- name: Typecheck
working-directory: app/web
run: pnpm exec tsc --noEmit
- name: i18n check
working-directory: app/web
run: python3 scripts/check_i18n.py
- name: Test
working-directory: app/web
run: pnpm test
- name: Lint
working-directory: app/web
run: pnpm exec next lint
- name: Build (SSR standalone)
working-directory: app/web
env:
NEXT_DIST_DIR: .next-build
run: pnpm build
e2e:
name: End-to-end tests (Playwright)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: server/go.mod
cache-dependency-path: server/go.sum
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
cache-dependency-path: app/web/pnpm-lock.yaml
- name: Install dependencies
working-directory: app/web
run: pnpm install --frozen-lockfile
- name: Install Chromium
working-directory: app/web
run: pnpm exec playwright install --with-deps chromium
- name: Run end-to-end tests
working-directory: app/web
run: pnpm e2e
- name: Upload report
if: failure()
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: |
app/web/playwright-report
app/web/test-results
retention-days: 7