fix(release): adapt pipeline for Forgejo + simplify CI to Python 3.13 #10

Closed
opened 2026-08-11 14:50:56 +03:00 by slaid098 · 0 comments
Owner

Контекст

GitHub аккаунт удалён. Хост — Forgejo (git.slaid098.dev). Локальный Windows-раннер зарегистрирован с label windows-amd64 (см. slaid098/forgejo-infra/windows-runner/workflow-template.yml). Ни одной сборки не было — теги v1.0.0v1.3.2 существуют, но релизов к ним нет.

Текущий release.yml написан под GitHub Actions и не работает на Forgejo: 7 блокеров. Дополнительно: CI матрица ["3.12", "3.13"] усложняет сборку без нужды — оставляем только 3.13.

Задача

Адаптировать release pipeline для Forgejo + локального Windows-раннера, упростить CI до одной версии Python, обнулить CHANGELOG до v0.1.0.

1. .github/workflows/release.yml — полная переработка

По шаблону forgejo-infra/windows-runner/workflow-template.yml:

  • Убрать permissions: contents: write (стр. 7-8) — Forgejo игнорирует, права в Settings репо
  • Убрать job test (стр. 11-21) — дублирует ci.yml, замедляет релиз
  • Job build:
    • runs-on: windows-latestruns-on: windows-amd64
    • uses: astral-sh/setup-uv@v3uses: actions/setup-python@v5 с python-version: '3.12', затем pip install uv
    • shell: powershell на КАЖДОМ step (defaults.run.shell не работает в v13)
    • Оставить шаги скачивания Vosk STT + Vosk TTS моделей (Piper удалён в PR #9)
    • Добавить шаг копирования openWakeWord модели (КРИТИЧЕСКИЙ ФИКС):
      - name: Copy openWakeWord model
        shell: powershell
        run: |
          New-Item -ItemType Directory -Force -Path dist/models/openwakeword
          Copy-Item models/openwakeword/wiki.onnx dist/models/openwakeword/
      
    • PyInstaller команда: добавить --collect-all openwakeword и --collect-all onnxruntime (превентивно)
    • Убрать --collect-all piper (Piper удалён в PR #9)
    • Добавить CHANGELOG.md в zip
    • Заменить softprops/action-gh-release@v2 на curl к Forgejo API:
      - name: Create Forgejo release
        shell: powershell
        run: |
          $headers = @{ "Authorization" = "token $env:GITHUB_TOKEN"; "Content-Type" = "application/json" }
          $body = @{ tag_name = "$env:GITHUB_REF_NAME"; name = "$env:GITHUB_REF_NAME"; body = Get-Content CHANGELOG.md -Raw } | ConvertTo-Json
          $resp = Invoke-RestMethod -Uri "$env:GITHUB_SERVER_URL/api/v1/repos/slaid098/voice_assistant/releases" -Method Post -Headers $headers -Body $body
          $uploadUrl = $resp.upload_url -replace "\{.*\}", ""
          Invoke-RestMethod -Uri "$uploadUrl?name=voice-assistant.zip" -Method Post -Headers @{ "Authorization" = "token $env:GITHUB_TOKEN" } -InFile dist/voice-assistant.zip
      

2. .github/workflows/ci.yml — упростить матрицу

  • Убрать strategy.matrix.python: ["3.12", "3.13"] (стр. 31-33) — одна версия 3.13
  • Job test (стр. 29-40): убрать --python ${{ matrix.python }} из uv sync
  • Остальные jobs (lint, typecheck, complexity) — без изменений (уже без матрицы)

3. pyproject.toml

  • Стр. 11: requires-python = ">=3.12"requires-python = ">=3.13"
  • Стр. 20-22: classifiers — оставить только "Programming Language :: Python :: 3.13"
  • Стр. 61-63: URLs github.com/slaid098/voice_assistantgit.slaid098.dev/slaid098/voice_assistant

4. CHANGELOG.md — обнулить историю

Полностью заменить содержимое — начать с чистого v0.1.0:

# Changelog

Все заметные изменения проекта голосового помощника.

Формат: [Keep a Changelog 1.1.0](https://keepachangelog.com/ru/1.1.0/), [Semantic Versioning 2.0.0](https://semver.org/lang/ru/).

## [0.1.0] — 2026-08-11

### Added
- Голосовой помощник для слабовидящих пользователей. Русский язык.
- Wake word: openWakeWord (нейронный, ONNX, слово «вики»)
- STT: Google (cloud) + Vosk (offline) — Protocol, dispatch по STT_PROVIDER
- TTS: Google (cloud) + Vosk TTS (offline, 5 спикеров) — Protocol, dispatch по TTS_PROVIDER
- Команды: погода, YouTube, браузер (Vivaldi app-mode), системные команды
- VAD (RMS threshold), streaming STT
- Звуковые ярлыки (4 earcons) + предгенерированные фразы (Google TTS)
- Текстовая нормализация для TTS (транслитерация EN→RU, clean_title)
- Автозапуск на Windows (Startup folder .lnk)
- PyInstaller сборка через Forgejo Actions (Windows-раннер)

### Changed
- N/A

### Removed
- N/A

[0.1.0]: https://git.slaid098.dev/slaid098/voice_assistant/releases/tag/v0.1.0

5. Теги git (после merge, не в PR)

  • Удалить 9 тегов: v1.0.0, v1.1.0, v1.1.1, v1.2.2, v1.2.3, v1.2.4, v1.3.0, v1.3.1, v1.3.2 (local + remote)
  • Создать тег v0.1.0 на master → git push origin v0.1.0 → trigger release.yml

Контракты

Runner label

  • windows-amd64 — label из forgejo-infra/windows-runner/workflow-template.yml
  • НЕ windows-latest, НЕ self-hosted, НЕ windows

Shell

  • shell: powershell на КАЖДОМ step (не pwsh — шаблон использует powershell)
  • defaults.run.shell не работает в Forgejo runner v13

Python

  • actions/setup-python@v5 с python-version: '3.12' (шаблон использует 3.12; uv поставит 3.13 для проекта через requires-python)

Forgejo release API

  • POST /api/v1/repos/slaid098/voice_assistant/releases — создание релиза
  • POST /api/v1/repos/slaid098/voice_assistant/releases/{id}/assets?name=voice-assistant.zip — загрузка артефакта
  • Token: $GITHUB_TOKEN (auto-provided в Forgejo runner-контексте, алиас для FORGEJO_TOKEN)

PyInstaller флаги

  • --noconfirm --onefile
  • --name voice-assistant
  • --collect-data voice_assistant (earcons + phrases)
  • --collect-all vosk / --collect-all vosk_tts
  • --collect-all openwakeword (КРИТИЧНО — без этого wake-word не работает)
  • --collect-all onnxruntime (превентивно — shared libraries для piper/vosk/openwakeword)
  • src/voice_assistant/__main__.py (entry point)
  • --windowed НЕ добавлять (консоль оставлена для отладки первой сборки)

Структура релизного zip

voice-assistant.zip
├── voice-assistant.exe
├── models/
│   ├── vosk_stt/        (~45 MB)
│   ├── vosk_tts/        (~135 MB)
│   └── openwakeword/    (~204 KB)
├── .env
├── README.md
├── CHANGELOG.md
├── install_autorun.bat
└── remove_autorun.bat

Инварианты

  • Не трогать ci.yml jobs lint/typecheck/complexity (только убрать матрицу в test)
  • Не добавлять --windowed в PyInstaller (консоль оставлена)
  • Не удалять шаги скачивания Vosk STT + Vosk TTS моделей
  • Не менять entry point (src/voice_assistant/__main__.py)
  • Не менять install_autorun.bat / remove_autorun.bat

Граничные случаи

  • --collect-all openwakeword может не найти data-файлы — fallback: --add-data "path/to/openwakeword/data;openwakeword/data"
  • --collect-all onnxruntime добавляет ~50 MB к бинарнику — безопаснее, чем падение в рантайме
  • Forgejo $GITHUB_TOKEN — проверить, что имеет права write:repo (если нет — релиз не создастся, zip останется в artifacts)
  • Invoke-RestMethod для Forgejo API — PowerShell-native, не требует curl

Влияние на связанные компоненты

  • release.yml — полная переработка (8 блокеров исправлены)
  • ci.yml — упрощение матрицы (2 версии → 1)
  • pyproject.toml — requires-python, classifiers, URLs
  • CHANGELOG.md — обнуление истории (старые записи удалены)

Вне scope

  • Удаление тегов v1.0.0v1.3.2 (git ops после merge)
  • Создание тега v0.1.0 (git ops после merge)
  • Добавление --windowed (оставлено на будущее)
  • UI/трей (отложено пользователем)

Критерии приемки

  • release.yml: runs-on: windows-amd64
  • release.yml: setup-python@v5 + pip install uv (не setup-uv@v3)
  • release.yml: shell: powershell на каждом step
  • release.yml: шаг копирования wiki.onnx в dist/models/openwakeword/
  • release.yml: --collect-all openwakeword и --collect-all onnxruntime
  • release.yml: Forgejo release через curl/Invoke-RestMethod (не softprops)
  • release.yml: permissions: удалён, job test удалён
  • ci.yml: матрица убрана, только Python 3.13
  • pyproject.toml: requires-python = ">=3.13", classifier только 3.13
  • pyproject.toml: URLs → git.slaid098.dev
  • CHANGELOG.md: обнулён, начинается с ## [0.1.0]
  • uv run ruff check src/ tests/ — зелёный
  • uv run mypy src/ — зелёный
  • uv run pytest — зелёный
## Контекст GitHub аккаунт удалён. Хост — Forgejo (`git.slaid098.dev`). Локальный Windows-раннер зарегистрирован с label `windows-amd64` (см. `slaid098/forgejo-infra/windows-runner/workflow-template.yml`). Ни одной сборки не было — теги `v1.0.0`–`v1.3.2` существуют, но релизов к ним нет. Текущий `release.yml` написан под GitHub Actions и не работает на Forgejo: 7 блокеров. Дополнительно: CI матрица `["3.12", "3.13"]` усложняет сборку без нужды — оставляем только `3.13`. ## Задача Адаптировать release pipeline для Forgejo + локального Windows-раннера, упростить CI до одной версии Python, обнулить CHANGELOG до v0.1.0. ### 1. `.github/workflows/release.yml` — полная переработка По шаблону `forgejo-infra/windows-runner/workflow-template.yml`: - Убрать `permissions: contents: write` (стр. 7-8) — Forgejo игнорирует, права в Settings репо - Убрать job `test` (стр. 11-21) — дублирует ci.yml, замедляет релиз - Job `build`: - `runs-on: windows-latest` → `runs-on: windows-amd64` - `uses: astral-sh/setup-uv@v3` → `uses: actions/setup-python@v5` с `python-version: '3.12'`, затем `pip install uv` - `shell: powershell` на КАЖДОМ step (defaults.run.shell не работает в v13) - Оставить шаги скачивания Vosk STT + Vosk TTS моделей (Piper удалён в PR #9) - **Добавить шаг копирования openWakeWord модели** (КРИТИЧЕСКИЙ ФИКС): ```yaml - name: Copy openWakeWord model shell: powershell run: | New-Item -ItemType Directory -Force -Path dist/models/openwakeword Copy-Item models/openwakeword/wiki.onnx dist/models/openwakeword/ ``` - PyInstaller команда: добавить `--collect-all openwakeword` и `--collect-all onnxruntime` (превентивно) - Убрать `--collect-all piper` (Piper удалён в PR #9) - Добавить `CHANGELOG.md` в zip - Заменить `softprops/action-gh-release@v2` на curl к Forgejo API: ```yaml - name: Create Forgejo release shell: powershell run: | $headers = @{ "Authorization" = "token $env:GITHUB_TOKEN"; "Content-Type" = "application/json" } $body = @{ tag_name = "$env:GITHUB_REF_NAME"; name = "$env:GITHUB_REF_NAME"; body = Get-Content CHANGELOG.md -Raw } | ConvertTo-Json $resp = Invoke-RestMethod -Uri "$env:GITHUB_SERVER_URL/api/v1/repos/slaid098/voice_assistant/releases" -Method Post -Headers $headers -Body $body $uploadUrl = $resp.upload_url -replace "\{.*\}", "" Invoke-RestMethod -Uri "$uploadUrl?name=voice-assistant.zip" -Method Post -Headers @{ "Authorization" = "token $env:GITHUB_TOKEN" } -InFile dist/voice-assistant.zip ``` ### 2. `.github/workflows/ci.yml` — упростить матрицу - Убрать `strategy.matrix.python: ["3.12", "3.13"]` (стр. 31-33) — одна версия `3.13` - Job `test` (стр. 29-40): убрать `--python ${{ matrix.python }}` из `uv sync` - Остальные jobs (lint, typecheck, complexity) — без изменений (уже без матрицы) ### 3. `pyproject.toml` - Стр. 11: `requires-python = ">=3.12"` → `requires-python = ">=3.13"` - Стр. 20-22: classifiers — оставить только `"Programming Language :: Python :: 3.13"` - Стр. 61-63: URLs `github.com/slaid098/voice_assistant` → `git.slaid098.dev/slaid098/voice_assistant` ### 4. `CHANGELOG.md` — обнулить историю Полностью заменить содержимое — начать с чистого v0.1.0: ```markdown # Changelog Все заметные изменения проекта голосового помощника. Формат: [Keep a Changelog 1.1.0](https://keepachangelog.com/ru/1.1.0/), [Semantic Versioning 2.0.0](https://semver.org/lang/ru/). ## [0.1.0] — 2026-08-11 ### Added - Голосовой помощник для слабовидящих пользователей. Русский язык. - Wake word: openWakeWord (нейронный, ONNX, слово «вики») - STT: Google (cloud) + Vosk (offline) — Protocol, dispatch по STT_PROVIDER - TTS: Google (cloud) + Vosk TTS (offline, 5 спикеров) — Protocol, dispatch по TTS_PROVIDER - Команды: погода, YouTube, браузер (Vivaldi app-mode), системные команды - VAD (RMS threshold), streaming STT - Звуковые ярлыки (4 earcons) + предгенерированные фразы (Google TTS) - Текстовая нормализация для TTS (транслитерация EN→RU, clean_title) - Автозапуск на Windows (Startup folder .lnk) - PyInstaller сборка через Forgejo Actions (Windows-раннер) ### Changed - N/A ### Removed - N/A [0.1.0]: https://git.slaid098.dev/slaid098/voice_assistant/releases/tag/v0.1.0 ``` ### 5. Теги git (после merge, не в PR) - Удалить 9 тегов: `v1.0.0`, `v1.1.0`, `v1.1.1`, `v1.2.2`, `v1.2.3`, `v1.2.4`, `v1.3.0`, `v1.3.1`, `v1.3.2` (local + remote) - Создать тег `v0.1.0` на master → `git push origin v0.1.0` → trigger release.yml ## Контракты ### Runner label - `windows-amd64` — label из `forgejo-infra/windows-runner/workflow-template.yml` - НЕ `windows-latest`, НЕ `self-hosted`, НЕ `windows` ### Shell - `shell: powershell` на КАЖДОМ step (не pwsh — шаблон использует powershell) - `defaults.run.shell` не работает в Forgejo runner v13 ### Python - `actions/setup-python@v5` с `python-version: '3.12'` (шаблон использует 3.12; uv поставит 3.13 для проекта через `requires-python`) ### Forgejo release API - `POST /api/v1/repos/slaid098/voice_assistant/releases` — создание релиза - `POST /api/v1/repos/slaid098/voice_assistant/releases/{id}/assets?name=voice-assistant.zip` — загрузка артефакта - Token: `$GITHUB_TOKEN` (auto-provided в Forgejo runner-контексте, алиас для FORGEJO_TOKEN) ### PyInstaller флаги - `--noconfirm --onefile` - `--name voice-assistant` - `--collect-data voice_assistant` (earcons + phrases) - `--collect-all vosk` / `--collect-all vosk_tts` - `--collect-all openwakeword` (КРИТИЧНО — без этого wake-word не работает) - `--collect-all onnxruntime` (превентивно — shared libraries для piper/vosk/openwakeword) - `src/voice_assistant/__main__.py` (entry point) - `--windowed` НЕ добавлять (консоль оставлена для отладки первой сборки) ### Структура релизного zip ``` voice-assistant.zip ├── voice-assistant.exe ├── models/ │ ├── vosk_stt/ (~45 MB) │ ├── vosk_tts/ (~135 MB) │ └── openwakeword/ (~204 KB) ├── .env ├── README.md ├── CHANGELOG.md ├── install_autorun.bat └── remove_autorun.bat ``` ## Инварианты - Не трогать `ci.yml` jobs lint/typecheck/complexity (только убрать матрицу в test) - Не добавлять `--windowed` в PyInstaller (консоль оставлена) - Не удалять шаги скачивания Vosk STT + Vosk TTS моделей - Не менять entry point (`src/voice_assistant/__main__.py`) - Не менять `install_autorun.bat` / `remove_autorun.bat` ## Граничные случаи - `--collect-all openwakeword` может не найти data-файлы — fallback: `--add-data "path/to/openwakeword/data;openwakeword/data"` - `--collect-all onnxruntime` добавляет ~50 MB к бинарнику — безопаснее, чем падение в рантайме - Forgejo `$GITHUB_TOKEN` — проверить, что имеет права `write:repo` (если нет — релиз не создастся, zip останется в artifacts) - `Invoke-RestMethod` для Forgejo API — PowerShell-native, не требует curl ## Влияние на связанные компоненты - `release.yml` — полная переработка (8 блокеров исправлены) - `ci.yml` — упрощение матрицы (2 версии → 1) - `pyproject.toml` — requires-python, classifiers, URLs - `CHANGELOG.md` — обнуление истории (старые записи удалены) ## Вне scope - Удаление тегов `v1.0.0`–`v1.3.2` (git ops после merge) - Создание тега `v0.1.0` (git ops после merge) - Добавление `--windowed` (оставлено на будущее) - UI/трей (отложено пользователем) ## Критерии приемки - [ ] `release.yml`: `runs-on: windows-amd64` - [ ] `release.yml`: `setup-python@v5` + `pip install uv` (не `setup-uv@v3`) - [ ] `release.yml`: `shell: powershell` на каждом step - [ ] `release.yml`: шаг копирования `wiki.onnx` в `dist/models/openwakeword/` - [ ] `release.yml`: `--collect-all openwakeword` и `--collect-all onnxruntime` - [ ] `release.yml`: Forgejo release через curl/Invoke-RestMethod (не softprops) - [ ] `release.yml`: `permissions:` удалён, job `test` удалён - [ ] `ci.yml`: матрица убрана, только Python 3.13 - [ ] `pyproject.toml`: `requires-python = ">=3.13"`, classifier только 3.13 - [ ] `pyproject.toml`: URLs → `git.slaid098.dev` - [ ] `CHANGELOG.md`: обнулён, начинается с `## [0.1.0]` - [ ] `uv run ruff check src/ tests/` — зелёный - [ ] `uv run mypy src/` — зелёный - [ ] `uv run pytest` — зелёный
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/voice_assistant#10
No description provided.