Netpulse_SasS/.forgejo/workflows/ci.yml
byrsapty a0eb2ff5f1
Some checks are pending
CI / web (push) Waiting to run
CI / server (push) Waiting to run
CI / agent (push) Waiting to run
Пакування: образи, повний стек, TLS, CI, процедура бекапу
Два образи замість пʼяти: серверні команди їдуть з одного модуля й
мусять ходити в схему БД однією версією, а зонд лишається окремо —
у чужій мережі йому не місце з 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>
2026-08-25 12:47:54 +03:00

125 lines
3.6 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Складання і перевірки 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