194 lines
7.8 KiB
Python
194 lines
7.8 KiB
Python
# -*- 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)",
|
||
"FFMPEG_BINARIES_URL=https://cdn.npmmirror.com/binaries/ffmpeg-static 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).",
|
||
),
|
||
(
|
||
"npm ci / ffmpeg-static / GitHub 5xx",
|
||
"Win-скрипт повторит npm ci через FFMPEG_BINARIES_URL; на Mac используйте эту переменную вручную.",
|
||
),
|
||
(
|
||
"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()
|