feat(deploy): tag di versione nei msg Telegram, +1 ad ogni deploy
File VERSION (semver, cotto nell'immagine) letto da src/version.py. Compare nelle notifiche trade (telegram_notifier) e nel report orario -> sai quale codice ha generato quale msg. scripts/bump_version.py incrementa la patch; scripts/deploy.sh = bump+commit+rebuild (versione aumenta ad OGNI deploy). v1.0.0 = primo release versionato (include hurst loss-guard). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -9,7 +9,7 @@ RUN uv sync --frozen --no-dev
|
|||||||
|
|
||||||
COPY src/ src/
|
COPY src/ src/
|
||||||
COPY scripts/ scripts/
|
COPY scripts/ scripts/
|
||||||
COPY strategies.yml portfolios.yml ./
|
COPY strategies.yml portfolios.yml VERSION ./
|
||||||
|
|
||||||
VOLUME /app/data
|
VOLUME /app/data
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
"""Incrementa la versione (semver) nel file VERSION. Default: patch +1.
|
||||||
|
Uso: uv run python scripts/bump_version.py [major|minor|patch] (default patch)
|
||||||
|
Stampa la nuova versione. Usato da scripts/deploy.sh ad ogni deploy."""
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
VF = Path(__file__).resolve().parents[1] / "VERSION"
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
part = sys.argv[1] if len(sys.argv) > 1 else "patch"
|
||||||
|
cur = VF.read_text().strip() if VF.exists() else "0.0.0"
|
||||||
|
try:
|
||||||
|
major, minor, patch = (int(x) for x in cur.split("."))
|
||||||
|
except Exception:
|
||||||
|
major, minor, patch = 0, 0, 0
|
||||||
|
if part == "major":
|
||||||
|
major, minor, patch = major + 1, 0, 0
|
||||||
|
elif part == "minor":
|
||||||
|
minor, patch = minor + 1, 0
|
||||||
|
else:
|
||||||
|
patch += 1
|
||||||
|
new = f"{major}.{minor}.{patch}"
|
||||||
|
VF.write_text(new + "\n")
|
||||||
|
print(new)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Executable
+22
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Deploy del paper trader a portafoglio: bumpa la VERSIONE, committa, rebuilda l'immagine e
|
||||||
|
# ricrea il container. La versione (es. v1.0.1) compare nei messaggi Telegram -> sai quale
|
||||||
|
# codice ha generato quale msg, e aumenta ad OGNI deploy.
|
||||||
|
#
|
||||||
|
# Uso: ./scripts/deploy.sh [major|minor|patch] (default patch)
|
||||||
|
set -euo pipefail
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
|
PART="${1:-patch}"
|
||||||
|
NEW=$(uv run python scripts/bump_version.py "$PART")
|
||||||
|
echo ">> nuova versione: v$NEW"
|
||||||
|
|
||||||
|
git add VERSION
|
||||||
|
git commit -q -m "release: v$NEW" || true
|
||||||
|
|
||||||
|
echo ">> rebuild immagine + ricrea container"
|
||||||
|
docker compose up -d --build
|
||||||
|
|
||||||
|
sleep 8
|
||||||
|
docker compose ps --format "{{.Status}}"
|
||||||
|
echo ">> deploy v$NEW completato"
|
||||||
@@ -92,12 +92,16 @@ def build_report() -> str:
|
|||||||
r[2] += pnl
|
r[2] += pnl
|
||||||
|
|
||||||
now = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC")
|
now = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC")
|
||||||
|
try:
|
||||||
|
ver = (ROOT / "VERSION").read_text().strip()
|
||||||
|
except Exception:
|
||||||
|
ver = "?"
|
||||||
eq = dd = cap = None
|
eq = dd = cap = None
|
||||||
if PORT_STATUS.exists():
|
if PORT_STATUS.exists():
|
||||||
ps = json.loads(PORT_STATUS.read_text())
|
ps = json.loads(PORT_STATUS.read_text())
|
||||||
eq, cap, dd = ps.get("equity"), ps.get("total_capital"), ps.get("max_dd")
|
eq, cap, dd = ps.get("equity"), ps.get("total_capital"), ps.get("max_dd")
|
||||||
|
|
||||||
L = [f"📊 <b>PORT06 — Report orario</b>", now]
|
L = [f"📊 <b>PORT06 — Report orario</b> <code>v{ver}</code>", now]
|
||||||
if eq is not None:
|
if eq is not None:
|
||||||
L.append(f"Equity €{eq:.2f} | Cap €{cap:.2f} | maxDD {dd:.3f}%")
|
L.append(f"Equity €{eq:.2f} | Cap €{cap:.2f} | maxDD {dd:.3f}%")
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import urllib.request
|
|||||||
import urllib.parse
|
import urllib.parse
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from src.version import APP_VERSION
|
||||||
|
|
||||||
BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "")
|
BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "")
|
||||||
CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "")
|
CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "")
|
||||||
|
|
||||||
@@ -30,7 +32,7 @@ def send_telegram(text: str) -> bool:
|
|||||||
def notify_event(event: str, data: dict | None = None):
|
def notify_event(event: str, data: dict | None = None):
|
||||||
if event not in NOTIFY_EVENTS:
|
if event not in NOTIFY_EVENTS:
|
||||||
return
|
return
|
||||||
lines = [f"📊 <b>{event}</b>"]
|
lines = [f"📊 <b>{event}</b> <code>v{APP_VERSION}</code>"]
|
||||||
if data:
|
if data:
|
||||||
for k, v in data.items():
|
for k, v in data.items():
|
||||||
if k in ("signal",):
|
if k in ("signal",):
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
"""Versione dell'app, incrementata ad ogni deploy. Compare nei messaggi Telegram per correlare
|
||||||
|
i msg al codice in esecuzione. Sorgente: file VERSION nella root (cotto nell'immagine al build).
|
||||||
|
Bump: scripts/bump_version.py (o scripts/deploy.sh, che bumpa+committa+rebuilda)."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
_VERSION_FILE = Path(__file__).resolve().parents[1] / "VERSION"
|
||||||
|
|
||||||
|
|
||||||
|
def get_version() -> str:
|
||||||
|
try:
|
||||||
|
return _VERSION_FILE.read_text().strip()
|
||||||
|
except Exception:
|
||||||
|
return "0.0.0"
|
||||||
|
|
||||||
|
|
||||||
|
APP_VERSION = get_version()
|
||||||
Reference in New Issue
Block a user