From 0bb2e0efabbf4982eded1b4f839a6292d6d962a7 Mon Sep 17 00:00:00 2001 From: gitea-actions Date: Sun, 23 Aug 2026 20:09:20 +0200 Subject: [PATCH] =?UTF-8?q?Publikovat=20image=20do=20registru=20bal=C3=AD?= =?UTF-8?q?=C4=8Dk=C5=AF=20Gitey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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í. --- .gitea/workflows/image.yml | 127 +++++++++++++++++++ README.md | 30 ++++- deploy/{compose.yaml => docker-compose.yaml} | 15 ++- 3 files changed, 158 insertions(+), 14 deletions(-) create mode 100644 .gitea/workflows/image.yml rename deploy/{compose.yaml => docker-compose.yaml} (70%) diff --git a/.gitea/workflows/image.yml b/.gitea/workflows/image.yml new file mode 100644 index 0000000..678510f --- /dev/null +++ b/.gitea/workflows/image.yml @@ -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" diff --git a/README.md b/README.md index 03d9048..34fbe43 100644 --- a/README.md +++ b/README.md @@ -192,13 +192,28 @@ Je idempotentní; druhé spuštění jen vymění binárku za nejnovější. ### Docker +Stačí jeden soubor, repozitář k tomu potřeba není: + ```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í -na tom, jestli release pro danou architekturu proběhl. Databáze leží -v pojmenovaném svazku, appka běží pod nerootovým uživatelem. +Image se stáhne hotový z registru Gitey, pro amd64 i arm64 — Docker si vybere +svoji variantu sám. Databáze leží v pojmenovaném svazku, appka běží pod +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 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 | |---|---|---| -| 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` | -| Aktualizace | `pve-kostky.sh update ` | `docker compose build --pull` | +| Aktualizace | `update` uvnitř kontejneru | `docker compose pull` | | Adresa a QR | funguje samo | potřeba síť hostitele | ## 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í | | `version.py` | která verze to je — z gitu, nebo z 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 | | `deploy/` | nasazení na server: Proxmox LXC a Docker | @@ -330,6 +345,7 @@ Otagovaný commit spustí stavbu na obou stranách: | Kde | Co staví | Workflow | |---|---|---| | 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` | ```bash diff --git a/deploy/compose.yaml b/deploy/docker-compose.yaml similarity index 70% rename from deploy/compose.yaml rename to deploy/docker-compose.yaml index afffe17..f9e7a62 100644 --- a/deploy/compose.yaml +++ b/deploy/docker-compose.yaml @@ -1,18 +1,19 @@ # 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 # nezabezpečuje a do internetu nepatří. services: kostky: - build: - context: .. - dockerfile: deploy/Dockerfile - args: - VERSION: ${VERSION:-vlastní sestavení} - image: kostky:latest + image: gitea.spacilovi.eu/david-spacil/dice-counter:latest container_name: kostky restart: unless-stopped