Docs Pipeline
stack-docs/.github/workflows/docs.yml · scripts/inject-doc-meta.mjs · scripts/build-changelog.mjs · quartz-overrides/
Як stack-docs рендериться у єдиний сайт docs.besocial.tech. ~2-3 хв на тригер.
Як це працює
-
Тригер — один з трьох:
- push у
masterstack-docsзі змінами в**/*.md,scripts/,quartz-overrides/, workflow repository_dispatchз типомservice-docs-updated(його шлють сервісні репо коли в них змінюєтьсяdocs/)- cron щодоби о 04:00 UTC — запасний механізм
workflow_dispatch(ручний запуск з UI Actions)
- push у
-
Checkout stack-docs з повною git-історією (
fetch-depth: 0). -
Setup Quartz — клонується свіжий Quartz у
_quartz/. -
Apply overrides —
rsync stack-docs/quartz-overrides/ _quartz/. -
Copy root content — все з кореня stack-docs (окрім
services/,scripts/,.github/,quartz-overrides/, тощо) у_quartz/content/. -
Inject metadata for root —
inject-doc-meta.mjs --repo stack-docs --src .додає у frontmattermodifiedіauthorз git log stack-docs. -
Aggregate services — для кожного запису в
SERVICESenv:- клонується сервісне репо з PAT (depth=200, потрібна свіжа гілка з
docs/) rsync <repo>/docs/ _quartz/content/services/<vault>/rewrite-service-wikilinks.mjs— переписує relative wikilinks ([[ui/Chat]]→[[services/<vault>/ui/Chat]]) і basename-лінки які мають локальний match ([[Canvas]]→[[services/<vault>/Canvas]]). Без цього кроку сервісні wikilinks ламаються в спільному vault — Quartzshortestmode не вміє резолвити slash-форми.inject-doc-meta.mjs --repo <repo> --src docs --target ... --prefix services/<vault>/- тимчасова папка чиститься
.canvasфайли копіюються в build, але Quartz їх нативно не рендерить — це обмеження. Для візуальних мап на сайті використовуємо mermaid у тілі md-сторінок (зокремаindex.mdсервісу).canvas-to-mermaid.mjsзалишився вscripts/як реалізована опція автоконвертації, зараз не використовується через слабкий auto-layout для великих канв. - клонується сервісне репо з PAT (depth=200, потрібна свіжа гілка з
-
Build changelog —
build-changelog.mjsзбирає_changelog-partial.jsonз усіх піддиректорій у єдинийchangelog.md. -
Build Quartz —
npx quartz build→_quartz/public/. -
Deploy —
wrangler pages deployна Cloudflare Pages projектstack-docs.
Список сервісів
Редагується у env.SERVICES workflow-файла. Формат рядка:
<vault_name>:<repo_name>:<branch>
vault_name— як називається папка у vault (напр.electron,golden)repo_name— назва репо в GitHub-org, не локальна папка. Зараз єдине розходження — локальна папкаstack-electron, а на GitHub репо називаєтьсяelectron(історично). Тому в SERVICESelectron:electron:refactor. Коли клонуєш сервіси для перевірки —git ls-remote https://github.com/it-monkeys/<repo_name>дасть точно.branch— гілка з якої беремоdocs/(різниться між репо: десьmaster, десьrefactor, десьupdate_swagger)
Якщо в репо ще нема docs/ — пайплайн пропускає його з warning’ом, не падає.
Як тригернути ручно
Поки webhook’и з сервісів не налаштовані, оновлення сайту після зміни доки в сервісі робиться одним з трьох способів:
1. GitHub UI (найшвидше).
- github.com/it-monkeys/stack-docs/actions
- Зліва обрати workflow Build & Deploy Docs
- Над списком ранів буде блакитна смуга з текстом «This workflow has a
workflow_dispatchevent trigger.» — у її правій частині кнопка Run workflow ▼. - Клік → dropdown Use workflow from: Branch master → кнопка Run workflow.
- Через ~1.5 хв білд завершиться, сайт оновиться.
2. gh CLI (якщо встановлено gh):
gh workflow run docs.yml --repo it-monkeys/stack-docs3. Порожній коміт у stack-docs (без UI):
cd stack-docs
git commit --allow-empty -m "trigger rebuild" && git pushТригерить workflow по push фільтру.
4. Cron щодоби о 04:00 UTC — нічого не робиш, ранкова зміна сама опиниться на сайті за добу.
Опційно: webhook з сервісного репо
Якщо хочеться щоб push у <service>/docs/ одразу тригерив білд stack-docs — кладемо .github/workflows/notify-stack-docs.yml у сервісне репо за шаблоном stack-docs/scripts/service-trigger-template.yml.
Передумови у сервісному репо:
- secret
STACK_DOCS_DISPATCH_TOKEN— fine-grained PAT з permissionActions: Read and writeнаit-monkeys/stack-docs(один токен на всі сервіси) - branch у
pathsworkflow має збігатись з branch уSERVICESstack-docs
Має сенс налаштовувати коли 2+ людей паралельно редагують доки і набридло натискати Run workflow вручну.
Секрети у stack-docs
| Secret | Призначення | Термін дії |
|---|---|---|
SERVICES_READ_TOKEN | Fine-grained PAT з Contents: read на всі сервісні репо | до 1 року (GitHub обмеження для PAT до org-репо) |
CLOUDFLARE_API_TOKEN | API токен Cloudflare з permission на Pages | за вибором при створенні (типово без expiration) |
CLOUDFLARE_ACCOUNT_ID | ID акаунту Cloudflare | не протухає |
Ротація SERVICES_READ_TOKEN
Токен живе максимум 1 рік (GitHub-обмеження для fine-grained PAT що дають доступ до org-репо). Коли протухне — workflow почне падати на кроці Clone services and aggregate docs з 401/404 на git clone.
GitHub за ~7 днів до експірації шле email-нагадування власнику токена. Краще перестворити заздалегідь.
Як перестворити
- GitHub → профіль → Settings → Developer settings → Personal access tokens → Fine-grained tokens
- Generate new token зі старими параметрами:
- Token name:
stack-docs-services-read - Resource owner:
it-monkeys - Expiration: 1 year (максимум)
- Repository access: Only select repositories — обрати всі сервісні репо (
stack-electron,stack-golden,stack-client,stack,stack-prime,stack-udate,stack-chathouse,stack-academy,stack-ai) - Repository permissions →
Contents: Read-only(Metadata: Read-only додасться автоматично як Required)
- Token name:
- Якщо org має policy на approval — попроси org-owner схвалити у
it-monkeys→ Settings → Personal access tokens → Pending requests. - У
it-monkeys/stack-docs→ Settings → Secrets and variables → Actions →SERVICES_READ_TOKEN→ Update value (вставити новий токен). - Старий токен можна revoke у Fine-grained tokens після того як перевірив що новий працює.
- Перевірка: Actions →
Build & Deploy Docs→ Run workflow. Якщо проходить крокClone servicesбез warning’ів про 401 — все ок.
Важливо: не забувай оновлювати список репо у пункті 2 коли в проєкт додається новий сервіс — інакше workflow тихо буде skip’ати його з варнінгом «не вдалось клонити».
Метадані файлів
Інжектиться у frontmatter:
modified— ISO 8601 дата останнього коміту що торкався файла (з відповідного репо!)author—%anостаннього комітуtags— JSON-array з першого рядка body (Obsidian inline-теги#x #y)
Файли в репо НЕ модифікуються — інжект на копії у
_quartz/content/. Локально в Obsidian усе як було.
Нюанси
fetch-depth: 0обов’язковий — без нього git log поверне 1 коміт і дати/changelog зламаються.- Сервісні репо клонуються
--depth=200— компроміс між швидкістю і точністю історії. Якщо потрібна повна історія — підвищити або прибрати. concurrency: docs-build— два пайплайни одночасно не біжать. Запит що прийшов поки інший виконується — стає у чергу (cancel-in-progress: false).- Cron 04:00 UTC — підстраховка на випадок якщо webhook з сервісу загубився. Не критичний — головний канал це
repository_dispatch. _changelog-partial.json— тимчасові артефакти що залишаютьinject-doc-metaпісля кожного репо.build-changelog.mjsїх збирає і видаляє. На сайт не попадають.- Файли крос-сервісних wikilinks з префіксом
services/<vault>/— тому коли стійкий лінк ставиш на чужий сервіс у root-доці, пиши[[services/golden/api/index]].
Чек-ліст коли ламається пайплайн
- Дата на сторінці = unix epoch (1970) →
fetch-depthне 0 або сервіс склонувався без історії (підвищити depth) - Сервіс не з’явився на сайті → перевір що додано в
env.SERVICES, що гілка існує, що PAT не протух - Webhook з сервісу не тригерить білд → перевір
STACK_DOCS_DISPATCH_TOKENв сервісному репо, дивись Actions runs у stack-docs - Cloudflare deploy впав → перевір
CLOUDFLARE_API_TOKENіCLOUDFLARE_ACCOUNT_ID - Quartz побудувався з помилкою про брокен лінк → лінк на файл який не існує у vault. Якщо це крос-сервіс — перевір що цільовий сервіс має
docs/і присутній уSERVICES.
Як змінити пайплайн
- Додати сервіс — рядок у
env.SERVICES. Якщо репо вже маєdocs/— підхопиться при наступному запуску. - Прибрати сервіс — видалити рядок. Старий контент зникне з сайту після наступного білду.
- Змінити вигляд автора/дати —
quartz-overrides/quartz/components/ContentMeta.tsx. - Додати ще overrides Quartz-компонента — кладемо у
quartz-overrides/quartz/components/<Name>.tsx. Rsync скопіює автоматично. - Розширити changelog — функції в
build-changelog.mjs.
Зв’язки
- Тригериться: пуш у stack-docs master, repository_dispatch з сервісів, cron, ручний dispatch
- Читає:
git logусіх сервісних репо - Пише:
_quartz/content/**(тимчасово, у CI) - Деплоїть:
docs.besocial.tech(Cloudflare Pages)