diff --git a/docs/TTRPG-Release-Instructions.docx b/docs/TTRPG-Release-Instructions.docx index e69caae..4a9fb02 100644 Binary files a/docs/TTRPG-Release-Instructions.docx and b/docs/TTRPG-Release-Instructions.docx differ diff --git a/scripts/generate-release-docx.py b/scripts/generate-release-docx.py new file mode 100644 index 0000000..0e5686a --- /dev/null +++ b/scripts/generate-release-docx.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +"""Generate TTRPG-Release-Instructions.docx (run: python scripts/generate-release-docx.py).""" +from __future__ import annotations + +from pathlib import Path + +from docx import Document +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.shared import Pt + +ROOT = Path(__file__).resolve().parents[1] +OUT_PATHS = [ + ROOT / "docs" / "TTRPG-Release-Instructions.docx", + Path(r"D:\TTRPG-Release\TTRPG-Release-Instructions.docx"), +] + + +def add_bullet(doc: Document, text: str, level: int = 0) -> None: + style = "List Bullet" if level == 0 else "List Bullet 2" + doc.add_paragraph(text, style=style) + + +def add_step(doc: Document, title: str, body: str) -> None: + p = doc.add_paragraph() + p.add_run(f"{title}. ").bold = True + p.add_run(body) + + +def build_document() -> Document: + doc = Document() + normal = doc.styles["Normal"] + normal.font.name = "Calibri" + normal.font.size = Pt(11) + + title = doc.add_heading("TTRPG Player — сборка и публикация обновлений", level=0) + title.alignment = WD_ALIGN_PARAGRAPH.CENTER + + doc.add_paragraph( + "Одна версия на все платформы. Сначала вручную поднимается версия и собирается macOS; " + "затем на Windows скрипт собирает Win/Linux без повторного bump и выкладывает на " + "https://updates.mailib.ru/" + ) + + doc.add_heading("Рекомендуемый порядок", level=1) + + add_step( + doc, + "Шаг 1. Поднять версию", + "В каталоге проекта dnd_player: bump-version.cmd (D:\\TTRPG-Release) " + "или npm version patch --no-git-tag-version. " + "Закоммитить package.json при необходимости до сборки на Mac.", + ) + add_step( + doc, + "Шаг 2. Собрать macOS (только на Mac)", + "npm ci && npm run build && npm run pack:mac", + ) + add_step( + doc, + "Шаг 3. Скопировать Mac-артефакты в D:\\TTRPG-Release", + "latest-mac.yml (только свежий с Mac), TTRPGPlayer-x64.zip, TTRPGPlayer-arm64.zip; " + "опционально TTRPGPlayer-x64.dmg, TTRPGPlayer-arm64.dmg. " + "Версия в latest-mac.yml должна совпадать с package.json.", + ) + add_step( + doc, + "Шаг 4. Сборка Win/Linux и публикация (Windows)", + "release-all.cmd — по умолчанию режим -AfterMac: без bump, проверка Mac-файлов, " + "сборка Windows и Linux (WSL), копирование в D:\\TTRPG-Release, upload на сервер.", + ) + + doc.add_heading("Скрипты (D:\\TTRPG-Release)", level=1) + table = doc.add_table(rows=7, cols=2) + table.style = "Table Grid" + table.rows[0].cells[0].text = "Команда" + table.rows[0].cells[1].text = "Назначение" + rows = [ + ("bump-version.cmd", "Только patch в package.json (шаг 1)"), + ("release-all.cmd", "Шаг 4: Win/Linux + publish, без bump (-AfterMac)"), + ("prepare-release.cmd -AfterMac", "Только сборка Win/Linux и копирование"), + ("publish.cmd", "Только проверка и upload на VPS"), + ("publish.cmd -SkipMac", "Выложить Win/Linux, если Mac ещё не готов"), + ("release-all-bump.cmd", "Устаревший режим: bump в скрипте, Mac потом"), + ] + for i, (cmd, desc) in enumerate(rows, start=1): + table.rows[i].cells[0].text = cmd + table.rows[i].cells[1].text = desc + + doc.add_heading("Флаги prepare-release", level=2) + for line in [ + "-AfterMac — не менять версию; требовать Mac-файлы в папке релиза (по умолчанию в release-all)", + "-Bump — поднять patch и собрать (старый порядок)", + "-SkipGit, -SkipLinux, -NoBump, -Version X.Y.Z, -Minor", + ]: + add_bullet(doc, line) + + doc.add_heading("Флаги publish", level=2) + add_bullet(doc, "-CheckOnly — проверить файлы, без upload") + add_bullet(doc, "-SkipMac — не проверять и не заливать macOS") + + doc.add_heading("Артефакты (имена без версии)", level=1) + art = doc.add_table(rows=4, cols=2) + art.style = "Table Grid" + art.rows[0].cells[0].text = "Платформа" + art.rows[0].cells[1].text = "Файлы" + artifacts = [ + ( + "Windows", + "latest.yml, TTRPGPlayer-Setup.exe, TTRPGPlayer-Setup.exe.blockmap", + ), + ( + "Linux", + "latest-linux.yml, latest-linux-arm64.yml, " + "TTRPGPlayer-x64.AppImage, TTRPGPlayer-arm64.AppImage", + ), + ( + "macOS", + "latest-mac.yml, TTRPGPlayer-x64.zip, TTRPGPlayer-arm64.zip " + "(zip — автообновление; dmg — опционально, вручную)", + ), + ] + for i, (plat, files) in enumerate(artifacts, start=1): + art.rows[i].cells[0].text = plat + art.rows[i].cells[1].text = files + + doc.add_heading("Требования", level=1) + for line in [ + "Windows: Node.js 20.19+ (или 22.12+), git, OpenSSH, WSL2 с nvm (Node 22, .nvmrc в проекте)", + "Проект: D:\\Work\\my_projects\\dnd_project\\dnd_player", + "Папка релиза: D:\\TTRPG-Release", + "SSH: %USERPROFILE%\\.ssh\\ttrpg_updates_root → root@185.173.94.234", + "Mac: Node 20+, сборка только на macOS", + ]: + add_bullet(doc, line) + + doc.add_heading("Проверка после выкладки", level=1) + for url in [ + "https://updates.mailib.ru/latest.yml", + "https://updates.mailib.ru/latest-linux.yml", + "https://updates.mailib.ru/latest-mac.yml", + ]: + add_bullet(doc, url) + + doc.add_heading("Частые проблемы", level=1) + problems = [ + ( + "Win/Linux на версию выше Mac", + "Не использовать release-all-bump.cmd. Сначала bump + Mac, потом release-all.cmd.", + ), + ( + "macOS: missing TTRPGPlayer-1.0.xx-mac.zip", + "Устаревший latest-mac.yml — пересобрать на Mac или publish.cmd -SkipMac.", + ), + ( + "git push Failed to authenticate", + "Скрипт повторит push с токеном Gitea; или настроить credentials для git.mailib.ru.", + ), + ( + "WSL Linux build / Node 18", + "Нужен nvm и Node 22 (scripts/wsl-pack-linux.sh).", + ), + ( + "AfterMac: version mismatch", + "Версии в package.json и latest-mac.yml должны совпадать до запуска release-all.", + ), + ] + for prob, fix in problems: + p = doc.add_paragraph() + p.add_run(f"{prob}. ").bold = True + p.add_run(fix) + + p = doc.add_paragraph() + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + p.add_run("Конфиг: release-config.json, publish-config.json в D:\\TTRPG-Release").italic = True + + return doc + + +def main() -> None: + doc = build_document() + for path in OUT_PATHS: + path.parent.mkdir(parents=True, exist_ok=True) + doc.save(str(path)) + print(f"Wrote {path}") + + +if __name__ == "__main__": + main()