Загрузка данных
#!/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 ===")