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
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.
86 lines
3.1 KiB
YAML
86 lines
3.1 KiB
YAML
# Postaví kontejnerový image a zkusí ho spustit. Nikam ho neposílá.
|
|
#
|
|
# Dockerfile by se jinak rozbil až ve chvíli, kdy se tagne release — tohle ho
|
|
# ohlídá nad každým pull requestem.
|
|
#
|
|
# Publikuje se jinde: .github/workflows/image.yml. Zdejší runner běží v LXC,
|
|
# kde nejde zaregistrovat binfmt, takže arm64 by se tu postavit nedalo.
|
|
# Registrace je vlastnost jádra hostitele a to je produkční stroj, do kterého
|
|
# se kvůli počitadlu kostek vrtat nebude.
|
|
#
|
|
# Staví se nativní amd64 obyčejným `docker build`, žádný buildx ani emulace.
|
|
name: image
|
|
|
|
on:
|
|
pull_request:
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
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 version --format '{{.Server.Version}}'
|
|
|
|
- name: Stavba
|
|
run: |
|
|
docker build -f deploy/Dockerfile \
|
|
--build-arg VERSION="zkouska-${GITHUB_SHA:0:7}" \
|
|
-t kostky:zkouska .
|
|
|
|
- name: Zkouška
|
|
run: |
|
|
trap 'docker rm -f kostky-zkouska >/dev/null 2>&1 || true' EXIT
|
|
|
|
# Port musí být stejný uvnitř i venku: appka poslouchá na DICE_PORT,
|
|
# takže mapovat ho na jiný by znamenalo mířit do prázdna.
|
|
# Adresa se vnucuje, ať zkouška nezávisí na síti runneru 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: Úklid
|
|
if: always()
|
|
run: docker rmi kostky:zkouska >/dev/null 2>&1 || true
|