Il deploy passa dal registry di Gitea: make deploy costruisce l'immagine dal tag della versione, la spinge su git.manzolo.it/manzolo/leggenda-regolo:vX.Y.Z e :latest, scrive il tag nel compose del VPS e lì fa pull e up; tolto docker save/load. Il compose di produzione si chiama docker-compose.deploy.yml. Nel README il download dagli zip dei tag, in CLAUDE.md il nuovo flusso (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
This commit is contained in:
@@ -121,40 +121,50 @@ image-size: ## Dimensione dell'immagine
|
||||
|
||||
## ------------------------------------------------------------ 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
|
||||
# DEPLOY_DIR = docker/leggenda-regolo (la cartella del compose sul server)
|
||||
# Host e cartella stanno in deploy.local.mk, fuori da git, per esempio:
|
||||
# DEPLOY_HOST = root@mio-server
|
||||
# DEPLOY_URL = https://gioco.esempio
|
||||
# DEPLOY_DIR = docker/leggenda-regolo (la cartella del compose sul server)
|
||||
# DEPLOY_IMAGE = registry.esempio/utente/leggenda-regolo
|
||||
-include deploy.local.mk
|
||||
DEPLOY_DIR ?= /root/leggenda-regolo
|
||||
DEPLOY_TMP := $(shell mktemp -d -u /tmp/regolo-deploy.XXXXXX)
|
||||
DEPLOY_DIR ?= /root/leggenda-regolo
|
||||
DEPLOY_IMAGE ?= git.manzolo.it/manzolo/leggenda-regolo
|
||||
DEPLOY_TMP := $(shell mktemp -d -u /tmp/regolo-deploy.XXXXXX)
|
||||
# La versione dell'ultimo commit (non della cartella di lavoro): il tag git, dell'immagine e del compose.
|
||||
DEPLOY_VER := v$(shell git show HEAD:src/version.js 2>/dev/null | sed -n "s/.*VERSION = '\([^']*\)'.*/\1/p")
|
||||
|
||||
# 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.
|
||||
# Si pubblica il tag della versione dichiarata dall'ultimo commit (git archive vX.Y.Z, quello di make bump), mai la
|
||||
# cartella di lavoro: un'altra sessione può avere modifiche a metà, e i commit dopo il tag aspettano la versione dopo.
|
||||
# Test su quella copia, immagine costruita e provata qui, spinta sul registry di Gitea come :vX.Y.Z e :latest; il
|
||||
# VPS la scarica con il tag scritto nel suo compose (preso da HEAD, docker-compose.deploy.yml).
|
||||
SMOKE_PORT ?= 18737
|
||||
deploy: ## Pubblica l'ultimo commit: test, immagine costruita e provata qui, spedita al server e riavviata
|
||||
deploy: ## Pubblica la versione dell'ultimo commit: test, immagine provata qui, push sul registry, pull e riavvio sul server
|
||||
@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)
|
||||
@git rev-parse -q --verify 'refs/tags/$(DEPLOY_VER)' >/dev/null || { echo "manca il tag $(DEPLOY_VER): prima make bump"; exit 2; }
|
||||
mkdir -p $(DEPLOY_TMP) && git archive $(DEPLOY_VER) | 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 build -q -t $(DEPLOY_IMAGE):$(DEPLOY_VER) -t $(DEPLOY_IMAGE):latest $(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
|
||||
docker run -d --rm --name $(IMAGE)-prova -p 127.0.0.1:$(SMOKE_PORT):80 $(DEPLOY_IMAGE):$(DEPLOY_VER) >/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'
|
||||
docker push -q $(DEPLOY_IMAGE):$(DEPLOY_VER)
|
||||
docker push -q $(DEPLOY_IMAGE):latest
|
||||
git show HEAD:docker-compose.deploy.yml | sed 's|$(DEPLOY_IMAGE):VERSIONE|$(DEPLOY_IMAGE):$(DEPLOY_VER)|' | \
|
||||
ssh $(DEPLOY_HOST) 'mkdir -p $(DEPLOY_DIR) && cat > $(DEPLOY_DIR)/docker-compose.yml'
|
||||
ssh $(DEPLOY_HOST) 'cd $(DEPLOY_DIR) && docker compose pull -q && docker compose up -d && \
|
||||
docker image ls $(DEPLOY_IMAGE) --format "{{.Repository}}:{{.Tag}}" | grep -v -x -e $(DEPLOY_IMAGE):$(DEPLOY_VER) | xargs -r docker image rm >/dev/null; \
|
||||
docker image prune -f >/dev/null'
|
||||
rm -rf $(DEPLOY_TMP)
|
||||
@# Sul server il prune toglie l'immagine vecchia; qui restano solo latest e quella appena pubblicata.
|
||||
@docker image ls $(IMAGE) --format '{{.Tag}}' | grep -v -x -e latest -e $$(git rev-parse --short HEAD) | \
|
||||
xargs -r -I{} docker image rm -f $(IMAGE):{} >/dev/null
|
||||
@# Qui restano solo latest e la versione appena pubblicata.
|
||||
@docker image ls $(DEPLOY_IMAGE) --format '{{.Tag}}' | grep -v -x -e latest -e $(DEPLOY_VER) | \
|
||||
xargs -r -I{} docker image rm -f $(DEPLOY_IMAGE):{} >/dev/null
|
||||
@# L'indirizzo pubblico deve servire la versione appena spedita.
|
||||
@v=$$(grep -o "VERSION = '[^']*'" src/version.js); \
|
||||
@v=$$(git show $(DEPLOY_VER):src/version.js | grep -o "VERSION = '[^']*'"); \
|
||||
for i in 1 2 3 4 5; do curl -s $(DEPLOY_URL)/src/version.js | grep -qF "$$v" && break; sleep 2; done; \
|
||||
curl -s $(DEPLOY_URL)/src/version.js | grep -qF "$$v" || { echo "$(DEPLOY_URL) non serve $$v"; exit 1; }
|
||||
@echo "→ $(DEPLOY_URL) ($$(git log -1 --format='%h %s'))"
|
||||
@echo "→ $(DEPLOY_URL) ($(DEPLOY_IMAGE):$(DEPLOY_VER), $$(git log -1 --format='%h %s' $(DEPLOY_VER)))"
|
||||
|
||||
deploy-logs: ## Log del container sul server di deploy
|
||||
@test -n "$(DEPLOY_HOST)" || { echo "manca DEPLOY_HOST: scrivilo in deploy.local.mk"; exit 2; }
|
||||
|
||||
Reference in New Issue
Block a user