Files

67 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WALKTHROUGH — dedinit.ru (капитанский журнал)
## 2026-09-20 — Настройка CI/CD: Gitea Actions авто-деплой (тупик с триггером runs)
### Контекст
Задача: при пуше в main (Gitea = источник) автоматически собирать сайт (hugo) и заливать public/ на Jino по SFTP. Пользователь подтвердил архитектуру: **Gitea — источник истины, Actions деплоят, gitverse — push-зеркало/бэкап**.
### Инфраструктура
- Gitea: gitea.nixg.ru (1.26.2), контейнер `gitea` + `gitea-db` (postgres) + `gitea-redis` + `gitea-act-runner` в /opt/gitea.nixg.ru/docker-compose.yml.
- Runner: `gitea/runner:3.3.1` (Rust, НЕ старый act_runner Go), контейнер gitea-act-runner, имя bigbox-runner (id=2), глобальный (repo_id=0).
- SSH gitea.nixg.ru:2222 снаружи ЗАКРЫТ («Connection refused») — пуши в Gitea только по HTTPS с токеном.
### Что сделано
1. **Runner переключён с docker27-bash на ubuntu**: старый label `ubuntu-24.04:docker://docker27-bash:latest` не работал (внутри Alpine без python/hugo, `apk update` → timeout 124 — нет сети в job-контейнере). Сменён на `ubuntu-24.04:docker://ubuntu:latest` (docker-compose.yml стр.118, GITEA_RUNNER_LABELS). Правка /data/.runner бесполезна — runner при старте перезаписывает из env/БД.
2. **Репо dedinit.ru (id=8) разблокировано**: было pull-mirror с gitverse (`is_mirror=t`) — на зеркалах Gitea не выполняет Actions. Снято UPDATE repository SET is_mirror=f + DELETE из mirror (БД). Также отсутствовал repo_unit type=10 (Actions) — INSERT (config=NULL, access_mode=0, как у рабочего репо icq id=2). Итог: has_actions:true (API).
3. **Секрет SSHPASS**: PUT /api/v1/repos/estorozhenko/dedinit.ru/actions/secrets/SSHPASS → 201 (пароль Jino SFTP из docs/DEPLOY_INSTRUCTIONS.md).
4. **Workflow** `/opt/dedinit.ru/.gitea/workflows/deploy.yml`:
```yaml
on:
push: { branches: [main] }
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- run: apt-get update && apt-get install -y make python3 python3-venv python3-pip hugo
- run: make deploy # env: SSHPASS: ${{ secrets.SSHPASS }}
```
Закоммичен (первый пуш f714b91 был БЕЗ .gitea — файл был untracked; исправлено коммитом 39f29cc).
5. **Пуш в Gitea**: `git remote add gitea https://gitea.nixg.ru/estorozhenko/dedinit.ru.git`, пуш HTTPS с токеном из /opt/hermes/.hermes/secrets/git-tokens.env (GITEA_NIXG_TOKEN).
### Диагностика тупика (runs не создаются для dedinit)
Симптомы: API /actions/runs → пусто; веб /actions → «The workflow has no runs yet»; docker logs gitea-act-runner пусты; action_run в БД — 0 строк для repo_id=8. При этом пуши принимаются (activity op_type=18, receive-pack 200).
Проверено и ОТБРОШЕНО (не причина):
- Тип runner-а — НЕ проблема (probe-репо работает с тем же runner).
- repo_unit type=10 — на месте, приведён к виду рабочего репо (config NULL, access 0).
- is_mirror=f, original_service_type/url — очищены (был oauth2-хвост от gitverse), рестарт — без эффекта.
- GITEA__actions__DEFAULT_ACTIONS_URL=github — добавлен, без эффекта.
- webhooks — пусто у обоих репо; Redis-кэш пуст; схема БД v331 (актуальна); рестарты gitea — без эффекта.
КЛЮЧЕВЫЕ НАХОДКИ:
- **Включён файловый лог Gitea** (GITEA__log__MODE=file + LEVEL=debug в docker-compose; файл /data/gitea/log/gitea.log в контейнере). Без этого docker logs gitea пусты (stdout → файлы, не tty).
- После receive-pack для dedinit НЕТ вызовов Actions-обработчика (нет `actions_ready_job`), а для probe-репо ЕСТЬ.
- **Доказательство работоспособности Actions**: создано probe-репо actions-probe-0920 (id=60) с простейшим workflow (`- run: echo hello`, БЕЗ `uses:`) → 3 runs созданы и ВЫПОЛНЕНЫ (status=1). В логе Gitea видны RunnerService/UpdateTask/UpdateLog от 87.242.100.206 (bigbox).
- **Разница dedinit vs probe**: у dedinit workflow содержит `uses: actions/checkout@v4` (внешний action), у probe — только `run:`. ГИПОТЕЗА: Gitea молча отбрасывает run, если не может разрешить внешний action (checkout@v4). НЕ ДОКАЗАНА — тест на следующую сессию.
### Питфолы (запомнить)
- repo id меняется при пересоздании репо через API (DEL+CREATE): probe получил id=60, а я проверял id=59 — «0 runs» было ложным из-за неверного id! ВСЕГДА проверять id через repository.lower_name.
- docker logs gitea пусты (stdout → файлы) — для диагностики включать GITEA__log__MODE=file.
- Правка /data/.runner до рестарта бесполезна (перезаписывается env GITEA_RUNNER_LABELS).
- Токен GITEA_NIXG_TOKEN в HTTPS-URL: команды с `source git-tokens.env` триггерят терминальную защиту — обход: `set -a; source ...; set +a`.
### Следующая сессия (план)
1. Тест гипотезы `uses:`: в probe-репо запушенную копию deploy.yml с `uses: actions/checkout@v4` → пушнуть → проверить action_run для id=60. Если run не создастся — причина найдена.
2. Фикс: заменить `uses: actions/checkout@v4` на ручной `git clone` (actions: git/checkout не обязателен; код доступен по HTTPS с токеном или как-либо ещё). Либо, если хочется оставить checkout — разобраться с резолвингом внешних actions в Gitea (DEFAULT_ACTIONS_URL уже стоит; можно проверить, доступен ли runner'у github из job-контейнера).
3. Довести до прода: run создаётся → runner собирает hugo → SFTP заливка public/ на Jino → прод 200 → убрать диагностику логов.
4. openspec: обновить design/tasks (финальная схема: Gitea источник + SFTP Jino + push-mirror gitverse), validate, archive.
5. push-mirror Gitea → gitverse (бэкап).
6. Память Hermes: конвенция «истина = gitverse» → «Gitea источник, gitverse push-зеркало» (память переполнена — ужать устаревшее).
## 2026-09-13 — Пост «GoToSocial молча съедал статусы с релеев»
(см. предыдущую версию журнала — без изменений)
## 2026-09-12 — Уборка структуры репозитория + OpenSpec
(см. предыдущую версию журнала — без изменений)