Publikovat image do registru balíčků Gitey
binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Failing after 9s
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 1s
testy / pytest (3.14) (pull_request) Successful in 1s

Compose soubor měl v sobě build: context: .., takže si image stavěl z
lokálních zdrojáků a bez naklonovaného repozitáře byl k ničemu. Proti LXC
cestě, kde se stahuje hotová binárka, to byla nesrovnalost.

Nové workflow staví image na domácím runneru a při vydání ho pošle do
registru Gitey, pro amd64 i arm64. Compose se tím smrskl na jeden soubor,
který si člověk stáhne a rovnou spustí.

Automatický token Actions na balíčky nestačí — Gitea to zatím neumí a sama
v dokumentaci odkazuje na osobní token. Je v secrets pod PACKAGE_TOKEN;
jméno nesmí začínat na GITEA_, ten prefix si Gitea vyhrazuje.

Nad pull requesty se image staví a zkouší, ale nepublikuje. Dockerfile do
teď v CI žádné pokrytí neměl a rozbil by se až při releasu.

Image se jmenuje podle repozitáře, dice-counter. Zbytek projektu pořád mluví
o kostkách; sjednocení je na samostatné issue, protože se dotkne vydaných
binárek i běžících instalací.
This commit is contained in:
gitea-actions committed 2026-08-23 20:09:20 +02:00
1 parent 4faddc8b22
commit 0bb2e0efab
3 files changed
+158 -14

No files matched your search

