v0.8.06-beta - de backuptest in de CI struikelde over postgres
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 16m10s
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 16m10s
Vier runs op rij faalden op "psql: connection to server on socket ... No such file or directory". Het officiele postgres-image start bij een eerste run eerst een tijdelijke server om de init-scripts te draaien, stopt die, en start dan pas de echte. pg_isready meldt tijdens die tijdelijke server al "klaar", dus kwam de volgende opdracht net in het gat daarna, dan was de socket weg. - de wachtlus voert nu echte query's uit en gaat pas door na twee geslaagde achter elkaar; bij een time-out staat de laatste fout erbij - een achtergebleven testcontainer wordt voor de start opgeruimd, want een geannuleerde run draait zijn opruimblok niet De deploy zelf werkte al die tijd; deze stap draait erna. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
This commit is contained in:
parent
e61f90745b
commit
9fb31dfa9e
3 changed files with 65 additions and 11 deletions
27
CHANGELOG.md
27
CHANGELOG.md
|
|
@ -1,3 +1,30 @@
|
||||||
|
# v0.8.06-beta — De backuptest in de CI struikelde over postgres
|
||||||
|
|
||||||
|
Vier CI-runs op rij faalden, en niet op iets in Server Up: de backup-rondgang
|
||||||
|
die sinds v0.7.96 in de CI draait, viel om op
|
||||||
|
|
||||||
|
```
|
||||||
|
psql: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed
|
||||||
|
```
|
||||||
|
|
||||||
|
Het officiële postgres-image start bij een eerste run **twee** servers: eerst
|
||||||
|
een tijdelijke op de socket om de init-scripts te draaien, die daarna stopt, en
|
||||||
|
pas dan de echte. `pg_isready` meldt tijdens die tijdelijke server al "klaar".
|
||||||
|
Kwam de volgende opdracht net in het gat daartussen, dan was de socket weg. Een
|
||||||
|
race, dus soms goed en soms niet.
|
||||||
|
|
||||||
|
De wachtlus kijkt nu niet meer naar `pg_isready` maar voert echte query's uit,
|
||||||
|
en gaat pas door na twee geslaagde achter elkaar — één toevallige treffer op de
|
||||||
|
tijdelijke server overleeft dat niet. Bij een time-out staat de laatste fout
|
||||||
|
erbij in plaats van alleen "kwam niet op".
|
||||||
|
|
||||||
|
Verder wordt een achtergebleven testcontainer nu vóór de start opgeruimd. Een
|
||||||
|
geannuleerde run draait zijn opruimblok niet, en een half geïnitialiseerde
|
||||||
|
datamap levert daarna raadselachtige fouten op.
|
||||||
|
|
||||||
|
De deploy zelf werkte al die tijd gewoon; deze stap draait er ná en liet alleen
|
||||||
|
de job rood kleuren.
|
||||||
|
|
||||||
# v0.8.05-beta — Een onbereikbaar pad liet zich gewoon opslaan
|
# v0.8.05-beta — Een onbereikbaar pad liet zich gewoon opslaan
|
||||||
|
|
||||||
Dit is de oorzaak van de lege appslijst waar de vorige vier uitgaven omheen
|
Dit is de oorzaak van de lege appslijst waar de vorige vier uitgaven omheen
|
||||||
|
|
|
||||||
2
VERSION
2
VERSION
|
|
@ -1 +1 @@
|
||||||
0.8.05-beta
|
0.8.06-beta
|
||||||
|
|
|
||||||
|
|
@ -55,26 +55,47 @@ def mislukt(tekst: str) -> None:
|
||||||
raise SystemExit(1)
|
raise SystemExit(1)
|
||||||
|
|
||||||
|
|
||||||
def psql(sql: str, verwacht_fout: bool = False) -> str:
|
def _psql(sql: str):
|
||||||
"""Voer SQL uit in de draaiende container."""
|
return subprocess.run(
|
||||||
r = subprocess.run(
|
|
||||||
["docker", "exec", "-e", f"PGPASSWORD={WACHTWOORD}", f"{STACK}-db",
|
["docker", "exec", "-e", f"PGPASSWORD={WACHTWOORD}", f"{STACK}-db",
|
||||||
"psql", "-U", STACK, "-d", STACK, "-tAc", sql],
|
"psql", "-U", STACK, "-d", STACK, "-tAc", sql],
|
||||||
capture_output=True, text=True, timeout=120)
|
capture_output=True, text=True, timeout=120)
|
||||||
if r.returncode != 0 and not verwacht_fout:
|
|
||||||
|
|
||||||
|
def psql(sql: str) -> str:
|
||||||
|
"""Voer SQL uit in de draaiende container."""
|
||||||
|
r = _psql(sql)
|
||||||
|
if r.returncode != 0:
|
||||||
mislukt(f"psql mislukte: {(r.stderr or r.stdout).strip()[:300]}")
|
mislukt(f"psql mislukte: {(r.stderr or r.stdout).strip()[:300]}")
|
||||||
return (r.stdout or "").strip()
|
return (r.stdout or "").strip()
|
||||||
|
|
||||||
|
|
||||||
def wacht_op_postgres(pogingen: int = 60) -> None:
|
def wacht_op_postgres(pogingen: int = 60) -> None:
|
||||||
|
"""Wacht tot psql het écht doet — niet tot pg_isready dat zegt.
|
||||||
|
|
||||||
|
Het officiële postgres-image start bij een eerste run eerst een tijdelijke
|
||||||
|
server op de socket om de init-scripts te draaien, stopt die daarna, en
|
||||||
|
start pas dan de echte. `pg_isready` zegt tijdens die tijdelijke server al
|
||||||
|
"ok". Kwam de volgende opdracht net in het gat daarna, dan was er geen
|
||||||
|
socket meer: "connection to server on socket ... No such file or
|
||||||
|
directory". Een race, dus soms goed en soms niet.
|
||||||
|
|
||||||
|
Twee keer achter elkaar een geslaagde query is het antwoord: één toevallige
|
||||||
|
treffer op de tijdelijke server overleeft dat niet.
|
||||||
|
"""
|
||||||
|
goed_achtereen = 0
|
||||||
|
laatste = ""
|
||||||
for _ in range(pogingen):
|
for _ in range(pogingen):
|
||||||
r = subprocess.run(["docker", "exec", f"{STACK}-db",
|
r = _psql("SELECT 1")
|
||||||
"pg_isready", "-U", STACK],
|
|
||||||
capture_output=True, text=True)
|
|
||||||
if r.returncode == 0:
|
if r.returncode == 0:
|
||||||
return
|
goed_achtereen += 1
|
||||||
|
if goed_achtereen >= 2:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
goed_achtereen = 0
|
||||||
|
laatste = (r.stderr or r.stdout or "").strip().splitlines()[:1]
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
mislukt("postgres kwam niet op")
|
mislukt(f"postgres kwam niet op: {laatste}")
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
|
|
@ -110,7 +131,13 @@ def main() -> None:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
kop("1. Stack starten en vullen")
|
kop("1. Stack starten en vullen")
|
||||||
if docker.compose_up(stackmap, name=STACK) != 0:
|
# Een afgebroken of geannuleerde vorige run draait zijn opruimblok niet.
|
||||||
|
# Een achtergebleven container met een half geïnitialiseerde datamap
|
||||||
|
# levert daarna raadselachtige fouten op.
|
||||||
|
subprocess.run(["docker", "rm", "-f", f"{STACK}-db"],
|
||||||
|
capture_output=True, timeout=120)
|
||||||
|
if docker.compose_up(stackmap, log_fn=lambda m: print(f" · {m}"),
|
||||||
|
name=STACK) != 0:
|
||||||
mislukt("de stack startte niet")
|
mislukt("de stack startte niet")
|
||||||
wacht_op_postgres()
|
wacht_op_postgres()
|
||||||
psql("CREATE TABLE proef (id int, tekst text);")
|
psql("CREATE TABLE proef (id int, tekst text);")
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue