fix(ci): headless в CI, UI-бинарь собирается локально
CI (.gitea/workflows/ci.yaml): - go 1.23 -> 1.25 (modernc.org/sqlite v1.56.0 требует go 1.25; старый CI падал на сборке ещё до тестов). - CGO_ENABLED=0 на уровне workflow: CI собирает/тестирует только headless (ui_noui), не тянет Fyne/glfw и C-компилятор. - timeout 120s -> 300s (worker один ~30-60s на быстрой машине). - build-and-package: только linux/amd64 (headless). Windows-бинарь с UI — локально. Локальная сборка UI + публикация: - scripts/build-publish-ui.ps1: собирает ratatoskr-windows-amd64.exe (CGO_ENABLED=1, WinLibs gcc), вшивает commit-<sha7> + updateToken, пишет .version/.sha256 и публикует в Gitea Packages в ту же версию, что и CI; самопроверка (U4). - scripts/.gitea-creds.example + .gitignore (scripts/.gitea-creds) — секреты не попадают в репозиторий. README: CI=headless + публикация Windows-UI локальным скриптом; обновлён intro (бинарь по умолчанию headless, окно — опционально с cgo).
This commit is contained in:
57
README.md
57
README.md
@@ -3,7 +3,9 @@
|
||||
Ratatoskr на Go — **оркестратор в единый статический бинарь** + субагенты через
|
||||
[opencode](https://opencode.ai) как внешний процесс. Переезд с Python-версии:
|
||||
все подсистемы (диалог, воркер, автообновление) собраны в один исполняемый
|
||||
файл без runtime-зависимостей (`CGO_ENABLED=0`), что упрощает доставку и деплой.
|
||||
файл, что упрощает доставку и деплой. Бинарь по умолчанию headless
|
||||
(`CGO_ENABLED=0`); графическое окно (Fyne) — опционально, собирается с cgo
|
||||
(только локально, см. «Локальная сборка UI-бинаря»).
|
||||
|
||||
## Структура
|
||||
|
||||
@@ -58,10 +60,40 @@ GOFLAGS ?= -ldflags="-s -w -X main.version=commit-$(GIT_SHA) -X main.updateToken
|
||||
- `main.updateToken` = токен read:package для автообновления (см. ниже). Если не задан
|
||||
(`UPDATE_TOKEN ?= ""`) — пустая встройка, тогда обновление берёт `update.token` из конфига.
|
||||
|
||||
**Обычный `make build`/`make cross` окно НЕ включает** — Fyne-окно требует cgo и
|
||||
C-компилятора. Headless-бинарь (без окна) собирается и в CI, и локально; UI-бинарь
|
||||
с окном — только локально (см. ниже).
|
||||
|
||||
### Локальная сборка UI-бинаря (Windows, Fyne-окно) + публикация в Gitea
|
||||
|
||||
CI headless: `CGO_ENABLED=0` и публикует только `ratatoskr-linux-amd64`
|
||||
(см. `.gitea/workflows/ci.yaml`). Windows-бинарь с окном собирается на Windows-машине
|
||||
и публикуется скриптом:
|
||||
|
||||
```bash
|
||||
# 1) Секреты (git-ignored): скопировать и заполнить
|
||||
cp scripts/.gitea-creds.example scripts/.gitea-creds
|
||||
# GITEA_TOKEN=write:packages-токен
|
||||
# UPDATE_TOKEN=read:package-токен
|
||||
# GIT_MAIN_URL=http://gitea.hal9000.home
|
||||
|
||||
# 2) Убедиться, что gcc (MinGW) в PATH и CGO_ENABLED=1 — см. память
|
||||
# `mem:toolchain/cgo-winlibs-gcc`
|
||||
|
||||
# 3) Запустить (HEAD должен быть тем коммитом, что в main):
|
||||
powershell -ExecutionPolicy Bypass -File scripts/build-publish-ui.ps1
|
||||
```
|
||||
|
||||
Скрипт собирает `ratatoskr-windows-amd64.exe` с `-X main.version=commit-<sha7>` и
|
||||
`-X main.updateToken=...`, пишет companion-файлы `.version`/`.sha256` и публикует все
|
||||
три в `.../generic/ratatoskr/commit-<sha7>/`. В конце сам перечитывает `.sha256`/`.version`
|
||||
из Gitea и сверяет (контракт U4) — как проверка в разделе «Валидация опубликованной версии».
|
||||
|
||||
**Как на самом деле публикуется рабочий бинарь:** локальный `go build` токен НЕ вшивает
|
||||
(значение секрета есть только у CI). Запушь `main` — CI (см. ниже) сам соберёт оба бинаря
|
||||
со вшитым `TC_UPDATE_TOKEN` и загрузит их в Gitea Packages. Так соблюдён least-privilege:
|
||||
read-токен не светится на хосте разработки.
|
||||
(значение секрета есть только у CI и в git-ignored `scripts/.gitea-creds`). Запушь `main` —
|
||||
CI сам соберёт headless-linux со вшитым `TC_UPDATE_TOKEN` и загрузит его в Gitea Packages;
|
||||
Windows-бинарь с UI публикуется локальным скриптом (токен read:package в `scripts/.gitea-creds`).
|
||||
Так соблюдён least-privilege: read-токен не светится в репозитории/на хосте CI.
|
||||
|
||||
### Проверки перед сборкой
|
||||
|
||||
@@ -78,13 +110,17 @@ make run # build + ./ratatoskr -config config.yaml
|
||||
|
||||
## CI (.gitea/workflows/ci.yaml)
|
||||
|
||||
- **Job `test`**: checkout → setup-go → `go test ./...` → `go vet ./...`.
|
||||
- **Job `build-and-package`** (matrix linux/amd64 + windows/amd64, без артефактов):
|
||||
собирает бинарь со вшитым `-X main.updateToken=${secrets.TC_UPDATE_TOKEN}` и
|
||||
- **Job `test`**: checkout → setup-go 1.25 → `go test ./...` → `go vet ./...`.
|
||||
Работает в headless-режиме (`CGO_ENABLED=0`, без Fyne/glfw).
|
||||
- **Job `build-and-package`** (linux/amd64, без артефактов): собирает **headless**-бинарь
|
||||
`ratatoskr-linux-amd64` со вшитым `-X main.updateToken=${secrets.TC_UPDATE_TOKEN}` и
|
||||
**публикует в Gitea Packages** — только на `main`, сразу в версию `commit-<sha7>/`
|
||||
(псевдо-версия `latest` НЕ используется — см. автообновление). Плюс companion-файлы
|
||||
`<file>.version` и `<file>.sha256`.
|
||||
|
||||
**Windows-бинарь с UI в CI НЕ собирается** (нужен cgo + C-компилятор). Он собирается
|
||||
и публикуется локально скриптом `scripts/build-publish-ui.ps1` (см. «Локальная сборка UI-бинаря»).
|
||||
|
||||
Секреты/vars: `TC_GITEA_TOKEN` (write:packages), `TC_UPDATE_TOKEN` (read:package),
|
||||
`GIT_MAIN_URL`.
|
||||
|
||||
@@ -199,9 +235,12 @@ update:
|
||||
### Как опубликовать новую версию
|
||||
|
||||
1. Внеси правки, коммитни, запуши в `main`.
|
||||
2. CI соберёт оба бинаря со вшитым `TC_UPDATE_TOKEN` и опубликует в
|
||||
2. CI соберёт `ratatoskr-linux-amd64` (headless) со вшитым `TC_UPDATE_TOKEN` и опубликует в
|
||||
`.../generic/ratatoskr/commit-<sha7>/` (бинарь + `.version` + `.sha256`).
|
||||
3. На обновляемой машине: бот сам уведомит о новой версии → `/update`.
|
||||
3. Если в этой версии есть изменения UI — дополнительно собрать и опубликовать
|
||||
Windows-бинарь с окном: `scripts/build-publish-ui.ps1` (добавит
|
||||
`ratatoskr-windows-amd64.exe` в ту же версию).
|
||||
4. На обновляемой машине: бот сам уведомит о новой версии → `/update`.
|
||||
|
||||
Проверку автообновления после публикации гоняет владелец на своей
|
||||
Windows-машине (не прогоняется агентом).
|
||||
|
||||
Reference in New Issue
Block a user