Два образи замість пʼяти: серверні команди їдуть з одного модуля й мусять ходити в схему БД однією версією, а зонд лишається окремо — у чужій мережі йому не місце з DSN і ключами шифрування. Стек піднімає БД, кеш, міграції, API, колектор і Caddy з автоматичним TLS. Міграції окремою службою, бо API піднімається в кількох примірниках і гонка за схему нікому не потрібна. deploy/README.md описує бекап як три речі: дамп, DEK і JWT-ключ. Без DEK дамп не відновлюється — у БД лише шифротекст. Дорогою виправлено .gitignore: голі "netpulse-agent" і "netpulse-server" ігнорували ще й каталоги cmd/ з кодом команд. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
125 lines
3.6 KiB
YAML
125 lines
3.6 KiB
YAML
# Складання і перевірки NetPulse на Forgejo Actions.
|
||
#
|
||
# Три роботи паралельно, а не одна послідовна: фронтенд, сервер і зонд
|
||
# ламаються незалежно, і чекати збірки Go заради помилки типізації в
|
||
# TypeScript — марно витрачений час на кожному пуші.
|
||
|
||
name: CI
|
||
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
pull_request:
|
||
|
||
env:
|
||
GO_VERSION: "1.25"
|
||
NODE_VERSION: "22"
|
||
|
||
jobs:
|
||
web:
|
||
runs-on: docker
|
||
container:
|
||
image: node:22-alpine
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Залежності
|
||
working-directory: web
|
||
run: npm ci
|
||
|
||
- name: Типи
|
||
working-directory: web
|
||
run: npx tsc --noEmit
|
||
|
||
- name: Збірка
|
||
working-directory: web
|
||
run: npm run build
|
||
|
||
- uses: actions/upload-artifact@v3
|
||
with:
|
||
name: web-dist
|
||
path: web/dist/
|
||
|
||
server:
|
||
runs-on: docker
|
||
container:
|
||
image: golang:1.25-alpine
|
||
services:
|
||
db:
|
||
image: timescale/timescaledb:2.17.2-pg16
|
||
env:
|
||
POSTGRES_USER: netpulse
|
||
POSTGRES_PASSWORD: netpulse
|
||
POSTGRES_DB: netpulse_ci
|
||
TIMESCALEDB_TELEMETRY: "off"
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Інструменти
|
||
run: apk add --no-cache git postgresql16-client
|
||
|
||
- name: Формат
|
||
working-directory: server
|
||
run: |
|
||
# gofmt -l друкує список, а не код виходу: без перевірки
|
||
# порожнечі крива форма проїжджає в main непоміченою.
|
||
bad=$(gofmt -l .)
|
||
if [ -n "$bad" ]; then
|
||
echo "не відформатовано:"; echo "$bad"; exit 1
|
||
fi
|
||
|
||
- name: Vet
|
||
working-directory: server
|
||
run: go vet ./...
|
||
|
||
- name: Схема
|
||
working-directory: server
|
||
env:
|
||
NETPULSE_DSN: postgres://netpulse:netpulse@db:5432/netpulse_ci?sslmode=disable
|
||
run: |
|
||
until pg_isready -h db -U netpulse -d netpulse_ci; do sleep 1; done
|
||
go run ./cmd/netpulse-migrate
|
||
|
||
- name: Тести
|
||
working-directory: server
|
||
env:
|
||
NETPULSE_TEST_DSN: postgres://netpulse:netpulse@db:5432/netpulse_ci?sslmode=disable
|
||
run: go test ./...
|
||
|
||
agent:
|
||
runs-on: docker
|
||
container:
|
||
image: golang:1.25-alpine
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Інструменти
|
||
run: apk add --no-cache git
|
||
|
||
- name: Формат
|
||
working-directory: agent
|
||
run: |
|
||
bad=$(gofmt -l .)
|
||
if [ -n "$bad" ]; then
|
||
echo "не відформатовано:"; echo "$bad"; exit 1
|
||
fi
|
||
|
||
- name: Vet
|
||
working-directory: agent
|
||
run: go vet ./...
|
||
|
||
- name: Тести
|
||
working-directory: agent
|
||
run: go test ./...
|
||
|
||
# Зонд їде на чуже залізо: перевіряємо, що збирається під усі
|
||
# платформи, які обіцяємо, а не лише під ту, де крутиться CI.
|
||
- name: Крос-збірка
|
||
working-directory: agent
|
||
run: |
|
||
for target in linux/amd64 linux/arm64 linux/arm windows/amd64 darwin/arm64; do
|
||
os=${target%/*}; arch=${target#*/}
|
||
echo "== $os/$arch"
|
||
CGO_ENABLED=0 GOOS=$os GOARCH=$arch go build -trimpath \
|
||
-o /tmp/netpulse-agent-$os-$arch ./cmd/netpulse-agent
|
||
done
|