#!/usr/bin/env python3
import os
import re
import tomllib
from pathlib import Path
from datetime import datetime
from jinja2 import Template
# ====================== PATH CONFIG ======================
APP_PATH = os.environ.get("APP_PATH")
if APP_PATH:
ROOT = Path(APP_PATH).resolve()
else:
ROOT = Path(__file__).resolve().parent
PYPROJECT = ROOT / "django-ma/src/pyproject.toml"
CHANGELOG = ROOT / "django-ma/src/changelog.md"
TEMPLATES_DIR = ROOT / "templates"
print("=== Обновление версии ===")
print(f"Рабочая папка ROOT: {ROOT}")
print(f"pyproject.toml: {PYPROJECT}")
print(f"Папка templates: {TEMPLATES_DIR}")
def render_file(src: Path, dst: Path, context: dict):
if not src.exists():
raise FileNotFoundError(f"Шаблон не найден: {src}")
template = Template(src.read_text(encoding="utf-8"))
rendered = template.render(**context)
dst.parent.mkdir(parents=True, exist_ok=True)
dst.write_text(rendered, encoding="utf-8")
print(f"[ОК] {src.name} → {dst.name}")
# ============================================================
# Обновление версии
# ============================================================
data = tomllib.loads(PYPROJECT.read_text(encoding="utf-8"))
current_version = data["project"]["version"]
version = current_version.replace("-dev", "")
major, minor, patch = map(int, version.split("."))
patch += 1
new_version = f"{major}.{minor}.{patch}-dev"
text = PYPROJECT.read_text(encoding="utf-8")
text = re.sub(
r'version\s*=\s*"[^"]+"',
f'version = "{new_version}"',
text,
count=1
)
PYPROJECT.write_text(text, encoding="utf-8")
print(f"[ОК] Версия обновлена: {current_version} → {new_version}")
build_id = os.getenv("BUILD_BUILDID") or os.getenv("BUILD_ID") or "local"
print(f"##vso[task.setvariable variable=APP_VERSION]{new_version}")
print(f"##vso[build.updatebuildnumber]{new_version} (build #{build_id})")
# ============================================================
# Changelog
# ============================================================
print("=== Обновление Changelog ===")
commit_message = os.getenv("BUILD_SOURCEVERSIONMESSAGE", "Local build")
entry = f"""## {new_version} (build #{build_id})
Date: {datetime.now():%Y-%m-%d %H:%M:%S}
{commit_message}
---
"""
old_content = CHANGELOG.read_text(encoding="utf-8") if CHANGELOG.exists() else ""
CHANGELOG.write_text(entry + old_content, encoding="utf-8")
print("[ОК] changelog.md обновлён")
# ============================================================
# Рендеринг шаблонов
# ============================================================
print("=== Рендеринг шаблонов ===")
branch = os.getenv("BUILD_SOURCEBRANCHNAME") or os.getenv("BRANCH") or "dev"
context = {
"version": new_version,
"branch": branch,
}
render_file(
TEMPLATES_DIR / "django-ma-dockerfile.j2",
ROOT / "django-ma/Dockerfile",
context
)
render_file(
TEMPLATES_DIR / "docker-compose.yml.j2",
ROOT / "docker-compose.yml",
context
)
print("=== Готово ===")