Загрузка данных


#!/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: {PYPROJECT}")
print(f"templates: {TEMPLATES_DIR}")

# ============================================================
# Helpers
# ============================================================

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"[OK] {src.name} → {dst.name}")

# ============================================================
# BRANCH
# ============================================================

branch = (
    os.getenv("BUILD_SOURCEBRANCHNAME")
    or os.getenv("BRANCH")
    or "dev"
).lower()

branch = branch.replace("refs/heads/", "")

print(f"Ветка: {branch}")

# ============================================================
# VERSION
# ============================================================

data = tomllib.loads(PYPROJECT.read_text(encoding="utf-8"))
current_version = data["project"]["version"]

# убираем возможные суффиксы
base_version = re.sub(
    r"(a\d*|b\d*|rc\d*)$",
    "",
    current_version
)

major, minor, patch = map(int, base_version.split("."))
patch += 1

suffix_map = {
    "dev": "a1",
    "test": "b1",
    "stage": "rc1",
    "prod": "",
}

suffix = suffix_map.get(branch, "a1")

if suffix:
    new_version = f"{major}.{minor}.{patch}{suffix}"
else:
    new_version = f"{major}.{minor}.{patch}"

# обновляем pyproject.toml
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"[OK] {current_version} → {new_version}")

# ============================================================
# AZURE OUTPUT
# ============================================================

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
# ============================================================

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 = CHANGELOG.read_text(encoding="utf-8") if CHANGELOG.exists() else ""
CHANGELOG.write_text(entry + old, encoding="utf-8")

print("[OK] changelog updated")

# ============================================================
# TEMPLATES
# ============================================================

print("=== Rendering templates ===")

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("=== DONE ===")