Publikovat image do registru balíčků Gitey #15

Merged
david-spacil merged 5 commits from enhancement/docker-compose into main 2026-08-23 20:46:47 +02:00
Owner

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

Teď stačí jeden soubor:

curl -fsSLO https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/docker-compose.yaml
docker compose up -d

Co je uvnitř

Nové .gitea/workflows/image.yml — staví na domácím runneru (homelab), drží se zvyklostí ostatních workflow: žádné akce z marketplace, ruční checkout přes git init, všechno obyčejný shell.

  • nad PR: postaví amd64, spustí a ověří /, /static, /board, /export a --version; nikam nic neposílá
  • na tagu: multiarch linux/amd64,linux/arm64 s --push, značky 1.2.0 a latest

deploy/compose.yaml → deploy/docker-compose.yaml (přes git mv), build: pryč, míří na gitea.spacilovi.eu/david-spacil/dice-counter:latest.

Token

Automatický token Actions na balíčky nestačí, Gitea sama v dokumentaci odkazuje na osobní token:

The GITEA_TOKEN … should be able to publish to the associated package repository (i.e. to upload OCI images)… This is not implemented in Gitea Actions now. A workaround for Gitea Actions is to use a Personal Access Token (PAT).

Secret PACKAGE_TOKEN už je vložený. Jméno nesmí začínat na GITEA_, ten prefix si Gitea vyhrazuje.

Jméno image

dice-counter podle repozitáře, ne kostky. Zbytek projektu pořád mluví o kostkách — binárky, systemd služba, cesty, svazek. Sjednocení je na samostatném issue, protože se dotkne vydaných binárek i běžících instalací.


Ověřeno

Všechny příkazy z workflow jsem pustil lokálně proti skutečnému deploy/Dockerfile:

  • docker buildx create --driver docker-container → builder umí linux/amd64, linux/arm64
  • stavba amd64 s --load, kontejner naběhl, všechny čtyři kontroly prošly (/, /static/style.css, /board obsahuje očekávanou adresu, /export)
  • --version hlásí vypálenou verzi, ne neznámá
  • multiarch stavba ověřena skrz manifest: výstup do OCI archivu obsahuje linux/amd64 i linux/arm64

Cestou se ukázala chyba, kterou by CI jinak našlo až za běhu: měl jsem -p 18000:8000 a zároveň DICE_PORT=18000, takže appka uvnitř poslouchala na 18000, ale mapování mířilo na prázdný port 8000. Všechny kontroly tiše selhávaly. Opraveno na stejný port z obou stran.

Neověřeno: samotný docker login a --push do registru — na to je potřeba token, který mám jen v CI. To se pozná při prvním tagu.

Po prvním publikování je potřeba vyzkoušet anonymní stažení (docker logout a docker pull) — dokumentace Gitey nikde výslovně netvrdí, že jsou balíčky veřejných repozitářů čitelné bez přihlášení. Kdyby ne, řeší se to viditelností balíčku v jeho nastavení.

Compose soubor měl v sobě `build: context: ..`, takže si image stavěl z lokálních zdrojáků — bez naklonovaného repozitáře byl k ničemu. Proti LXC cestě, kde se stahuje hotová binárka a nic se nekompiluje, to byla nesrovnalost. Teď stačí jeden soubor: ```bash curl -fsSLO https://gitea.spacilovi.eu/david-spacil/dice-counter/raw/branch/main/deploy/docker-compose.yaml docker compose up -d ``` ## Co je uvnitř **Nové `.gitea/workflows/image.yml`** — staví na domácím runneru (`homelab`), drží se zvyklostí ostatních workflow: žádné akce z marketplace, ruční checkout přes `git init`, všechno obyčejný shell. - **nad PR**: postaví amd64, spustí a ověří `/`, `/static`, `/board`, `/export` a `--version`; nikam nic neposílá - **na tagu**: multiarch `linux/amd64,linux/arm64` s `--push`, značky `1.2.0` a `latest` **`deploy/compose.yaml` → `deploy/docker-compose.yaml`** (přes `git mv`), `build:` pryč, míří na `gitea.spacilovi.eu/david-spacil/dice-counter:latest`. ## Token Automatický token Actions na balíčky nestačí, Gitea sama v dokumentaci odkazuje na osobní token: > The `GITEA_TOKEN` … should be able to publish to the associated package repository (i.e. to upload OCI images)… **This is not implemented in Gitea Actions now.** A workaround for Gitea Actions is to use a Personal Access Token (PAT). Secret `PACKAGE_TOKEN` už je vložený. Jméno nesmí začínat na `GITEA_`, ten prefix si Gitea vyhrazuje. ## Jméno image `dice-counter` podle repozitáře, ne `kostky`. Zbytek projektu pořád mluví o kostkách — binárky, systemd služba, cesty, svazek. Sjednocení je na samostatném issue, protože se dotkne vydaných binárek i běžících instalací. --- ## Ověřeno Všechny příkazy z workflow jsem pustil lokálně proti skutečnému `deploy/Dockerfile`: - `docker buildx create --driver docker-container` → builder umí `linux/amd64, linux/arm64` - stavba amd64 s `--load`, kontejner naběhl, **všechny čtyři kontroly prošly** (`/`, `/static/style.css`, `/board` obsahuje očekávanou adresu, `/export`) - `--version` hlásí vypálenou verzi, ne `neznámá` - **multiarch stavba ověřena skrz manifest**: výstup do OCI archivu obsahuje `linux/amd64` i `linux/arm64` Cestou se ukázala chyba, kterou by CI jinak našlo až za běhu: měl jsem `-p 18000:8000` a zároveň `DICE_PORT=18000`, takže appka uvnitř poslouchala na 18000, ale mapování mířilo na prázdný port 8000. Všechny kontroly tiše selhávaly. Opraveno na stejný port z obou stran. **Neověřeno:** samotný `docker login` a `--push` do registru — na to je potřeba token, který mám jen v CI. To se pozná při prvním tagu. Po prvním publikování je potřeba vyzkoušet **anonymní stažení** (`docker logout` a `docker pull`) — dokumentace Gitey nikde výslovně netvrdí, že jsou balíčky veřejných repozitářů čitelné bez přihlášení. Kdyby ne, řeší se to viditelností balíčku v jeho nastavení.
david-spacil added 1 commit 2026-08-23 20:09:58 +02:00
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
0bb2e0efab
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í.
david-spacil added 1 commit 2026-08-23 20:14:21 +02:00
Ověřit emulaci dřív, než se do stavby pustíme
binárka / linux (pull_request) Successful in 10s
image / image (pull_request) Failing after 2s
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
9283a87a1e
První běh na runneru odhalil dvě věci.

