Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
85b6618952 |
No files matched your search
@@ -1,115 +0,0 @@
|
|||||||
# Postaví binárku a pověsí ji na release.
|
|
||||||
#
|
|
||||||
# Runner běží v host módu, takže tu není kontejner ani hotové akce
|
|
||||||
# z marketplace — nic se nespoléhá na to, co má hostitel nainstalováno.
|
|
||||||
# O starou glibc se stará build.sh přes samostatný CPython od uv.
|
|
||||||
name: binárka
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags: ["v*"]
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
linux:
|
|
||||||
runs-on: homelab
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: objdump
|
|
||||||
run: |
|
|
||||||
# Jediné, co musí být na hostiteli — PyInstaller jím hledá, na
|
|
||||||
# kterých knihovnách binárka visí. Zbytek si obstará uv.
|
|
||||||
command -v objdump >/dev/null && exit 0
|
|
||||||
sudo=""; [ "$(id -u)" -ne 0 ] && sudo=sudo
|
|
||||||
if command -v apt-get >/dev/null; then
|
|
||||||
$sudo apt-get update -qq
|
|
||||||
$sudo apt-get install -y -qq binutils
|
|
||||||
elif command -v dnf >/dev/null; then
|
|
||||||
$sudo dnf install -y -q binutils
|
|
||||||
else
|
|
||||||
echo "Nainstaluj binutils, PyInstaller bez objdumpu nestaví." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Zdrojáky
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
git init -q .
|
|
||||||
git remote remove origin 2>/dev/null || true
|
|
||||||
git remote add origin "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git"
|
|
||||||
git config http.extraheader "Authorization: token ${TOKEN}"
|
|
||||||
git fetch -q --depth 1 origin "${GITHUB_REF}"
|
|
||||||
git config --unset http.extraheader
|
|
||||||
git checkout -qf FETCH_HEAD
|
|
||||||
git clean -qfd
|
|
||||||
|
|
||||||
- name: uv
|
|
||||||
run: |
|
|
||||||
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
|
||||||
export PATH="$HOME/.local/bin:$PATH"
|
|
||||||
command -v uv >/dev/null || curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
||||||
uv --version
|
|
||||||
|
|
||||||
- name: Testy
|
|
||||||
run: uv run --with-requirements requirements.txt --no-project pytest -q
|
|
||||||
|
|
||||||
- name: Binárka
|
|
||||||
run: ./build.sh
|
|
||||||
|
|
||||||
- name: Zkouška
|
|
||||||
run: |
|
|
||||||
XDG_DATA_HOME=/tmp/zkouska DICE_PORT=8321 DICE_HOST=127.0.0.1 \
|
|
||||||
./dist/kostky > /tmp/server.log 2>&1 &
|
|
||||||
server=$!
|
|
||||||
trap 'kill $server 2>/dev/null || true' EXIT
|
|
||||||
|
|
||||||
for _ in $(seq 30); do
|
|
||||||
curl -sf -o /dev/null http://127.0.0.1:8321/ && break
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
|
|
||||||
curl -sf -o /dev/null http://127.0.0.1:8321/
|
|
||||||
curl -sf -o /dev/null http://127.0.0.1:8321/static/style.css
|
|
||||||
curl -sf -o /dev/null http://127.0.0.1:8321/board
|
|
||||||
test -f /tmp/zkouska/kostky/dice.db
|
|
||||||
cat /tmp/server.log
|
|
||||||
|
|
||||||
- name: Na release
|
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
ASSET: kostky-linux-x86_64
|
|
||||||
run: |
|
|
||||||
api="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}"
|
|
||||||
auth="Authorization: token ${TOKEN}"
|
|
||||||
|
|
||||||
# Release u tagu být může, ale nemusí — dá se založit i ručně.
|
|
||||||
id=$(curl -s -H "$auth" "$api/releases/tags/${GITHUB_REF_NAME}" \
|
|
||||||
| python3 -c 'import json,sys; print(json.load(sys.stdin).get("id",""))' || true)
|
|
||||||
|
|
||||||
if [ -z "$id" ]; then
|
|
||||||
id=$(curl -sf -X POST -H "$auth" -H "Content-Type: application/json" \
|
|
||||||
-d "{\"tag_name\":\"${GITHUB_REF_NAME}\",\"name\":\"${GITHUB_REF_NAME}\"}" \
|
|
||||||
"$api/releases" \
|
|
||||||
| python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Součet se počítá nad jménem, pod kterým se soubor stahuje, aby
|
|
||||||
# šel ověřit rovnou: sha256sum -c kostky-linux-x86_64.sha256
|
|
||||||
cp dist/kostky "$ASSET"
|
|
||||||
sha256sum "$ASSET" | tee "$ASSET.sha256"
|
|
||||||
|
|
||||||
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" \
|
|
||||||
| while read -r old; do
|
|
||||||
curl -sf -X DELETE -H "$auth" "$api/releases/$id/assets/$old"
|
|
||||||
done
|
|
||||||
|
|
||||||
curl -sf -o /dev/null -X POST -H "$auth" -F "attachment=@$file" \
|
|
||||||
"$api/releases/$id/assets?name=$file"
|
|
||||||
echo "$file pověšen na ${GITHUB_REF_NAME}"
|
|
||||||
done
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
# Testy nad každým pull requestem a nad main.
|
|
||||||
#
|
|
||||||
# Runner běží v host módu, takže tu není kontejner ani hotové akce
|
|
||||||
# z marketplace. Pythony obstará uv, na hostiteli nemusí být žádný.
|
|
||||||
name: testy
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [main]
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: testy-${{ github.ref }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
pytest:
|
|
||||||
runs-on: homelab
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
# Runner sdílí pracovní adresář mezi variantami, takže po jedné.
|
|
||||||
max-parallel: 1
|
|
||||||
matrix:
|
|
||||||
python: ["3.11", "3.12", "3.13", "3.14"]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Zdrojáky
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
git init -q .
|
|
||||||
git remote remove origin 2>/dev/null || true
|
|
||||||
git remote add origin "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git"
|
|
||||||
git config http.extraheader "Authorization: token ${TOKEN}"
|
|
||||||
git fetch -q --depth 1 origin "${GITHUB_REF}"
|
|
||||||
git config --unset http.extraheader
|
|
||||||
git checkout -qf FETCH_HEAD
|
|
||||||
git clean -qfd
|
|
||||||
|
|
||||||
- name: uv
|
|
||||||
run: |
|
|
||||||
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
|
||||||
export PATH="$HOME/.local/bin:$PATH"
|
|
||||||
command -v uv >/dev/null || curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
||||||
uv python install "${{ matrix.python }}"
|
|
||||||
|
|
||||||
- name: Testy
|
|
||||||
run: |
|
|
||||||
uv run --managed-python --python "${{ matrix.python }}" \
|
|
||||||
--with-requirements requirements.txt --no-project \
|
|
||||||
pytest -q
|
|
||||||
|
|
||||||
- name: Terminálová verze
|
|
||||||
run: |
|
|
||||||
# Pytest sahá na core.py, ne na prompty. Tohle projde celou partii
|
|
||||||
# tak, jak ji odehraje člověk: dvě nuly, třetí vynuluje, výhra.
|
|
||||||
out=$(printf 'A\nB\n\n1000\n\n200\n10\n0\n10\n0\n10\n0\n\n1000\n' \
|
|
||||||
| TERM=dumb uv run --managed-python --python "${{ matrix.python }}" dice.py)
|
|
||||||
|
|
||||||
for expected in "200xx" "Po třech nulových hodech" "Vítězem se stává B"; do
|
|
||||||
printf '%s' "$out" | grep -qF "$expected" || {
|
|
||||||
echo "chybí: $expected"
|
|
||||||
printf '%s\n' "$out"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
done
|
|
||||||
echo "terminálová verze v pořádku"
|
|
||||||
@@ -4,4 +4,3 @@ __pycache__/
|
|||||||
.pytest_cache/
|
.pytest_cache/
|
||||||
dist/
|
dist/
|
||||||
build/
|
build/
|
||||||
.build/
|
|
||||||
@@ -17,7 +17,8 @@ chmod +x kostky
|
|||||||
```
|
```
|
||||||
|
|
||||||
Nic se neinstaluje — Python, Flask i šablony jsou uvnitř. Zatím jen pro Linux
|
Nic se neinstaluje — Python, Flask i šablony jsou uvnitř. Zatím jen pro Linux
|
||||||
na x86-64; postavené proti glibc 2.17, takže jede prakticky všude.
|
na x86-64; postavené proti glibc 2.28, takže jede na všem od RHEL 8,
|
||||||
|
Debianu 10 a Ubuntu 20.04 výš.
|
||||||
|
|
||||||
Ze zdrojáků to je stejně krátké:
|
Ze zdrojáků to je stejně krátké:
|
||||||
|
|
||||||
@@ -131,31 +132,13 @@ python3 web.py
|
|||||||
./build.sh
|
./build.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Staví se proti samostatnému CPythonu od `uv`, ne proti systémovému. Ten je
|
Staví se v kontejneru (podman nebo docker) na AlmaLinux 8, ne na hostiteli.
|
||||||
slinkovaný s glibc 2.17; postavené proti Pythonu z Fedory 44 by to chtělo
|
Binárka slinkovaná proti glibc z Fedory 44 by nešla spustit nikde se starším
|
||||||
glibc 2.43 a nešlo by spustit skoro nikde — glibc drží zpětnou kompatibilitu,
|
systémem — glibc drží zpětnou kompatibilitu, ne dopřednou. Výsledek je
|
||||||
ne dopřednou. Nic z hostitele se do binárky nedostane, takže kontejner k tomu
|
v `dist/kostky`.
|
||||||
potřeba není. Výsledek je v `dist/kostky`.
|
|
||||||
|
|
||||||
Terminálová verze součástí binárky není; ta se pouští ze zdrojáků.
|
Terminálová verze součástí binárky není; ta se pouští ze zdrojáků.
|
||||||
|
|
||||||
Releasy si tohle dělají samy. Otagovaný commit spustí
|
|
||||||
`.gitea/workflows/binarka.yml`, ta binárku postaví, projede testy, zkusí
|
|
||||||
ji nastartovat a pověsí ji na release jako `kostky-linux-x86_64`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git tag v1.0.0 && git push origin v1.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
Vedle binárky se věší i `kostky-linux-x86_64.sha256`, takže se stažený
|
|
||||||
soubor dá ověřit:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sha256sum -c kostky-linux-x86_64.sha256
|
|
||||||
```
|
|
||||||
|
|
||||||
Stejná stavba běží i nad každým pull requestem, jen se nikam nevěší.
|
|
||||||
|
|
||||||
## Testy
|
## Testy
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -163,7 +146,3 @@ uv run --with-requirements requirements.txt --no-project pytest
|
|||||||
```
|
```
|
||||||
|
|
||||||
Nebo z připraveného prostředí prostě `pytest`.
|
Nebo z připraveného prostředí prostě `pytest`.
|
||||||
|
|
||||||
Nad každým pull requestem a nad `main` běží `.gitea/workflows/testy.yml` —
|
|
||||||
84 testů na Pythonu 3.11, 3.12, 3.13 i 3.14, a k tomu skriptovaná partie
|
|
||||||
v terminálové verzi, na kterou pytest nesahá.
|
|
||||||
@@ -1,22 +1,30 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Postaví jednosouborovou binárku pro Linux do dist/kostky.
|
# Postaví jednosouborovou binárku pro Linux do dist/kostky.
|
||||||
#
|
#
|
||||||
# Staví se proti samostatnému CPythonu od uv, ne proti systémovému. Ten je
|
# Staví se v kontejneru s glibc 2.28 (AlmaLinux 8), ne na hostiteli. Binárka
|
||||||
# slinkovaný s glibc 2.17, takže binárka jede i na letitých systémech.
|
# slinkovaná proti glibc z Fedory 44 by nešla spustit nikde se starším
|
||||||
# Postavená proti Pythonu z Fedory 44 by chtěla glibc 2.43 a nešla by
|
# systémem — glibc drží zpětnou kompatibilitu, ne dopřednou. Postavené na
|
||||||
# spustit skoro nikde — glibc drží zpětnou kompatibilitu, ne dopřednou.
|
# staré glibc poběží i na nové.
|
||||||
# Nic z hostitele se do ní nedostane, takže kontejner k tomu není potřeba.
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
VERSION=${VERSION:-3.11}
|
IMAGE=${IMAGE:-docker.io/library/almalinux:8}
|
||||||
BUILD=${BUILD:-.build}
|
PYTHON=${PYTHON:-python3.11}
|
||||||
|
ENGINE=${ENGINE:-$(command -v podman || command -v docker)}
|
||||||
|
|
||||||
uv python install "$VERSION"
|
# Rootless podman mapuje roota v kontejneru na tebe, docker ne — tam by
|
||||||
uv venv --quiet --managed-python --python "$VERSION" "$BUILD"
|
# dist/ zůstalo cizí.
|
||||||
uv pip install --quiet --python "$BUILD/bin/python" -r requirements.txt pyinstaller
|
FIXUP=":"
|
||||||
|
[[ "$ENGINE" == *docker ]] && FIXUP="chown -R $(id -u):$(id -g) dist"
|
||||||
|
|
||||||
"$BUILD/bin/pyinstaller" --clean --noconfirm \
|
"$ENGINE" run --rm -v "$PWD:/src:z" -w /src "$IMAGE" bash -euc "
|
||||||
--distpath dist --workpath "$BUILD/work" kostky.spec
|
dnf install -y -q python3.11 binutils
|
||||||
|
$PYTHON -m venv /tmp/build
|
||||||
|
/tmp/build/bin/pip install --quiet --upgrade pip
|
||||||
|
/tmp/build/bin/pip install --quiet flask qrcode pyinstaller
|
||||||
|
/tmp/build/bin/pyinstaller --clean --noconfirm \
|
||||||
|
--distpath dist --workpath /tmp/work kostky.spec
|
||||||
|
$FIXUP
|
||||||
|
"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
ls -lh dist/kostky
|
ls -lh dist/kostky
|
||||||
Reference in new issue
Block a user