Files
admin/.wiki/concepts/sched-publish-runbook.md

97 lines
10 KiB
Markdown
Raw 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.
---
title: sched — публикация на GitHub (private-dev-public-publish, CI, Pages, синк dev→pub)
type: concept
tags: [sched, runbook, publish, github, pages, private-dev-public-publish, docus, ci]
related: [concepts/runbooks-index.md, concepts/docus-github-pages-pitfalls.md]
updated: 2026-08-27
---
# sched → GitHub: публикация и синк (runbook)
> **⚙️ СЛУЖЕБНЫЙ РАНБУК — только для администратора проекта `.admin`.**
> Применять/выполнять шаги может только **`.admin`** (оператор проекта admin). Другим проектам/агентам — читать по запросу, не выполнять.
> Из проекта не выносить: не копировать в другие вики, не пересказывать, не публиковать.
> Нужен деплой или прод-операция по этому ранбуку — **поставить задачу админу (`.admin`) и написать письмо**. Админ выполняет, остальные верифицируют.
Публикация **sched** (шедулер, OSS, MIT) на GitHub по паттерну
private-dev-public-publish: разработка в приватном Gitea, наружу — курируемая
копия. Первый паблиш — 2026-08-27 (task:1149, по «го» vitya).
## Топология
| Роль | Папка | Origin | Мета |
|---|---|---|---|
| dev | `~/projects/sched` | `git.kzntsv.site/victor/sched` (Gitea) | `.wiki/.tasks/.agents` внутри |
| pub | `~/projects/sched-upstream` | `github.com/schedjs/schedjs` (main) | нет |
## Артефакты
- **Репо pub:** `schedjs/schedjs` (PUBLIC, MIT, 12 topics: cron/scheduler/job-queue/task-scheduler/background-jobs/self-hosted/nodejs/typescript/queue/devtools/mcp/docker; description+homepage `https://schedjs.github.io/sched`).
- **Сайт доков:** `https://schedjs.github.io/schedjs/` (Pages, workflow `ci.yml` → docs job; llms.txt/llms-full.txt).
- **CI:** `.github/workflows/ci.yml` — test (unit, без БД) + docs (Pages). Конфиг юнит-сьюта: `vitest.ci.config.ts`.
- **Доки:** `docs/` (Docus 5.12.3 на Nuxt), dist = `docs/dist` (трекается, Pages-сборка).
- **Storage-тесты с БД:** локально (docker: mongo 27017, pg 5433 `postgres:test`, mysql 3308 `root:test`, mariadb 3307 `root:test`).
## Синк dev → pub (курируемая копия)
1. **Список файлов:** `git -C ~/projects/sched ls-files` минус исключения:
`^\.wiki/|^\.tasks/|^\.agents/|^AGENTS\.md$|^CLAUDE\.md$|^branding/pora-|^pngtree-|^327274997_|^cat-clock-|^MIGRATION\.md$`.
Untracked в dev (canva/istock/logo.ai/logo.png/logo.svg/черновики) НЕ копируются.
2. **Копировать** в `~/projects/sched-upstream` (mkdir -p + cp по списку).
3. **Выбелить** (dev-приватное → публичное), файлы в pub-копии:
- `.yarnrc.yml``npmRegistryServer: "https://registry.npmjs.org"`, без токена;
- `docs/nuxt.config.ts` + `docs/modules/sched-links.ts` → дефолты `github.com/schedjs/schedjs`, `registry.npmjs.org`, `ghcr.io/schedjs` (env-оверрайд сохранён);
- `apps/daemon/Dockerfile` → секрет `id=npm_token` (не verdaccio_token), комменты;
- `docker-compose.dev.yml` → убрать NPM_REGISTRY/NPM_TOKEN (публичный npm);
- `CHANGELOG.md` → «→ npm» вместо verdaccio, docker-образ без registry.kzntsv;
- `scripts/publish-check.mjs` + `publish-check.test.mjs``ghcr.io/schedjs/sched-daemon`;
- `examples/*/generate.ps1`, README, test → убрать «verdaccio subpath export».
4. **dist:** `rm -rf docs/dist && cp -r dev/docs/dist` + скраб остатков `git.kzntsv` (в т.ч. JSON-экранированных `\u002F`). `docs/dist/logo.svg` НЕ коммитить (user: svg не едет; источник в корне dev untracked).
5. **Проверка:** `grep -rnE 'git\.kzntsv|verdaccio|vds\.kzntsv|registry\.kzntsv|VERDACCIO'` → 0; мета → 0; один чистый коммит + push main.
## CI (workflow ci.yml)
- **test (unit):** checkout → setup-node 24 → corepack enable → `yarn install --immutable``yarn workspaces foreach --all -pt --exclude docs run build``yarn tsc --noEmit``yarn vitest run --config vitest.ci.config.ts` (исключает `packages/storage-*/test/**` — им нужны живые БД).
- **docs:** на push в main: install → `yarn workspace docs build` → upload-pages-artifact (docs/dist) → deploy-pages. Pages включён (`gh api repos/schedjs/schedjs/pages -X POST -f build_type=workflow`).
- **Ручной запуск:** `workflow_dispatch`.
## Verify (после синка/деплоя)
- `https://schedjs.github.io/schedjs/` → meta-refresh на `/schedjs/docs/introduction` (200), CSS (`/schedjs/_nuxt/…`), favicon (`/schedjs/favicon.ico` 200), лого (full URL `https://schedjs.github.io/schedjs/logo.png` 200), llms.txt 200.
- Футер: 1 иконка GitHub (не 2).
- `gh run list` зелёный; `gh repo view` topics/description.
## Rollback
- **Репо:** содержимое pub = курируемая копия; откат = revert коммита pub (история чистая).
- **Pages:** перезапуск предыдущего успешного deploy-pages (Pages → последний деплой) или push реверта.
- **CI-конфиг:** фиксы в dev → синк → push.
## Gotchas
1. **`app.baseURL: '/schedjs/'`** обязателен (Pages-subpath), но Docus игнорирует его для двух ссылок: index meta-refresh (`url=/docs/introduction`) и favicon (`href="/favicon.ico"`) → пост-фикс в `scripts/docs-dist.mjs` (запускается после generate; срабатывает и в CI).
2. **NuxtImg двойная база лого:** header logo `'/logo.png'``/_ipx/_/schedjs/logo.png` (404, _ipx не генерится статически). Фикс: полный URL в `header.logo.light/dark` (`https://schedjs.github.io/schedjs/logo.png`) — ipx пропускает внешние.
3. **Футер: 2 GitHub-иконки** — Docus сам подставляет github из git-remote + explicit `socials.github`. Убрать explicit (pub remote = github.com → 1 иконка). В dev-сборке (Gitea remote) футер покажет Gitea-ссылку — при синке dist скрабить.
4. **`docs/dist/logo.svg` регенерируется** из `docs/public/logo.svg` при каждой сборке (2026-08-27: вынесен в корень dev, untracked) — не коммитить в pub.
5. **CI: dist нет в git** (gitignored) → `build` до `tsc` (cross-package types через dist).
6. **corepack vs setup-node `cache: yarn`** — кэш дёргает системный yarn 1 → падает на packageManager. Кэш не использовать.
7. **mariadb:11 первый старт** дольше health-окна GH Actions (76s+) — healthcheck не вешать; ждать готовности node-скриптом на драйверах (pg/mysql2/mongodb) или юнит-only CI.
8. **yarn.lock** в Berry-формате без URL; может быть устаревшим (nodemailer) — `yarn install` в dev, синк. До npm-паблиша `@sched/mcp@npm:^0.4.0` резолвится в workspace (transparent) — install с npmjs работает.
9. **Процесс-раннер в тестах:** спавнит с чистым env (без PATH) → `['node', …]` падает ENOENT на Linux CI → в real-spawn тестах `process.execPath`.
## Осталось (на 2026-08-27)
- **Чистый старт репо 2026-08-27:** `schedjs/sched` удалён → создан `schedjs/schedjs` с ОДНИМ root-коммитом (нет истории доко-сборки). MIGRATION.md исключён из паблик-сета (история миграций — dev-only). Все URL/бейджи/baseURL переведены на `schedjs.github.io/schedjs/` + `github.com/schedjs/schedjs`. Синк: `git checkout --orphan` + копия + выбеливание + один коммит + push.
- ~~npm-паблиш~~ **СДЕЛАНО 2026-08-27: скоуп `@schedjs/*`, НЕ `@sched`** (имя `sched` занято на npmjs юзером-профилем → оргу `@sched` создать нельзя; `@schedjs` свободен и совпадает с GitHub-org). Опубликованы все 9 пакетов: `@schedjs/{core,admin-api,cli,mcp,storage-mongo,storage-mysql,storage-postgres,ui,daemon}`. В dev-манифестах/доках/README тоже переименовано `@sched/*``@schedjs/*` (коммит 137f78b). npm-токен — `npm/admin-npm-token` (pass), owner org schedjs, bypass 2FA; старый apilki-токен удалён из pass.
- docker-образ daemon: НЕ паблишен (publish-check ругается на `registry.kzntsv.site/sched-daemon`); цель — `ghcr.io/schedjs/sched-daemon` (как в выбеленных publish-check/Dockerfile).
- task:720 `pkg-repo-metadata`**сделано** (repository/homepage/bugs/author добавлены во все 9 манифестов в волне переименования);
- Context7-сабмит (Pages живы); README npm-бейдж после паблиша — README во всех пакетах уже с бейджами;
- schedjs.com — фаза SaaS (CNAME → Pages), обновить llms.domain и header.logo URL.
## Связи
- `concepts/runbooks-index.md` — индекс (строка sched).
- Shared wiki (mappa): Docus-подводные камни — `docus-github-pages-pitfalls` (тема создана из этого опыта).
- Скил `private-dev-public-publish` (глобальный) — общая топология двух репо.