Rouru do `head` shodil pipefail: head zavřel rouru po dvaceti řádcích, docker
dostal EPIPE a krok skončil na 255, přestože se builder založil v pořádku.

Horší je, že binfmt se sice nainstaloval (installing: arm64 OK), ale buildkit
pak arm64 mezi platformami nenabídl. Emulace musí být registrovaná s příznakem
F, aby si na ni buildkit ve svém kontejneru sáhl bez interpretu v souborovém
systému; jinak vidí jen nativní platformy. Doma to tak mám z qemu-user-static
a proto tam multiarch stavba prošla.

Builder se teď staví načisto — ten z minulého běhu by si pamatoval platformy
z doby před registrací — a hned po něm se ověří, že arm64 v seznamu opravdu
je. Bez toho by stavba spadla až na konci s hláškou, ze které se nic nepozná.
david-spacil added 1 commit 2026-08-23 20:31:28 +02:00
Image vydávat z GitHubu, doma ho jen zkoušet
binárka / linux (pull_request) Successful in 10s
image / image (pull_request) Successful in 26s
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
b6066e2be8
Domácí runner běží v LXC. binfmt_misc je vlastnost jádra hostitele a do toho
se kvůli počitadlu kostek vrtat nebude — je produkční. tonistiigi/binfmt sice
hlásil úspěch, ale na hostiteli po něm nezůstala žádná registrace, takže
buildkit arm64 mezi platformami nikdy neuvidí.

Stejná dělba jako u binárek: doma se hlídá, na GitHubu se vydává. Zdejší
workflow staví nativní amd64 obyčejným `docker build` a zkouší ho spustit nad
každým pull requestem; žádný buildx, žádná emulace, nic, co by na runneru
mohlo chybět. Publikaci multiarch image převzalo .github/workflows/image.yml,
kde jsou běhouni plnohodnotné virtuály a emulace funguje bez zásahu.

Publikovat jde nově jen z tagu. Ruční spuštění nad větví by udělalo `:latest`
ukazující na rozdělanou práci.
david-spacil added 1 commit 2026-08-23 20:41:05 +02:00
Nezavádět další "kostky" tam, kde na to není důvod
binárka / linux (pull_request) Successful in 10s
image / image (pull_request) Successful in 13s
testy / pytest (3.11) (pull_request) Successful in 0s
testy / pytest (3.12) (pull_request) Successful in 0s
testy / pytest (3.13) (pull_request) Successful in 1s
testy / pytest (3.14) (pull_request) Successful in 1s
b1b7d1fad1
Značka image ve zkoušce, testovací kontejner a builder buildx se jmenovaly
kostky. Všechno to vzniká a mizí uvnitř jednoho běhu CI, nikam se to
nepropisuje a nic to nestojí — jen jsem to zkopíroval ze zvyku.

Jména v docker-compose.yaml (služba, container_name, svazek kostky-data)
zůstávají; ta se dotýkají uložených dat a patří k tomu úklidu ve #16.
david-spacil added 1 commit 2026-08-23 20:45:39 +02:00
Sjednotit jména i v dockerové cestě
binárka / linux (pull_request) Successful in 11s
image / image (pull_request) Successful in 16s
testy / pytest (3.11) (pull_request) Successful in 0s
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
826f243af7
Služba, container_name, svazek a uživatel uvnitř image se jmenovaly kostky.
Teď je nejlevnější chvíle to srovnat: compose se dá použít teprve od tohohle
PR, takže svazek kostky-data zatím nikde neexistuje a není co migrovat. Po
vydání by to už chtělo přesun dat.

Uživateli zůstává uid 1000, takže vlastnictví souborů v /data nezávisí na
jménu a bind mounty se nerozbijí.

LXC strana (kostky.service, /opt/kostky, /var/lib/kostky) zůstává na #16 —
tam přejmenování znamená migraci běžícím instalacím.
david-spacil merged commit 96f2fc1028 into main 2026-08-23 20:46:47 +02:00
david-spacil deleted branch enhancement/docker-compose 2026-08-23 20:46:47 +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#15