From 02b3131f1994fb1e146a6054cbf5474d5df41668 Mon Sep 17 00:00:00 2001 From: Ivan Fontosh Date: Mon, 18 May 2026 08:52:39 +0800 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/TTRPG-Release-Instructions.docx | Bin 35629 -> 37435 bytes scripts/generate-release-docx.py | 188 +++++++++++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 scripts/generate-release-docx.py diff --git a/docs/TTRPG-Release-Instructions.docx b/docs/TTRPG-Release-Instructions.docx index e69caaed272e4c4ca7607106352cdf63fec30fb3..4a9fb02919a32882b4955cecb6a0820bd35723dd 100644 GIT binary patch delta 3170 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 pS~FR{S!(ivi98^YbwCl>+R0}of=zk{ 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()