Infrastrukturní úklid: zamčené závislosti, verze schématu i binárky #12

Merged
david-spacil merged 8 commits from agents/claude/infrastruktura into main 2026-08-22 18:42:29 +02:00
Owner

Šest věcí, které se s časem samy nezlepší. Každá jako samostatný commit, dají se číst po částech.

Zamknout závislosti

requirements.txt byla čtyři jména bez jediné verze, takže si každá stavba stáhla to, co bylo zrovna nejnovější — binárka z dneška a binárka z příštího jara obsahovaly něco jiného a nebylo jak zjistit co. Volné seznamy jsou nově v .in, zamčené v .txt, rozdělené na běh / testy / stavbu. PyInstaller má konečně taky zamčenou verzi; ta na podobu výsledku sahá ze všech nejvíc.

Verze se píšou ještě jednou v hlavičce PEP 723, jinak by přestalo fungovat uv run web.py. Že se ta dvě místa neshodují, odhalí tests/test_zavislosti.py.

Verzovat schéma databáze

Dokud to běželo jen doma, šlo dice.db v nejhorším smazat. Teď jsou venku binárky, které si zakládají databázi v %LOCALAPPDATA% a v Library, a ta data patří cizím lidem — první sloupec, který přibude, na nich prostě nebude.

Verze se drží v PRAGMA user_version. Existující databáze mají nulu a plné schéma zároveň, což vychází: SCHEMA je samé IF NOT EXISTS, takže se na nich jen orazítkuje. Databázi z novější verze aplikace radši odmítneme otevřít, než abychom ji tiše rozbili.

Binárka má vědět, která je

kostky --version, verze v úvodní hlášce a v patičce každé stránky. build.sh ji vezme z git describe (nebo z VERSION=…), zapíše do verze.txt a kostky.spec ji přibalí. Zkouška v obou workflow ověří, že se do binárky opravdu dostala.

Waitress místo vývojového serveru Flasku

Flask pod pěkně naformátovanou úvodní hlášku sypal červené varování, že tohle není produkční server.

Cestou se ukázala chyba, která tu byla už dřív: hláška se nikdy nedostala do přesměrovaného výstupu. Mimo konzoli drží Python výstup v bloku a pouští ho, až program skončí — jenže server neskončí. Zkouška binárky u Gitey si logovala do souboru a pak ho vypisovala, takže celou dobu tiskla prázdno. Řeší to řádkové bufferování v console.utf8().

Linuxová binárka pro ARM64

GitHub dává veřejným repozitářům běhouny ubuntu-24.04-arm zadarmo — jeden řádek do matice. Pro Raspberry Pi nebo jinou malou pořád zapnutou krabičku. x86-64 zůstává doma, kde jde stavět proti staré glibc.

Stažení databáze ze síně slávy

Z binárky se dice.db schovává do systémového datového adresáře, který na Windows běžný člověk nenajde. /export ho pošle přes prohlížeč; kopie se dělá přes VACUUM INTO, takže je použitelná i uprostřed rozehrané hry.

A ještě jedna oprava

uv venv nad existujícím prostředím skončí chybou a chce --clear. Domácí runner si pracovní adresář mezi běhy drží a git clean -fd na .build nesáhne, protože je v .gitignore — druhá stavba ve stejném adresáři tedy spadla dřív, než se stihlo cokoli postavit. Narazil jsem na to při zkoušce.


Ověřeno

Postaveno lokálně (VERSION=v1.2.0-zkouska ./build.sh) a na hotové binárce projeto:

  • --version hlásí vypálenou verzi
  • úvodní hláška je v přesměrovaném logu hned, ne až po skončení
  • /, /static, /board, /stats, /export odpovídají
  • stažená záloha je platná SQLite se všemi tabulkami
  • PRAGMA user_version = 1
  • glibc floor zůstal nízko (nejvýš GLIBC_2.14)
  • skriptovaná partie v terminálové verzi beze změny

118 testů zeleně (+16).

