make deploy: l'ultimo commit su 50037.manzolo.it, immagine costruita e provata sul PC

Il deploy prende HEAD (git archive, mai la cartella di lavoro), fa girare i test su quella copia,
costruisce l'immagine qui, la prova su una porta di passaggio (pagina, motore, voci, musichetta)
e solo se risponde la spedisce con docker save | docker load al container leggenda-regolo di
home-server, sulla rete nginx-net. Host in deploy.local.mk, fuori da git. In STATO: online e
consenso dei vecchietti confermato da Andrea.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UdeKd62opy9PKgpQXtVctF
This commit is contained in:
2026-10-23 20:17:17 +02:00
co-authored by Claude Opus 5.5
parent 2d682d8ae9
commit 07bdd72e3e
4 changed files with 53 additions and 3 deletions
+34 -1
View File
@@ -24,7 +24,7 @@ CROP ?=
COLORS ?= 64
.PHONY: help serve open test browser verify voci voci-elenco sfondi sfondi-genera sfondi-confronto background character \
build up down restart logs ps shell image-size clean distclean
build up down restart logs ps shell image-size deploy deploy-logs clean distclean
## ------------------------------------------------------------ sviluppo
@@ -107,6 +107,39 @@ shell: ## Shell dentro il container
image-size: ## Dimensione dell'immagine
@docker image ls $(IMAGE):$(TAG) --format '{{.Repository}}:{{.Tag}} {{.Size}}'
## ------------------------------------------------------------ deploy su un server proprio
# Host e indirizzo stanno in deploy.local.mk, fuori da git, per esempio:
# DEPLOY_HOST = root@mio-server
# DEPLOY_URL = https://gioco.esempio
-include deploy.local.mk
DEPLOY_DIR ?= /root/leggenda-regolo
DEPLOY_TMP := $(shell mktemp -d -u /tmp/regolo-deploy.XXXXXX)
# Si pubblica l'ultimo commit (git archive HEAD), mai la cartella di lavoro: un'altra sessione può avere modifiche a
# metà. Test su quella copia, immagine costruita e provata qui, poi spedita già pronta (docker save | docker load):
# sul server non si compila niente.
SMOKE_PORT ?= 18737
deploy: ## Pubblica l'ultimo commit: test, immagine costruita e provata qui, spedita al server e riavviata
@test -n "$(DEPLOY_HOST)" || { echo "manca DEPLOY_HOST: scrivilo in deploy.local.mk"; exit 2; }
mkdir -p $(DEPLOY_TMP) && git archive HEAD | tar -x -C $(DEPLOY_TMP)
cd $(DEPLOY_TMP) && $(NODE) --test tests/*.test.mjs
docker build -q -t $(IMAGE):latest -t $(IMAGE):$$(git rev-parse --short HEAD) $(DEPLOY_TMP)
@docker rm -f $(IMAGE)-prova >/dev/null 2>&1 || true
docker run -d --rm --name $(IMAGE)-prova -p 127.0.0.1:$(SMOKE_PORT):80 $(IMAGE):latest >/dev/null
@ok=1; sleep 1; for u in / /src/main.js /assets/voices/index.json /assets/audio/cartello.mp3; do \
c=$$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:$(SMOKE_PORT)$$u); echo " prova $$u → $$c"; [ "$$c" = 200 ] || ok=0; done; \
docker rm -f $(IMAGE)-prova >/dev/null; [ $$ok = 1 ] || { echo "l'immagine non risponde come deve: non la spedisco"; exit 1; }
ssh $(DEPLOY_HOST) 'mkdir -p $(DEPLOY_DIR)'
scp -q $(DEPLOY_TMP)/docker-compose.homeserver.yml $(DEPLOY_HOST):$(DEPLOY_DIR)/docker-compose.yml
docker save $(IMAGE):latest | gzip | ssh $(DEPLOY_HOST) 'gunzip | docker load -q && cd $(DEPLOY_DIR) && docker compose up -d && docker image prune -f >/dev/null'
rm -rf $(DEPLOY_TMP)
@echo "→ $(DEPLOY_URL) ($$(git log -1 --format='%h %s'))"
deploy-logs: ## Log del container sul server di deploy
@test -n "$(DEPLOY_HOST)" || { echo "manca DEPLOY_HOST: scrivilo in deploy.local.mk"; exit 2; }
ssh $(DEPLOY_HOST) 'cd $(DEPLOY_DIR) && docker compose logs -f --tail 50'
## ------------------------------------------------------------ pulizia
clean: ## Rimuove file temporanei