Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2f1bdec676 | |||
| f3ae249ab1 | |||
| b5f31542a2 |
@@ -23,7 +23,7 @@ env:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
if: github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/docs-v')
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@@ -56,7 +56,7 @@ jobs:
|
|||||||
echo "version=$(echo "$TAG" | sed -E 's/docs-v([0-9.]+).*/\1/')" >> "$GITHUB_OUTPUT"
|
echo "version=$(echo "$TAG" | sed -E 's/docs-v([0-9.]+).*/\1/')" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
build-and-push:
|
build-and-push:
|
||||||
needs: [parse-tag]
|
needs: [test, parse-tag]
|
||||||
if: startsWith(github.ref, 'refs/tags/docs-v')
|
if: startsWith(github.ref, 'refs/tags/docs-v')
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
@@ -97,15 +97,18 @@ jobs:
|
|||||||
git config user.email "ci-bot@sova.local"
|
git config user.email "ci-bot@sova.local"
|
||||||
git config user.name "sova-ci"
|
git config user.name "sova-ci"
|
||||||
MAX_RETRIES=5
|
MAX_RETRIES=5
|
||||||
bump_values() {
|
case "$(uname -m)" in
|
||||||
local file="apps/docs/values-${ENV}.yaml"
|
x86_64|amd64) YQ_ARCH=amd64 ;;
|
||||||
sed -i "s|^ repository:.*| repository: ${IMAGE_DEPLOY}|" "$file"
|
aarch64|arm64) YQ_ARCH=arm64 ;;
|
||||||
sed -i "s|^ tag:.*| tag: ${TAG}|" "$file"
|
*) echo "Unsupported arch: $(uname -m)"; exit 1 ;;
|
||||||
sed -i "s|^ pullPolicy:.*| pullPolicy: IfNotPresent|" "$file"
|
esac
|
||||||
}
|
curl -sSL -o /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/download/v4.44.3/yq_linux_${YQ_ARCH}"
|
||||||
|
chmod +x /usr/local/bin/yq
|
||||||
for attempt in $(seq 1 $MAX_RETRIES); do
|
for attempt in $(seq 1 $MAX_RETRIES); do
|
||||||
git pull --rebase origin "${ENV}"
|
git pull --rebase origin "${ENV}"
|
||||||
bump_values
|
yq -i ".image.repository = \"${IMAGE_DEPLOY}\"" "apps/docs/values-${ENV}.yaml"
|
||||||
|
yq -i ".image.tag = \"${TAG}\"" "apps/docs/values-${ENV}.yaml"
|
||||||
|
yq -i ".image.pullPolicy = \"IfNotPresent\"" "apps/docs/values-${ENV}.yaml"
|
||||||
git add "apps/docs/values-${ENV}.yaml"
|
git add "apps/docs/values-${ENV}.yaml"
|
||||||
git diff --cached --quiet && { echo "No changes"; exit 0; }
|
git diff --cached --quiet && { echo "No changes"; exit 0; }
|
||||||
git commit -m "chore(docs): bump ${ENV} to ${TAG}"
|
git commit -m "chore(docs): bump ${ENV} to ${TAG}"
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ export default defineConfig({
|
|||||||
items: [
|
items: [
|
||||||
{ text: 'Docker Compose', link: '/infrastructure/docker' },
|
{ text: 'Docker Compose', link: '/infrastructure/docker' },
|
||||||
{ text: 'K8s + Terraform + ArgoCD + Gitea', link: '/infrastructure/k8s-cicd-platform-plan' },
|
{ text: 'K8s + Terraform + ArgoCD + Gitea', link: '/infrastructure/k8s-cicd-platform-plan' },
|
||||||
|
{ text: 'Автотестирование (issues/27-test)', link: '/infrastructure/autotesting' },
|
||||||
{ text: 'Backend: внешние сервисы (test/stage/prod)', link: '/infrastructure/backend-external-services' },
|
{ text: 'Backend: внешние сервисы (test/stage/prod)', link: '/infrastructure/backend-external-services' },
|
||||||
{
|
{
|
||||||
text: 'Локальная ферма k8s (Multipass)',
|
text: 'Локальная ферма k8s (Multipass)',
|
||||||
|
|||||||
@@ -0,0 +1,107 @@
|
|||||||
|
# Автотестирование Sova
|
||||||
|
|
||||||
|
Ветка внедрения: **`issues/27-test`** в репозиториях `k8s/sova-*`.
|
||||||
|
|
||||||
|
## Правило по контурам
|
||||||
|
|
||||||
|
| Контур (тег) | Тесты в CI | E2E |
|
||||||
|
|--------------|------------|-----|
|
||||||
|
| **`*-test`** | Unit + integration (backend), Jest (adminpanel), PHPUnit (cabinet) | Smoke + full (Playwright, mocks) |
|
||||||
|
| **`*-stage`** | То же pre-deploy | Только smoke read-only |
|
||||||
|
| **`*-prod`** | **Нет** автотестов | **Нет** |
|
||||||
|
|
||||||
|
Тесты **никогда** не гоняются на production-окружении. Запуск привязан к git-тегам `backend-v*`, `adminpanel-v*`, … в Gitea Actions.
|
||||||
|
|
||||||
|
## Пирамида
|
||||||
|
|
||||||
|
### 1. Backend (`sova-backend`)
|
||||||
|
|
||||||
|
- **Инструменты:** PHPUnit 12, Zenstruck Foundry (далее).
|
||||||
|
- **Unit:** `tests/Unit`, `tests/Service` — без БД.
|
||||||
|
- **Integration:** `tests/Controller`, `tests/Integration` — с PostgreSQL в CI (только тег `*-test`, `continue-on-error` на старте).
|
||||||
|
- **Логи E2E:** `App\Log\TestTraceProcessor` — заголовки `X-Is-Auto-Test`, `X-Test-Trace-Id` → `extra.is_test`, `extra.test_trace_id` в Loki.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer phpunit:unit
|
||||||
|
composer phpunit:coverage # var/coverage/clover.xml
|
||||||
|
```
|
||||||
|
|
||||||
|
**CI:** `.gitea/workflows/build.yml` — job `test` на `test|stage`, артефакт `backend-coverage-*` (14 дней).
|
||||||
|
|
||||||
|
### 2. adminPanel (`sova-adminpanel`)
|
||||||
|
|
||||||
|
- **Инструменты:** Jest + React Testing Library (миграция на Vitest — в roadmap).
|
||||||
|
- **CI:** `npm run test:ci` (coverage lcov), lint, build до образа.
|
||||||
|
|
||||||
|
### 3. E2E (`sova-e2e`)
|
||||||
|
|
||||||
|
- **Инструменты:** Playwright.
|
||||||
|
- **Проекты:** `smoke-readonly` (stage), `full-e2e` (test, сценарии в `tests/e2e/`).
|
||||||
|
- **CI:** `.gitea/workflows/e2e-tests.yml` — `workflow_dispatch` или тег `e2e-v*-*`.
|
||||||
|
|
||||||
|
Локально:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd k8s/sova-e2e
|
||||||
|
npm install && npx playwright install chromium
|
||||||
|
export API_BASE_URL=http://192.168.252.6 API_HOST=api.test.sova.local
|
||||||
|
npm run test:smoke
|
||||||
|
```
|
||||||
|
|
||||||
|
## Loki (Grafana Explore)
|
||||||
|
|
||||||
|
После деплоя с прогоном E2E:
|
||||||
|
|
||||||
|
```logql
|
||||||
|
{namespace="sova-test"} | json | extra_is_test="true" | extra_test_trace_id="<GITHUB_RUN_ID>"
|
||||||
|
```
|
||||||
|
|
||||||
|
## CI/CD: две фазы
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
tag[Git tag *-test] --> pre[Pre-deploy: unit/coverage]
|
||||||
|
pre --> build[Build image]
|
||||||
|
build --> deploy[sova-deploy GitOps]
|
||||||
|
deploy --> e2e[Post-deploy: sova-e2e]
|
||||||
|
```
|
||||||
|
|
||||||
|
1. **Pre-deploy** — в workflow каждого приложения (`build.yml`).
|
||||||
|
2. **Post-deploy** — репозиторий `sova-e2e`, ожидание Argo CD (`scripts/wait-for-argocd.sh`), отчёт Playwright HTML в artifacts.
|
||||||
|
|
||||||
|
## Проверка деплоя на test (локальная ферма)
|
||||||
|
|
||||||
|
После `./scripts/release-tag.sh backend backend-v1.0.6-test test` (и аналоги для adminpanel, cabinet, docs):
|
||||||
|
|
||||||
|
| Проверка | Команда / URL |
|
||||||
|
|----------|----------------|
|
||||||
|
| Образы в кластере | `kubectl get deploy -n sova-test` → теги `*-v1.0.x-test` |
|
||||||
|
| API smoke | `curl -H "Host: api.test.sova.local" http://192.168.252.6/news/list` |
|
||||||
|
| admin login | `curl -H "Host: admin.test.sova.local" http://192.168.252.6/login` |
|
||||||
|
| Docs | `curl -H "Host: docs.sova.local" http://192.168.252.6/` (или `docs.test.sova.local` после sync ingress) |
|
||||||
|
| Playwright | `cd sova-e2e && npm run test:smoke` |
|
||||||
|
|
||||||
|
Gitea Actions: артефакты `backend-coverage-*`, `adminpanel-coverage-*` (14 дней).
|
||||||
|
|
||||||
|
## Покрытие (test contour)
|
||||||
|
|
||||||
|
При теге `backend-v1.0.x-test` / `adminpanel-v1.0.x-test` в Gitea Actions → **Artifacts**:
|
||||||
|
|
||||||
|
- `backend-coverage-<tag>/` — Clover + HTML
|
||||||
|
- `adminpanel-coverage-<tag>/` — lcov
|
||||||
|
|
||||||
|
Просмотр: скачать артефакт job `test` или открыть summary в логе (`coverage` text-summary).
|
||||||
|
|
||||||
|
## Дорожная карта
|
||||||
|
|
||||||
|
| Месяц | Задачи |
|
||||||
|
|-------|--------|
|
||||||
|
| **1** (текущая ветка) | PHPUnit unit + coverage, Jest CI, TestTraceProcessor, sova-e2e smoke, документация |
|
||||||
|
| **2** | PG в runner, миграции, SpecialistRepository integration; 3 smoke в пайплайне |
|
||||||
|
| **3** | Full E2E JWT/CRUD/запись; nightly test; Telegram alerts |
|
||||||
|
|
||||||
|
## Связанные страницы
|
||||||
|
|
||||||
|
- [CI/CD и Loki (local-k8s)](./local-k8s/ci-and-logs)
|
||||||
|
- [Gitea CI (test-contour)](./test-contour/guides/gitea-ci)
|
||||||
|
- [Backend content CRUD](../apps/backend-content-crud)
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
| [CI/CD и Loki](./ci-and-logs) | теги, registry, Grafana Explore |
|
| [CI/CD и Loki](./ci-and-logs) | теги, registry, Grafana Explore |
|
||||||
| [Чеклист проверки](./checklist-verify) | smoke после поднятия |
|
| [Чеклист проверки](./checklist-verify) | smoke после поднятия |
|
||||||
| [Git-flow (кратко)](./git-flow) | ветки, теги → [полная версия](../test-contour/git-flow) |
|
| [Git-flow (кратко)](./git-flow) | ветки, теги → [полная версия](../test-contour/git-flow) |
|
||||||
|
| [Автотестирование](../autotesting) | ветка `issues/27-test`, CI, coverage, Playwright |
|
||||||
|
|
||||||
План платформы: [K8s + Terraform + ArgoCD](../k8s-cicd-platform-plan).
|
План платформы: [K8s + Terraform + ArgoCD](../k8s-cicd-platform-plan).
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user