+127
View File
@@ -0,0 +1,127 @@
# Postaví kontejnerový image a při vydání ho pošle do registru Gitey.
#
# Runner běží v host módu, takže tu nejsou hotové akce z marketplace a všechno
# je obyčejný shell — stejně jako v ostatních workflow tady. Docker na
# hostiteli být musí, ten se tu neinstaluje.
#
# Nad pull requesty se image staví a zkouší, ale nikam se neposílá. Dockerfile
# by se jinak rozbil až ve chvíli, kdy se tagne release.
name: image
on:
push:
tags: ["v*"]
pull_request:
workflow_dispatch:
env:
REGISTRY: gitea.spacilovi.eu
IMAGE: david-spacil/dice-counter
PLATFORMS: linux/amd64,linux/arm64
ZKOUSKA_PORT: "18000"
jobs:
image:
runs-on: homelab
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: Předpoklady
run: |
command -v docker >/dev/null \
|| { echo "Docker na runneru není." >&2; exit 1; }
docker buildx version >/dev/null 2>&1 \
|| { echo "Chybí docker buildx — bez něj multiarch nejde." >&2; exit 1; }
docker version --format '{{.Server.Version}}'
- name: QEMU pro cizí architektury
run: |
# Registruje binfmt, aby šlo na x86 stroji stavět i arm64. Všechny
# závislosti jsou čistě pythonní, takže se pod emulací nic
# nekompiluje a stavba tím prakticky netrpí.
docker run --privileged --rm tonistiigi/binfmt --install arm64
- name: Builder
run: |
# Výchozí ovladač Dockeru multiplatformní stavbu neumí, je potřeba
# docker-container. Krok se pouští opakovaně, tak ať nevadí, že
# builder z minula už existuje.
docker buildx create --name kostky --driver docker-container --use \
2>/dev/null || docker buildx use kostky
docker buildx inspect --bootstrap | head -20
- name: Zkouška
run: |
# Zkouší se nativní amd64: --load umí do místního Dockeru uložit jen
# jednu platformu a spustit stejně nic jiného nejde.
docker buildx build --platform linux/amd64 --load \
-f deploy/Dockerfile \
--build-arg VERSION="zkouska-${GITHUB_SHA:0:7}" \
-t kostky:zkouska .
trap 'docker rm -f kostky-zkouska >/dev/null 2>&1 || true' EXIT
# Adresa se vnucuje, ať zkouška nezávisí na síti běhounu a dá se
# ověřit, co přesně tabule nabídne.
docker run -d --name kostky-zkouska --init \
-p "${ZKOUSKA_PORT}:${ZKOUSKA_PORT}" -e DICE_HOST=127.0.0.1 \
-e DICE_PORT="${ZKOUSKA_PORT}" kostky:zkouska
for _ in $(seq 30); do
curl -sf -o /dev/null "http://127.0.0.1:${ZKOUSKA_PORT}/" && break
sleep 1
done
curl -sf -o /dev/null "http://127.0.0.1:${ZKOUSKA_PORT}/" || {
echo "Kontejner se nerozeběhl." >&2
docker logs kostky-zkouska >&2
exit 1; }
curl -sf -o /dev/null "http://127.0.0.1:${ZKOUSKA_PORT}/static/style.css"
curl -sf "http://127.0.0.1:${ZKOUSKA_PORT}/board" | grep -q "127.0.0.1:${ZKOUSKA_PORT}"
curl -sf -o /dev/null "http://127.0.0.1:${ZKOUSKA_PORT}/export"
# Verze se musí do image opravdu dostat, ne se hlásit jako neznámá.
docker run --rm kostky:zkouska python web.py --version
! docker run --rm kostky:zkouska python web.py --version | grep -q "neznámá"
docker logs kostky-zkouska
echo "Image jede."
- name: Publikace
if: startsWith(github.ref, 'refs/tags/')
env:
TOKEN: ${{ secrets.PACKAGE_TOKEN }}
VLASTNIK: ${{ github.repository_owner }}
run: |
# Automatický token Actions na balíčky nestačí — Gitea to zatím
# neumí a sama v dokumentaci odkazuje na osobní token. Ten je
# v secrets pod PACKAGE_TOKEN; jméno nesmí začínat na GITEA_,
# ten prefix si Gitea vyhrazuje.
[ -n "$TOKEN" ] || { echo "Chybí secret PACKAGE_TOKEN." >&2; exit 1; }
echo "$TOKEN" | docker login "$REGISTRY" -u "$VLASTNIK" --password-stdin
trap 'docker logout "$REGISTRY" >/dev/null 2>&1 || true' EXIT
# Značka bez počátečního "v": v repozitáři je v1.2.0, u image se
# čekají 1.2.0.
VERZE="${GITHUB_REF_NAME#v}"
docker buildx build --platform "$PLATFORMS" --push \
-f deploy/Dockerfile \
--build-arg VERSION="${GITHUB_REF_NAME}" \
-t "$REGISTRY/$IMAGE:$VERZE" \
-t "$REGISTRY/$IMAGE:latest" .
echo "Publikováno: $REGISTRY/$IMAGE:$VERZE a :latest"
docker buildx imagetools inspect "$REGISTRY/$IMAGE:$VERZE"
+23 -7
View File
@@ -192,13 +192,28 @@ Je idempotentní; druhé spuštění jen vymění binárku za nejnovější.
### Docker ### Docker
Stačí jeden soubor, repozitář k tomu potřeba není:
```bash ```bash
cd deploy && docker compose up -d curl -fsSLO https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/docker-compose.yaml
docker compose up -d
``` ```
Staví se ze zdrojáků, takže image jde sestavit pro amd64 i arm64 a nezávisí Image se stáhne hotový z registru Gitey, pro amd64 i arm64 — Docker si vybere
na tom, jestli release pro danou architekturu proběhl. Databáze leží svoji variantu sám. Databáze leží v pojmenovaném svazku, appka běží pod
v pojmenovaném svazku, appka běží pod nerootovým uživatelem. nerootovým uživatelem.
Aktualizace na novější vydání:
```bash
docker compose pull && docker compose up -d
```
Kdo si ho radši postaví ze zdrojáků, přebije ten stažený stejnou značkou:
```bash
docker build -f deploy/Dockerfile -t gitea.spacilovi.eu/david-spacil/dice-counter:latest .
```
**Pozor na síť.** Compose schválně používá `network_mode: host`. V bridge **Pozor na síť.** Compose schválně používá `network_mode: host`. V bridge
režimu kontejner uvnitř vidí adresu jako `172.17.0.2`, tabule ji poctivě režimu kontejner uvnitř vidí adresu jako `172.17.0.2`, tabule ji poctivě
@@ -207,9 +222,9 @@ Kdo bridge potřebuje, musí nastavit `DICE_HOST` na adresu hostitele v LAN.
| | LXC | Docker | | | LXC | Docker |
|---|---|---| |---|---|---|
| Odkud | vydaná binárka z releasu | zdrojáky | | Odkud | vydaná binárka z releasu | image z registru |
| Databáze | `/var/lib/kostky/dice.db` | svazek `kostky-data` | | Databáze | `/var/lib/kostky/dice.db` | svazek `kostky-data` |
| Aktualizace | `pve-kostky.sh update <ctid>` | `docker compose build --pull` | | Aktualizace | `update` uvnitř kontejneru | `docker compose pull` |
| Adresa a QR | funguje samo | potřeba síť hostitele | | Adresa a QR | funguje samo | potřeba síť hostitele |
## Když se telefon nepřipojí ## Když se telefon nepřipojí
@@ -248,7 +263,7 @@ při remíze na prvním místě se hraje dál.
| `console.py` | aby čeština prošla i windowsovou konzolí | | `console.py` | aby čeština prošla i windowsovou konzolí |
| `version.py` | která verze to je — z gitu, nebo z binárky | | `version.py` | která verze to je — z gitu, nebo z binárky |
| `build.sh`, `kostky.spec` | stavba binárky | | `build.sh`, `kostky.spec` | stavba binárky |
| `.gitea/workflows/` | testy a linuxová binárka doma | | `.gitea/workflows/` | testy, linuxová binárka a image doma |
| `.github/workflows/` | binárky pro Windows a macOS | | `.github/workflows/` | binárky pro Windows a macOS |
| `deploy/` | nasazení na server: Proxmox LXC a Docker | | `deploy/` | nasazení na server: Proxmox LXC a Docker |
@@ -330,6 +345,7 @@ Otagovaný commit spustí stavbu na obou stranách:
| Kde | Co staví | Workflow | | Kde | Co staví | Workflow |
|---|---|---| |---|---|---|
| vlastní runner u Gitey | Linux x86-64 | `.gitea/workflows/binarka.yml` | | vlastní runner u Gitey | Linux x86-64 | `.gitea/workflows/binarka.yml` |
| vlastní runner u Gitey | image amd64 + arm64 | `.gitea/workflows/image.yml` |
| GitHub Actions | Windows, macOS ×2, Linux ARM64 | `.github/workflows/binarky.yml` | | GitHub Actions | Windows, macOS ×2, Linux ARM64 | `.github/workflows/binarky.yml` |
```bash ```bash
@@ -1,18 +1,19 @@
# Počitadlo kostek v Dockeru. # Počitadlo kostek v Dockeru.
# #
# cd deploy && docker compose up -d # curl -fsSLO https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/docker-compose.yaml
# docker compose up -d
#
# Nic dalšího není potřeba — image se stáhne hotový, pro amd64 i arm64.
# Kdo si ho chce postavit ze zdrojáků, přebije ten stažený stejnou značkou:
#
# docker build -f deploy/Dockerfile -t gitea.spacilovi.eu/david-spacil/dice-counter:latest .
# #
# Počítá se s domácí sítí. Appka nemá přihlašování, tohle ji nijak # Počítá se s domácí sítí. Appka nemá přihlašování, tohle ji nijak
# nezabezpečuje a do internetu nepatří. # nezabezpečuje a do internetu nepatří.
services: services:
kostky: kostky:
build: image: gitea.spacilovi.eu/david-spacil/dice-counter:latest
context: ..
dockerfile: deploy/Dockerfile
args:
VERSION: ${VERSION:-vlastní sestavení}
image: kostky:latest
container_name: kostky container_name: kostky
restart: unless-stopped restart: unless-stopped