Šest věcí, které se s časem samy nezlepší. Každá jako samostatný commit, dají se číst po částech. ## Zamknout závislosti `requirements.txt` byla čtyři jména bez jediné verze, takže si každá stavba stáhla to, co bylo zrovna nejnovější — binárka z dneška a binárka z příštího jara obsahovaly něco jiného a nebylo jak zjistit co. Volné seznamy jsou nově v `.in`, zamčené v `.txt`, rozdělené na běh / testy / stavbu. PyInstaller má konečně taky zamčenou verzi; ta na podobu výsledku sahá ze všech nejvíc. Verze se píšou ještě jednou v hlavičce PEP 723, jinak by přestalo fungovat `uv run web.py`. Že se ta dvě místa neshodují, odhalí `tests/test_zavislosti.py`. ## Verzovat schéma databáze Dokud to běželo jen doma, šlo `dice.db` v nejhorším smazat. Teď jsou venku binárky, které si zakládají databázi v `%LOCALAPPDATA%` a v `Library`, a ta data patří cizím lidem — první sloupec, který přibude, na nich prostě nebude. Verze se drží v `PRAGMA user_version`. Existující databáze mají nulu a plné schéma zároveň, což vychází: `SCHEMA` je samé `IF NOT EXISTS`, takže se na nich jen orazítkuje. Databázi z novější verze aplikace radši odmítneme otevřít, než abychom ji tiše rozbili. ## Binárka má vědět, která je `kostky --version`, verze v úvodní hlášce a v patičce každé stránky. `build.sh` ji vezme z `git describe` (nebo z `VERSION=…`), zapíše do `verze.txt` a `kostky.spec` ji přibalí. Zkouška v obou workflow ověří, že se do binárky opravdu dostala. ## Waitress místo vývojového serveru Flasku Flask pod pěkně naformátovanou úvodní hlášku sypal červené varování, že tohle není produkční server. **Cestou se ukázala chyba, která tu byla už dřív:** hláška se nikdy nedostala do přesměrovaného výstupu. Mimo konzoli drží Python výstup v bloku a pouští ho, až program skončí — jenže server neskončí. Zkouška binárky u Gitey si logovala do souboru a pak ho vypisovala, takže celou dobu tiskla prázdno. Řeší to řádkové bufferování v `console.utf8()`. ## Linuxová binárka pro ARM64 GitHub dává veřejným repozitářům běhouny `ubuntu-24.04-arm` zadarmo — jeden řádek do matice. Pro Raspberry Pi nebo jinou malou pořád zapnutou krabičku. x86-64 zůstává doma, kde jde stavět proti staré glibc. ## Stažení databáze ze síně slávy Z binárky se `dice.db` schovává do systémového datového adresáře, který na Windows běžný člověk nenajde. `/export` ho pošle přes prohlížeč; kopie se dělá přes `VACUUM INTO`, takže je použitelná i uprostřed rozehrané hry. ## A ještě jedna oprava `uv venv` nad existujícím prostředím skončí chybou a chce `--clear`. Domácí runner si pracovní adresář mezi běhy drží a `git clean -fd` na `.build` nesáhne, protože je v `.gitignore` — druhá stavba ve stejném adresáři tedy spadla dřív, než se stihlo cokoli postavit. Narazil jsem na to při zkoušce. --- ## Ověřeno Postaveno lokálně (`VERSION=v1.2.0-zkouska ./build.sh`) a na hotové binárce projeto: - `--version` hlásí vypálenou verzi - úvodní hláška je v přesměrovaném logu **hned**, ne až po skončení - `/`, `/static`, `/board`, `/stats`, `/export` odpovídají - stažená záloha je platná SQLite se všemi tabulkami - `PRAGMA user_version` = 1 - glibc floor zůstal nízko (nejvýš `GLIBC_2.14`) - skriptovaná partie v terminálové verzi beze změny 118 testů zeleně (+16).
david-spacil added 8 commits 2026-08-22 18:33:12 +02:00
Bez zamčených verzí si každá stavba stáhne to, co je zrovna nejnovější:
binárka z dneška a binárka z příštího jara obsahují něco jiného a není jak
zjistit co. Zároveň může vydání kterékoli knihovny rozbít build, aniž by se
sáhlo na řádku kódu — a nejspíš zrovna ve chvíli, kdy se tagne release.

Volné seznamy jsou nově v `.in`, zamčené v `.txt`. Rozděleno na tři: běh,
testy a stavba. Pytest se tak přestane instalovat do prostředí, kde se
staví binárka, a PyInstaller má konečně taky zamčenou verzi — ta na podobu
výsledku sahá ze všech nejvíc.

