Zaříznout stará jména kostky
binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Successful in 18s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 0s
testy / pytest (3.13) (pull_request) Successful in 0s
testy / pytest (3.14) (pull_request) Successful in 1s
binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Successful in 18s
testy / pytest (3.11) (pull_request) Successful in 1s
testy / pytest (3.12) (pull_request) Successful in 0s
testy / pytest (3.13) (pull_request) Successful in 0s
testy / pytest (3.14) (pull_request) Successful in 1s
Druhý krok po #16, rovnou celý. Dvojkolejnost dávala smysl pro projekt s neznámými uživateli; tady běží jedna instance a ta je přemigrovaná. Pryč je: - deploy/pve-kostky.sh (přesměrování na nový skript) - stěhování ze starého jména v instalátoru včetně bloku STARY_* - záložní jméno přílohy kostky-* v instalátoru - věšení příloh pod dvěma jmény v obou workflow - záloha na ~/.local/share/kostky/dice.db ve storage.py - odstavce o přechodu v README Jediné, co ve zdrojácích zůstalo, je docstring "Pravidla hry v kostky" v core.py — to je česky pojmenovaná hra, ne identifikátor. POZOR na pořadí: instalátor teď hledá jen dice-counter-*, a poslední vydání (v1.2.1) má na releasu pouze kostky-*. Do otagování v1.2.2 tedy `update` ani čerstvá instalace nemají co stáhnout. Merge a tag patří k sobě. Ověřeno v debianím kontejneru: čistá instalace, druhé spuštění za sebou, a vydání bez nových jmen spadne se srozumitelnou hláškou místo toho, aby sáhlo po starém. Binárka postavená lokálně zakládá databázi v …/dice-counter/ a starou vedle sebe ignoruje. 118 testů. Closes #19
This commit is contained in:
1 parent
8e6e4a8fe9
commit
a6c94e239b
7 files changed
+14
-156
No files matched your search
@@ -93,9 +93,6 @@ jobs:
|
||||
env:
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ASSET: dice-counter-linux-x86_64
|
||||
# Instalátory z dřívějška si chodí pro staré jméno. Až budou
|
||||
# přemigrované, přestane se pod ním věšet.
|
||||
STARY_ASSET: kostky-linux-x86_64
|
||||
run: |
|
||||
api="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}"
|
||||
auth="Authorization: token ${TOKEN}"
|
||||
@@ -113,12 +110,10 @@ jobs:
|
||||
|
||||
# Součet se počítá nad jménem, pod kterým se soubor stahuje, aby
|
||||
# šel ověřit rovnou: sha256sum -c dice-counter-linux-x86_64.sha256
|
||||
for jmeno in "$ASSET" "$STARY_ASSET"; do
|
||||
cp dist/dice-counter "$jmeno"
|
||||
sha256sum "$jmeno" | tee "$jmeno.sha256"
|
||||
done
|
||||
cp dist/dice-counter "$ASSET"
|
||||
sha256sum "$ASSET" | tee "$ASSET.sha256"
|
||||
|
||||
for file in "$ASSET" "$ASSET.sha256" "$STARY_ASSET" "$STARY_ASSET.sha256"; do
|
||||
for file in "$ASSET" "$ASSET.sha256"; do
|
||||
# Aby se dal build zopakovat, stará příloha stejného jména jde pryč.
|
||||
curl -s -H "$auth" "$api/releases/$id/assets" \
|
||||
| python3 -c 'import json,sys; [print(a["id"]) for a in json.load(sys.stdin) if a["name"] == sys.argv[1]]' "$file" \
|
||||
|
||||
@@ -29,25 +29,18 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# `stary` je jméno, pod kterým se příloha věšela do vydání 1.2.x.
|
||||
# Instalátory z té doby si chodí pro něj, tak se pověsí obojí.
|
||||
# Až budou přemigrované, sloupec zmizí.
|
||||
include:
|
||||
- os: windows-latest
|
||||
asset: dice-counter-windows-x86_64.exe
|
||||
stary: kostky-windows-x86_64.exe
|
||||
built: dist/dice-counter.exe
|
||||
- os: macos-15-intel # Intel; macos-13 GitHub zrušil
|
||||
asset: dice-counter-macos-x86_64
|
||||
stary: kostky-macos-x86_64
|
||||
built: dist/dice-counter
|
||||
- os: macos-latest # Apple Silicon
|
||||
asset: dice-counter-macos-arm64
|
||||
stary: kostky-macos-arm64
|
||||
built: dist/dice-counter
|
||||
- os: ubuntu-24.04-arm # pro Raspberry Pi a spol.
|
||||
asset: dice-counter-linux-arm64
|
||||
stary: kostky-linux-arm64
|
||||
built: dist/dice-counter
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
@@ -104,7 +97,6 @@ jobs:
|
||||
env:
|
||||
TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||
ASSET: ${{ matrix.asset }}
|
||||
STARY_ASSET: ${{ matrix.stary }}
|
||||
run: |
|
||||
api="$GITEA/api/v1/repos/$GITEA_REPO"
|
||||
auth="Authorization: token $TOKEN"
|
||||
@@ -133,12 +125,10 @@ jobs:
|
||||
|
||||
# Součet se počítá nad jménem, pod kterým se soubor stahuje, aby
|
||||
# šel ověřit rovnou: shasum -a 256 -c dice-counter-macos-arm64.sha256
|
||||
for jmeno in "$ASSET" "$STARY_ASSET"; do
|
||||
cp "${{ matrix.built }}" "$jmeno"
|
||||
soucet "$jmeno" | tee "$jmeno.sha256"
|
||||
done
|
||||
cp "${{ matrix.built }}" "$ASSET"
|
||||
soucet "$ASSET" | tee "$ASSET.sha256"
|
||||
|
||||
for file in "$ASSET" "$ASSET.sha256" "$STARY_ASSET" "$STARY_ASSET.sha256"; do
|
||||
for file in "$ASSET" "$ASSET.sha256"; do
|
||||
# Aby se dal build zopakovat, stará příloha stejného jména jde pryč.
|
||||
curl -s -H "$auth" "$api/releases/$id/assets" \
|
||||
| json 'import json,sys; [print(a["id"]) for a in json.load(sys.stdin) if a["name"] == sys.argv[1]]' "$file" \
|
||||
|
||||
@@ -93,10 +93,6 @@ server vypíše při startu.
|
||||
| binárkou na Windows | `%LOCALAPPDATA%\dice-counter\dice.db` |
|
||||
| ze zdrojáků | `dice.db` v pracovním adresáři |
|
||||
|
||||
Do vydání 1.2.x se adresář jmenoval `kostky`. Kdo databázi po staru má, o ni
|
||||
nepřijde — dokud nová neexistuje, používá se dál ta stará. Přesunout se dá
|
||||
kdykoli ručně, přejmenováním adresáře.
|
||||
|
||||
Binárka se při každém spuštění rozbaluje do dočasného adresáře a pouští se
|
||||
odkudkoli, takže relativní cesta by databázi rozsypala po disku — proto
|
||||
napevno domovský adresář. Ze zdrojáků zůstává relativní, ať se dá mít víc
|
||||
@@ -174,13 +170,6 @@ Obojí vymění binárku za poslední vydání a službu restartuje; databáze z
|
||||
Příkaz `update` si přitom obnoví i sám sebe — instalátor bere z větve `main`,
|
||||
takže jede na nejnovější verzi skriptu, ne na té, se kterou se instalovalo.
|
||||
|
||||
Kontejnery založené do vydání 1.2.x se při první aktualizaci přejmenují ze
|
||||
starého `kostky`: služba, uživatel i cesty dostanou nová jména a databáze se
|
||||
přestěhuje z `/var/lib/kostky` do `/var/lib/dice-counter`. Dělá se to samo
|
||||
a stačí na to obyčejný `update`; historie her zůstává. Původní adresa skriptu
|
||||
(`deploy/pve-kostky.sh`) proto ještě chvíli funguje — jen přesměrovává na
|
||||
novou.
|
||||
|
||||
Do konzole kontejneru se dostaneš přímo z webu Proxmoxu, **žádné jméno ani
|
||||
heslo se nezadává** — kontejner root heslo nemá a konzole se přihlašuje sama.
|
||||
Nová práva to nikomu nedává: kdo se dostane do webu Proxmoxu, má root na uzlu
|
||||
@@ -380,10 +369,6 @@ ověřit:
|
||||
sha256sum -c dice-counter-linux-x86_64.sha256 # na macOS: shasum -a 256 -c
|
||||
```
|
||||
|
||||
Do vydání 1.2.x se přílohy jmenovaly `kostky-*`. Ještě chvíli se budou věšet
|
||||
pod oběma jmény, ať fungují instalace, které si o ně říkají po staru. Až budou
|
||||
přemigrované, zůstane jen `dice-counter-*`.
|
||||
|
||||
Nad pull requesty se Linux staví taky, jen se nikam nevěší. Totéž platí pro
|
||||
kontejnerový image — doma se nad každým PR postaví a zkusí nastartovat
|
||||
(`.gitea/workflows/image.yml`), publikuje se ale až z tagu na GitHubu.
|
||||
|
||||
@@ -84,20 +84,13 @@ HOME_DIR=/opt/dice-counter
|
||||
DATA_DIR=/var/lib/dice-counter
|
||||
SERVICE=dice-counter
|
||||
|
||||
# Do vydání 1.2.x se všechno jmenovalo kostky. Instalace z té doby se při
|
||||
# aktualizaci přestěhují; až budou přemigrované, tenhle blok zmizí.
|
||||
STARY_USER=kostky
|
||||
STARY_HOME=/opt/kostky
|
||||
STARY_DATA=/var/lib/kostky
|
||||
STARA_SLUZBA=kostky
|
||||
|
||||
msg() { echo -e "\e[1;34m →\e[0m $*"; }
|
||||
ok() { echo -e "\e[1;32m ✓\e[0m $*"; }
|
||||
die() { echo -e "\e[1;31m ✗\e[0m $*" >&2; exit 1; }
|
||||
|
||||
case "$(dpkg --print-architecture)" in
|
||||
amd64) PLATFORMA=linux-x86_64 ;;
|
||||
arm64) PLATFORMA=linux-arm64 ;;
|
||||
amd64) ASSET=dice-counter-linux-x86_64 ;;
|
||||
arm64) ASSET=dice-counter-linux-arm64 ;;
|
||||
*) die "Pro architekturu $(dpkg --print-architecture) binárka není." ;;
|
||||
esac
|
||||
|
||||
@@ -114,22 +107,15 @@ if [ -z "$VERSION" ]; then
|
||||
| grep -o '"tag_name":[[:space:]]*"[^"]*"' | head -1 | cut -d'"' -f4)
|
||||
[ -n "$VERSION" ] || die "Nepodařilo se zjistit poslední verzi z $GITEA."
|
||||
fi
|
||||
ok "Instaluje se $VERSION pro $PLATFORMA"
|
||||
ok "Instaluje se $VERSION ($ASSET)"
|
||||
|
||||
BASE="$GITEA/$REPO/releases/download/$VERSION"
|
||||
TMP=$(mktemp -d)
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
msg "Stahuji binárku"
|
||||
# Do vydání 1.2.x se přílohy jmenovaly kostky-*. Starší vydání se tak dají
|
||||
# nainstalovat dál; až stará jména z releasů zmizí, zůstane jen to první.
|
||||
ASSET=""
|
||||
for jmeno in "dice-counter-$PLATFORMA" "kostky-$PLATFORMA"; do
|
||||
curl -fsSL -o "$TMP/$jmeno" "$BASE/$jmeno" 2>/dev/null && { ASSET="$jmeno"; break; }
|
||||
done
|
||||
[ -n "$ASSET" ] \
|
||||
|| die "Binárka pro $PLATFORMA ve vydání $VERSION není. Pro tuhle architekturu možná ještě nevyšla."
|
||||
|
||||
curl -fsSL -o "$TMP/$ASSET" "$BASE/$ASSET" \
|
||||
|| die "$ASSET pro $VERSION na releasu není. Vydání pro tuhle architekturu možná ještě neproběhlo."
|
||||
curl -fsSL -o "$TMP/$ASSET.sha256" "$BASE/$ASSET.sha256" \
|
||||
|| die "Chybí kontrolní součet — radši nic neinstaluju."
|
||||
|
||||
@@ -143,38 +129,6 @@ id -u "$USER_NAME" >/dev/null 2>&1 \
|
||||
|
||||
install -d -o root -g root -m 755 "$HOME_DIR"
|
||||
|
||||
# Instalace z doby, kdy se všechno jmenovalo kostky, se tady převezme. Bez
|
||||
# přestěhování databáze by po aktualizaci zmizela historie her, takže se to
|
||||
# nedá odbýt smazáním staré služby.
|
||||
#
|
||||
# Starý domovský adresář se maže až úplně na konci skriptu: při aktualizaci
|
||||
# běžícího kontejneru se instalátor pouští právě z něj a `$0` z něj ještě
|
||||
# potřebujeme zkopírovat na nové místo.
|
||||
if [ -f "/etc/systemd/system/$STARA_SLUZBA.service" ] \
|
||||
|| [ -d "$STARY_HOME" ] || [ -d "$STARY_DATA" ]; then
|
||||
msg "Našel jsem instalaci pod starým jménem, stěhuji ji"
|
||||
|
||||
systemctl is-active --quiet "$STARA_SLUZBA" && systemctl stop "$STARA_SLUZBA"
|
||||
systemctl disable --quiet "$STARA_SLUZBA" 2>/dev/null || true
|
||||
rm -f "/etc/systemd/system/$STARA_SLUZBA.service"
|
||||
systemctl daemon-reload
|
||||
|
||||
# Když nový adresář z nějakého důvodu už existuje, starý se nechá být.
|
||||
# Přepsat cizí databázi je horší než nechat po sobě adresář navíc.
|
||||
if [ -d "$STARY_DATA" ] && [ ! -e "$DATA_DIR" ]; then
|
||||
mv "$STARY_DATA" "$DATA_DIR"
|
||||
ok "Databáze přestěhována do $DATA_DIR"
|
||||
elif [ -d "$STARY_DATA" ]; then
|
||||
msg "$DATA_DIR už existuje, $STARY_DATA nechávám na místě"
|
||||
fi
|
||||
|
||||
id -u "$STARY_USER" >/dev/null 2>&1 && userdel "$STARY_USER" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Po stěhování patří soubory uživateli, který už neexistuje. StateDirectory
|
||||
# to u založeného adresáře nedorovná, tak se to udělá rovnou tady.
|
||||
[ -d "$DATA_DIR" ] && chown -R "$USER_NAME:$USER_NAME" "$DATA_DIR"
|
||||
|
||||
# Zastavit se dá jen to, co běží — při první instalaci služba ještě není.
|
||||
if systemctl is-active --quiet "$SERVICE"; then
|
||||
systemctl stop "$SERVICE"
|
||||
@@ -273,14 +227,6 @@ UPDATE
|
||||
chmod 755 /usr/bin/update
|
||||
ok "Aktualizovat půjde příkazem: update"
|
||||
|
||||
# Teď už je `$0` zkopírovaný na nové místo a starý domov nikdo nepotřebuje.
|
||||
# Bash si drží otevřený popisovač na skript, takže smazat se dá i ten, který
|
||||
# se zrovna vykonává.
|
||||
if [ -d "$STARY_HOME" ]; then
|
||||
rm -rf "$STARY_HOME"
|
||||
ok "Staré $STARY_HOME uklizeno"
|
||||
fi
|
||||
|
||||
msg "Čekám, až začne odpovídat"
|
||||
for _ in $(seq 30); do
|
||||
curl -fsS -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null && break
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Skript se přejmenoval na deploy/pve-dice-counter.sh.
|
||||
#
|
||||
# Tenhle soubor tu zůstává schválně. Příkaz `update` v už založených
|
||||
# kontejnerech si instalátor stahuje z téhle adresy — kdyby zmizela,
|
||||
# aktualizace by u nich přestala fungovat dřív, než se stihnou přemigrovat.
|
||||
# Až se tak stane, zmizí i tenhle soubor.
|
||||
#
|
||||
# Předává se všechno beze změny, včetně argumentů a proměnných prostředí.
|
||||
# Na stdout nesmí přibýt ani řádek navíc: starý `update` si sem chodí pro
|
||||
# `instalator` a výstup rovnou kontroluje přes `bash -n`.
|
||||
set -euo pipefail
|
||||
|
||||
GITEA="${GITEA:-https://gitea.spacilovi.eu}"
|
||||
REPO="${REPO:-david-spacil/dice-counter}"
|
||||
|
||||
NOVY=$(mktemp)
|
||||
trap 'rm -f "$NOVY"' EXIT
|
||||
|
||||
curl -fsSL "$GITEA/$REPO/raw/branch/main/deploy/pve-dice-counter.sh" -o "$NOVY" \
|
||||
|| { echo "Skript se přesunul do deploy/pve-dice-counter.sh, ale nejde stáhnout." >&2; exit 1; }
|
||||
|
||||
bash "$NOVY" "$@"
|
||||
+3
-16
@@ -27,14 +27,6 @@ def data_home() -> Path:
|
||||
or Path.home() / ".local" / "share")
|
||||
|
||||
|
||||
APP_DIR = "dice-counter"
|
||||
|
||||
# Do vydání 1.2.x se adresář jmenoval jinak. Kdo má databázi po staru, o ni
|
||||
# přejmenováním nepřijde — použije se dál. Až se stará jména přestanou
|
||||
# podporovat, zmizí i tohle.
|
||||
STARY_APP_DIR = "kostky"
|
||||
|
||||
|
||||
def default_db() -> Path:
|
||||
"""Kam se ukládá databáze.
|
||||
|
||||
@@ -46,14 +38,9 @@ def default_db() -> Path:
|
||||
chosen = os.environ.get("DICE_DB")
|
||||
if chosen:
|
||||
return Path(chosen)
|
||||
if not getattr(sys, "frozen", False):
|
||||
return Path("dice.db")
|
||||
|
||||
nova = data_home() / APP_DIR / "dice.db"
|
||||
stara = data_home() / STARY_APP_DIR / "dice.db"
|
||||
if not nova.exists() and stara.exists():
|
||||
return stara
|
||||
return nova
|
||||
if getattr(sys, "frozen", False):
|
||||
return data_home() / "dice-counter" / "dice.db"
|
||||
return Path("dice.db")
|
||||
|
||||
|
||||
DB_PATH = default_db()
|
||||
|
||||
@@ -155,28 +155,6 @@ def test_umisteni_databaze_z_binarky(monkeypatch, tmp_path):
|
||||
assert storage.default_db() == tmp_path / "dice-counter" / "dice.db"
|
||||
|
||||
|
||||
def test_umisteni_databaze_po_starem(monkeypatch, tmp_path):
|
||||
"""Kdo má databázi pod starým jménem, o ni přejmenováním nepřijde."""
|
||||
monkeypatch.delenv("DICE_DB", raising=False)
|
||||
monkeypatch.setattr(storage.sys, "frozen", True, raising=False)
|
||||
monkeypatch.setattr(storage.sys, "platform", "linux")
|
||||
monkeypatch.setenv("XDG_DATA_HOME", str(tmp_path))
|
||||
|
||||
stara = tmp_path / "kostky" / "dice.db"
|
||||
stara.parent.mkdir()
|
||||
stara.touch()
|
||||
|
||||
assert storage.default_db() == stara
|
||||
|
||||
# Jakmile nová existuje, stará se ignoruje — jinak by se dvě databáze
|
||||
# přetahovaly o to, která platí.
|
||||
nova = tmp_path / "dice-counter" / "dice.db"
|
||||
nova.parent.mkdir()
|
||||
nova.touch()
|
||||
|
||||
assert storage.default_db() == nova
|
||||
|
||||
|
||||
def test_data_home_podle_systemu(monkeypatch, tmp_path):
|
||||
"""Každý systém má svůj adresář na data; XDG je jen ten linuxový."""
|
||||
monkeypatch.setenv("LOCALAPPDATA", str(tmp_path / "AppData" / "Local"))
|
||||
|
||||
Reference in new issue
Block a user