OPS50: porta CI GitHub para Forgejo (parte 1) #5

Merged
fsolla merged 16 commits from OPS50-ci-github-para-forgejo into main 2026-08-17 14:43:13 +00:00
Owner

Parte 1 da OPS50 (#1) — CI GitHub → Forgejo. Closes #1 (parte 1).

Porta o CI, o script de push e a orquestração de agentes do GitHub Actions para o Forgejo Actions, sem trocar o fluxo de trabalho humano:

  • Workflows (.forgejo/workflows/): ci.yml/ci-pr.yml (gate de PR: unit → int → build → e2e em shards com Postgres efêmeros no runner, cascade de escopo, requeue via forgejo-dispatch), agent-pool.yml (orquestrador remoto + relógio), agent-pr-ready-automerge.yml (auto-merge de PRs ready com forgejo-pr-automerge), issue-done-on-main-merge.yml / plan-issue-ready-on-main-merge.yml (transições de Issue), vercel-promote.yml e archive-cursor-agent.yml.
  • Scripts: scripts/lib/forgejo-api.mjs (cliente REST zero-dependência, contratos normalizados para o formato GitHub que os scripts de agente já usam), forgejo-dispatch.mjs, forgejo-pr-automerge.mjs, forgejo-issue-transition.mjs, issue.mjs com cmdNext/cmdAll async; .github/ removido.
  • Segredo/novidade: o runner Forgejo local expõe o gateway do bridge; o postgres-service provisiona bancos efêmeros de teste para cada job (portas 5433-5436), com scripts/lib/gateway.mjs resolvendo o host real via /proc/net/route (octetos na ordem certa — o IPv4 little-endian do /proc enganou o primeiro probe).
  • Validado: unit tests 2283 verdes (10 novos do forgejoApi), pnpm push com gate local completo verde ([gate:ci] ✓ all checks passed), e2e prod mode 165+ passed / 0 failed; fix test(e2e C104) incluído (o clique no centro da linha de hora do FullCalendar resolvia para a quinta da semana — com término hoje+1 o teste falhava seg/ter; agora clica na coluna do dia atual).

Parte 2 (issues do GitHub, .agents/, docs, pool) fica para o próximo PR.

**Parte 1 da OPS50 (#1) — CI GitHub → Forgejo.** Closes #1 (parte 1). Porta o CI, o script de push e a orquestração de agentes do GitHub Actions para o Forgejo Actions, sem trocar o fluxo de trabalho humano: - **Workflows (`.forgejo/workflows/`):** `ci.yml`/`ci-pr.yml` (gate de PR: unit → int → build → e2e em shards com Postgres efêmeros no runner, cascade de escopo, requeue via `forgejo-dispatch`), `agent-pool.yml` (orquestrador remoto + relógio), `agent-pr-ready-automerge.yml` (auto-merge de PRs ready com `forgejo-pr-automerge`), `issue-done-on-main-merge.yml` / `plan-issue-ready-on-main-merge.yml` (transições de Issue), `vercel-promote.yml` e `archive-cursor-agent.yml`. - **Scripts:** `scripts/lib/forgejo-api.mjs` (cliente REST zero-dependência, contratos normalizados para o formato GitHub que os scripts de agente já usam), `forgejo-dispatch.mjs`, `forgejo-pr-automerge.mjs`, `forgejo-issue-transition.mjs`, `issue.mjs` com `cmdNext`/`cmdAll` async; `.github/` removido. - **Segredo/novidade:** o runner Forgejo local expõe o gateway do bridge; o `postgres-service` provisiona bancos efêmeros de teste para cada job (portas 5433-5436), com `scripts/lib/gateway.mjs` resolvendo o host real via `/proc/net/route` (octetos na ordem certa — o IPv4 little-endian do `/proc` enganou o primeiro probe). - **Validado:** unit tests 2283 verdes (10 novos do `forgejoApi`), `pnpm push` com gate local completo verde (`[gate:ci] ✓ all checks passed`), e2e prod mode 165+ passed / 0 failed; fix `test(e2e C104)` incluído (o clique no centro da linha de hora do FullCalendar resolvia para a quinta da semana — com término hoje+1 o teste falhava seg/ter; agora clica na coluna do dia atual). Parte 2 (issues do GitHub, `.agents/`, docs, pool) fica para o próximo PR.
fsolla added 11 commits 2026-08-17 06:13:00 +00:00
spike(OPS50): probe de service postgres em porta própria no runner
Some checks failed
Spike — service postgres em porta própria / probe (push) Failing after 45s
d34f723db8
spike(OPS50): probe v2
Some checks failed
Spike — service postgres em porta própria / probe (push) Failing after 5s
c8ca121e15
spike(OPS50): probe gateway do bridge
Some checks failed
Spike — service postgres via gateway do bridge / probe (push) Failing after 5s
ef7ae55f2e
spike(OPS50): probe gateway via /proc/net/route
Some checks failed
Spike — service postgres via gateway do bridge / probe (push) Failing after 37s
9506251cb4
spike(OPS50): fix name yaml (dois-pontos)
Some checks failed
Spike — forgejo-runner v13 node24 actions + gateway / probe (push) Failing after 1m32s
d2a658891c
spike(OPS50): probe gateway com octetos na ordem certa
All checks were successful
Spike — forgejo-runner v13 node24 actions + gateway / probe (push) Successful in 12s
94204cfb5e
Workflows nativos em .forgejo/workflows/ (ci, ci-pr, agent-pool,
automerge, issue-transition, plan-issue, vercel-promote, archive),
removendo .github/workflows e .github/actions. Runner Forgejo v13 com
services Postgres por porta + DB_HOST via gateway do bridge. Libs de
agente sobre o novo cliente forgejo-api.mjs (zero dependências,
GITHUB_SERVER_URL/FORGEJO_API_URL), helpers de workflow plain-Node.
pnpm issue corrigido (await em função sync) e validado ao vivo. Testes:
forgejoApi.unit.spec.ts novo, pin do matrix do ci.yml atualizado.

Closes #1 (parte 1 — docs/issues/pool seguem na parte 2)
fix(e2e C104): clica no slot 14:00 da coluna de hoje, não no centro da linha de hora
Some checks failed
Agent PR Ready + auto-merge / ready-automerge (pull_request) Has been skipped
CI (PR) / docs-guards (pull_request) Successful in 7s
CI (PR) / plans-only-closes (pull_request) Successful in 7s
CI (PR) / scope (pull_request) Successful in 43s
CI (PR) / lint (pull_request) Successful in 54s
CI (PR) / typecheck (pull_request) Successful in 30s
CI (PR) / knip (pull_request) Successful in 31s
CI (PR) / cycles (pull_request) Successful in 30s
CI (PR) / unit (pull_request) Successful in 44s
CI (PR) / format (pull_request) Failing after 2m6s
CI (PR) / int (pull_request) Has been skipped
CI (PR) / build (pull_request) Has been skipped
CI (PR) / e2e (pull_request) Has been skipped
CI (PR) / checks (pull_request) Failing after 1s
eb281ab5aa
O data-time do FullCalendar é uma linha única que atravessa a semana; o
clique force no centro dela resolve o dia pela coordenada x -> coluna do
meio da semana (quinta). Com o término calculado como hoje+1 (C134), o
teste falhava seg/ter quando o término caía antes do início (alert de
validação no overlay). Passa a clicar na coluna do dia atual.
fsolla added 1 commit 2026-08-17 06:29:07 +00:00
chore(OPS50): ignora .pnpm-store no prettier/git — runner self-hosted deixa o store no workspace
Some checks failed
Agent PR Ready + auto-merge / ready-automerge (pull_request) Has been skipped
CI (PR) / docs-guards (pull_request) Successful in 6s
CI (PR) / plans-only-closes (pull_request) Successful in 6s
CI (PR) / scope (pull_request) Successful in 30s
CI (PR) / lint (pull_request) Successful in 39s
CI (PR) / format (pull_request) Successful in 47s
CI (PR) / typecheck (pull_request) Successful in 30s
CI (PR) / knip (pull_request) Successful in 34s
CI (PR) / cycles (pull_request) Successful in 33s
CI (PR) / unit (pull_request) Successful in 46s
CI (PR) / build (pull_request) Has been skipped
CI (PR) / int (pull_request) Failing after 36s
CI (PR) / e2e (pull_request) Failing after 1m30s
CI (PR) / checks (pull_request) Failing after 1s
0de9e9f57d
fsolla added 1 commit 2026-08-17 06:46:18 +00:00
fix(ci OPS50): guards de banco aceitam o gateway da bridge do runner (RFC1918) — postgres do services: fica no IP do gateway, não em localhost
Some checks failed
Agent PR Ready + auto-merge / ready-automerge (pull_request) Has been skipped
CI (PR) / docs-guards (pull_request) Successful in 6s
CI (PR) / plans-only-closes (pull_request) Successful in 6s
CI (PR) / scope (pull_request) Successful in 31s
CI (PR) / lint (pull_request) Successful in 40s
CI (PR) / format (pull_request) Successful in 48s
CI (PR) / typecheck (pull_request) Successful in 31s
CI (PR) / knip (pull_request) Successful in 32s
CI (PR) / cycles (pull_request) Successful in 33s
CI (PR) / unit (pull_request) Successful in 46s
CI (PR) / build (pull_request) Has been skipped
CI (PR) / int (pull_request) Failing after 1m5s
CI (PR) / e2e (pull_request) Failing after 2m47s
CI (PR) / checks (pull_request) Failing after 1s
02f68894c3
fsolla added 1 commit 2026-08-17 06:56:32 +00:00
fix(ci OPS50): vitest/playwright recarregam .env.test por cima do env do job — gravar DATABASE_URL do serviço em .env.test.local (camada que vence)
Some checks failed
Agent PR Ready + auto-merge / ready-automerge (pull_request) Has been skipped
CI (PR) / scope (pull_request) Successful in 30s
CI (PR) / format (pull_request) Successful in 54s
CI (PR) / docs-guards (pull_request) Successful in 6s
CI (PR) / plans-only-closes (pull_request) Successful in 6s
CI (PR) / lint (pull_request) Successful in 38s
CI (PR) / typecheck (pull_request) Successful in 30s
CI (PR) / knip (pull_request) Successful in 32s
CI (PR) / cycles (pull_request) Successful in 31s
CI (PR) / unit (pull_request) Successful in 43s
CI (PR) / build (pull_request) Has been skipped
CI (PR) / int (pull_request) Failing after 1m25s
CI (PR) / e2e (pull_request) Failing after 2m54s
CI (PR) / checks (pull_request) Failing after 1s
6b9c04820b
fsolla added 1 commit 2026-08-17 07:17:57 +00:00
fix(ci OPS50): matrix estática [1,2] no e2e (Forgejo não passa job results à expansão de matrix — fromJson(needs.*) vira shard vazio) e VITEST_MAX_WORKERS=4 no int (8 CPUs do runner × pool-10 estoura os 100 clients do Postgres do serviço)
Some checks failed
Agent PR Ready + auto-merge / ready-automerge (pull_request) Has been skipped
CI (PR) / docs-guards (pull_request) Successful in 6s
CI (PR) / plans-only-closes (pull_request) Successful in 6s
CI (PR) / scope (pull_request) Successful in 31s
CI (PR) / lint (pull_request) Successful in 40s
CI (PR) / format (pull_request) Successful in 57s
CI (PR) / typecheck (pull_request) Successful in 33s
CI (PR) / knip (pull_request) Successful in 33s
CI (PR) / cycles (pull_request) Successful in 34s
CI (PR) / unit (pull_request) Successful in 45s
CI (PR) / build (pull_request) Has been skipped
CI (PR) / int (pull_request) Successful in 1m58s
CI (PR) / e2e (1) (pull_request) Failing after 3m8s
CI (PR) / e2e (2) (pull_request) Failing after 3m11s
CI (PR) / checks (pull_request) Failing after 1s
b51f745f66
fsolla added 1 commit 2026-08-17 14:33:04 +00:00
fix(ci OPS50): build e2e em .next-e2e (o webServer do playwright serve esse dir desde 7ca0efc9 — os workflows ainda buildavam em .next/e2e e o 'next start' não achava o bundle) + invariante unit passa a pinar os workflows
Some checks failed
Agent PR Ready + auto-merge / ready-automerge (pull_request) Has been skipped
CI (PR) / docs-guards (pull_request) Successful in 6s
CI (PR) / plans-only-closes (pull_request) Successful in 6s
CI (PR) / scope (pull_request) Successful in 41s
CI (PR) / lint (pull_request) Successful in 49s
CI (PR) / format (pull_request) Successful in 1m0s
CI (PR) / typecheck (pull_request) Successful in 34s
CI (PR) / knip (pull_request) Successful in 34s
CI (PR) / cycles (pull_request) Successful in 33s
CI (PR) / unit (pull_request) Successful in 47s
CI (PR) / build (pull_request) Has been skipped
CI (PR) / int (pull_request) Successful in 2m0s
CI (PR) / e2e (2) (pull_request) Successful in 4m23s
CI (PR) / e2e (1) (pull_request) Successful in 4m33s
CI (PR) / checks (pull_request) Successful in 1s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 24s
Agent pool supervisor / tick (pull_request) Failing after 1m3s
CI / int (push) Failing after 1m22s
CI / static (push) Successful in 2m1s
CI / build (push) Successful in 2m36s
CI / e2e (1) (push) Failing after 9m2s
CI / e2e (2) (push) Failing after 8m37s
CI / checks (push) Failing after 1s
CI / deploy (push) Has been skipped
CI / requeue (push) Successful in 7s
ac664093d2
fsolla merged commit ac664093d2 into main 2026-08-17 14:43:13 +00:00
Sign in to join this conversation.
No reviewers
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: fsolla/teqo#5
No description provided.