Zůstává, že se verze píšou i v hlavičce PEP 723, jinak by přestalo fungovat
`uv run web.py`. Aby se ta dvě místa nerozešla, hlídá je test.
Dokud to běželo jen doma, šlo dice.db v nejhorším smazat. Teď jsou venku
binárky, které si zakládají databázi v %LOCALAPPDATA% a v Library, a ta data
patří cizím lidem — první sloupec, který přibude, na nich prostě nebude.

Verze se drží v PRAGMA user_version. Existující databáze mají nulu a plné
schéma zároveň, což vychází: SCHEMA je samé IF NOT EXISTS, takže se na nich
jen orazítkuje a nic se neztratí.

Databázi z novější verze aplikace radši odmítneme otevřít. Srozumitelná
hláška je lepší než tiše rozbitá data, ke kterým neexistuje záloha.
Venku jsou čtyři soubory na release, tři systémy a k tomu zdrojáky. Když
někdo napíše, že mu něco nefunguje, není jak zjistit, co vlastně pustil.

Verzi zapisuje build.sh do verze.txt, kostky.spec ji přibalí a version.py ji
z rozbalené binárky přečte. Ze zdrojáků má přednost git describe, který ví
i o commitech nad tagem a o rozdělané práci. V CI se na tagu vnucuje
proměnnou, protože runner klonuje jeden commit bez značek.

Hlásí se přes --version, v úvodní hlášce serveru a v patičce každé stránky.
Zkouška v obou workflow ověří, že se do binárky opravdu dostala.
Flask pod pěkně naformátovanou úvodní hlášku vysypal červené varování, že
tohle není produkční server. Waitress je čistě pythonní, takže ho PyInstaller
zabalí bez řečí, a osm vláken pobere telefony u stolu i tabuli, která se
doptává každé dvě vteřiny.

Cestou se ukázalo, že hláška se nikdy nedostala do přesměrovaného výstupu:
mimo konzoli drží Python výstup v bloku a pouští ho, až program skončí —
jenže server neskončí. Zkouška binárky u Gitey si logovala do souboru a pak
ho vypisovala, takže celou dobu tiskla prázdno. Řeší to řádkové bufferování
v console.utf8(), kam to patří vedle té kódové stránky.
GitHub dává veřejným repozitářům běhouny ubuntu-24.04-arm zadarmo, takže je
to jeden řádek do matice. Hodí se pro Raspberry Pi nebo jinou malou pořád
zapnutou krabičku, což je rozumnější místo, kde tohle nechat běžet, než
notebook, který se každý večer zapíná.

x86-64 zůstává doma. Tam jde stavět proti staré glibc a když GitHub vypadne,
release má pořád tu platformu, na které to reálně poběží. ARM je výjimka
prostě proto, že doma na něm není na čem postavit.
Dokud se hrálo ze zdrojáků, ležel dice.db v pracovním adresáři a záloha byla
otázka zkopírování. Z binárky se schovává do systémového datového adresáře,
který na Windows běžný člověk nenajde — takže se teď dá stáhnout přes
prohlížeč.

VACUUM INTO udělá konzistentní kopii i uprostřed zápisu, na rozdíl od
prostého přečtení souboru. Kopie se přečte do paměti a hned zahodí, ať
nezůstane ležet v dočasném adresáři, když si ji někdo nestáhne celou.
uv nad existujícím prostředím skončí chybou a chce --clear. Domácí runner si
pracovní adresář mezi běhy drží a git clean -fd na .build nesáhne, protože je
v .gitignore — takže druhá stavba ve stejném adresáři spadla dřív, než se
stihlo cokoli postavit.
Srovnat počet testů v README
binárka / linux (pull_request) Successful in 11s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 1s
testy / pytest (3.13) (pull_request) Successful in 2s
testy / pytest (3.14) (pull_request) Successful in 0s
3c3805362f
david-spacil merged commit 923fc03581 into main 2026-08-22 18:42:29 +02:00
david-spacil deleted branch agents/claude/infrastruktura 2026-08-22 18:42:34 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: david-spacil/dice-counter#12