flyway check
All checks were successful
CI and deploy / migration-check (push) Successful in 3s
CI and deploy / deploy (push) Successful in 14s

This commit is contained in:
Dusan Vojacek
2026-04-19 14:11:57 +02:00
parent 477e94f321
commit 906eeb1609
8 changed files with 200 additions and 68 deletions

View File

@@ -43,10 +43,12 @@ flowchart LR
dev[Dev laptop] -->|git push| gitea[Gitea main]
gitea --> act[Gitea Actions]
act --> runner[act_runner + Docker]
runner --> job[Job container Alpine + sock + /opt mount]
runner --> ci[migration-check validate]
ci -->|needs ok| job[deploy job + /opt mount]
job --> sh[deploy.sh]
sh --> git[git fetch / reset main]
sh --> sync[install compose.yml]
sh --> fly[flyway validate then migrate]
sh --> dc["docker compose build && up -d"]
dc --> hostd[Host Docker Engine]
hostd --> ems[EMS stack]
@@ -55,7 +57,7 @@ flowchart LR
1. Vývoj lokálně, merge do `main`, push na `git.vojacek.eu:2222`.
2. Workflow `.gitea/workflows/deploy.yml` (label `self-hosted`) spustí job.
3. Job kontejner má `docker.sock` a rw mount `/opt/ems-deploy`; nainstaluje `git`, `bash`, `docker-cli`, `docker-cli-compose` (Alpine).
4. `/opt/ems-deploy/deploy.sh`: `flock`, `git` v `app/`, sync `docker-compose.yml`, `docker compose config`, `build`, `up -d`, `image prune -f`.
4. `/opt/ems-deploy/deploy.sh`: `flock`, `git` v `app/`, sync `docker-compose.yml`, `docker compose config`, **`flyway validate`** (soubory vs `flyway_schema_history` na DB), **`flyway migrate`**, `build`, `up -d`, `image prune -f`.
Build probíhá na **hostovském** Dockeru (stejný daemon jako Gitea stack), bez DinD.
@@ -123,14 +125,26 @@ Produkční compose mapuje frontend na **`127.0.0.1:8080`**, backend na **`127.0
---
## 7. CI: test vs deploy
## 7. CI a deploy (jeden workflow)
| Workflow | Účel | Poznámka |
|----------|------|----------|
| `.gitea/workflows/test.yml` | Smoke (soubory, layout) | `runs-on: self-hosted` + job `container: alpine/git` a checkout přes `git fetch` (ne `actions/checkout@v4` — ta potřebuje **Node** v job kontejneru, výchozí image act_runneru ho nemá → „Cannot find: node in PATH“). |
| `.gitea/workflows/deploy.yml` | Deploy po pushi na `main` | Job kontejner + mounty + viz sekce 5. |
| Soubor | Účel |
|--------|------|
| `.gitea/workflows/deploy.yml` | **`migration-check`** na `pull_request` a `push` (`main`, `feature/**`): checkout přes `git fetch` (bez Node), skript **neměnnosti** `scripts/ci_check_migration_immutability.sh` (proti `origin/main` nebo base SHA u PR), **`flyway validate`** proti DB z JDBC (viz secrets). **`deploy`** jen při `push` na `main`, **`needs: migration-check`** — pak `/opt/ems-deploy/deploy.sh`. |
`workflow_dispatch` na deploy umožňuje ruční opakování bez prázdného commitu.
**Gitea secrets (repo):**
| Secret | Účel |
|--------|------|
| `EMS_CI_FLYWAY_URL` | JDBC na staging / sdílenou DB s aktuální `flyway_schema_history` (např. `jdbc:postgresql://host:5432/ems`). Pokud **není** nastaveno, krok remote validate se **přeskočí** (varování v logu); immutability check pořád běží. |
| `EMS_CI_FLYWAY_USER` / `EMS_CI_FLYWAY_PASSWORD` | Volitelně, pokud nejsou v URL. |
Job **nemá** `container:` — potřebuje hostovský `docker` + `git` (stejně jako deploy). Runner: `valid_volumes` pro `/var/run/docker.sock` (sekce 5).
**Lokálně před commitem:** z kořene repa s rozjetým Postgres z `docker-compose.yml` a aspoň jednou proběhlým migrate spusť `./scripts/flyway_validate_local.sh` (`flyway validate` vůči lokální DB).
**Flyway `validate` vs `migrate`:** `validate` nekontroluje „dry-run“ celého SQL nové pending migrace; ověří hlavně shodu **již zapsaných** řádků ve `flyway_schema_history` se soubory v repu (checksumy atd.) — proto musí běžet proti **běžící** DB. `migrate` teprve aplikuje pending skripty.
`workflow_dispatch` na větvi `main` spustí `migration-check` a potom i **`deploy`** (stejná podmínka jako u push na `main`).
---