docs(adr-0028): accept CI/CD + git hosting migration to GitLab #227

Merged
julien merged 1 commits from docs/adr-0028-accept into main 2026-05-26 10:54:56 +02:00
Owner

Summary

Promotes ADR-0028 from proposed to accepted. Shipped as proposed in #226; no open question left on either drivers, considered options, or the 4-phase migration sequence. Same shape as #219 (ADR-0026 + ADR-0027 acceptance).

Once merged, Phase 1 of the migration (mirror-and-bootstrap — repos pushed to GitLab, branch protection / MR templates / deploy keys / Renovate reconfig) is unblocked.

What lands

File Change
docs/decisions/0028-migrate-cicd-and-git-hosting-to-gitlab.md Frontmatter status: proposed → accepted.
docs/decisions/0015-cicd-gitea-actions.md Status-update note added at the top, right under the title — calls out that the platform choice "Gitea Actions" is superseded by ADR-0028, while the rest of ADR-0015's architectural principles (trunk-based + squash, all-gates-blocking, thin YAML, on-prem runners, signed commits, Conventional Commits) carry over unchanged. ADR-0015 stays accepted.
docs/decisions/README.md ADR-0028 row: proposed → accepted.
CLAUDE.md Roll-up bumped to ADRs 0001 → 0028 accepted with a one-sentence explanation that ADR-0028 supersedes only ADR-0015's platform choice. CI/CD architecture bullet rewritten to reflect the accepted-but-not-yet-implemented state — "Gitea Actions today, migrating to GitLab CE on vm-gitlab per ADR-0028 (4-phase rollout in follow-up PRs)". The architectural detail (gates list, thin YAML, signed commits) was preserved; only the platform headline and the act_runner→GitLab Runner line are touched. Also corrected: ci:scan (which doesn't exist as a script) → the real script names (ci:catalogue-drift, ci:audit, ci:perf, ci:gzip-budgets).

Notes for the reviewer

  • No new Architecture bullet for ADR-0028 itself. The decision is a platform shift for the existing CI/CD architecture, not a new architectural concern — so it folds into the existing ADR-0015 bullet rather than adding a sibling.
  • The annotation pattern on ADR-0015 (status-update blockquote at the top) is the canonical MADR way to handle partial supersession without changing the frontmatter status. The architectural principles are still accepted; only the platform implementation moves. A future reader hitting ADR-0015 first sees the redirect immediately.
  • The CLAUDE.md script-list correction is a side-fix — ci:scan is not a real script name; the actual gates are ci:check, ci:catalogue-drift, ci:audit, ci:commits, ci:perf, ci:gzip-budgets. Updated in the same touch since the bullet was being rewritten anyway.
  • No code changes, so no pnpm ci:check impact. pnpm exec prettier --check clean on the four touched files.

Test plan

  • pnpm exec prettier --check — clean on the four touched files.
  • ADR-0015 → ADR-0028 cross-reference resolves (the new blockquote link).
  • ADRs 0001 → 0028 accepted matches reality (grep '^status: ' docs/decisions/*.md shows everything below 0029 as accepted).
  • Review focus — the ADR-0015 status-update note phrasing, the CLAUDE.md CI/CD bullet rewrite (especially the "carry over" wording), the roll-up sentence about partial supersession.

What's next (post-merge)

  1. Phase 1 — mirror-and-bootstrapgit push --mirror gitlab for apf_portal and the proto vendoring in apf-ai-service. GitLab side: groups, projects, branch protection (mirror Gitea's), MR templates, deploy keys, Renovate reconfigured for GitLab. No .gitlab-ci.yml yet — Gitea pipelines continue to gate. Ops work primarily; the only PR-shaped output is a Renovate config update on the apf-portal repo if its host detection changes.
  2. Phase 2 — gitlab-ci-pipeline.gitlab-ci.yml lands alongside .gitea/workflows/ci.yml. Both pipelines run in parallel for ~1 calendar week. GitLab Runner registered on vm-gitlab.
  3. Phase 3 — cutover — remotes flip in CLAUDE.md, READMEs, docs/setup/01-dev-debian-vm-setup.md §8.3. .gitea/workflows/ + infra/ci-runners.compose.yml deleted, Gitea read-only / archive.
  4. Phase 4 — cleanup — stale references sweep, required signed-commits on main enabled.

In parallel — once you've finished walking through the dev VM bootstrap — the paused ADR-0027 PR 1 (Region / Delegation / Structure Prisma schema + inline seed) and ADR-0026 PR 1 (Person / User / UserScope schema + provisioner) can ship on Gitea; they're decoupled from the migration and don't need to wait for it.

## Summary Promotes [ADR-0028](docs/decisions/0028-migrate-cicd-and-git-hosting-to-gitlab.md) from `proposed` to `accepted`. Shipped as `proposed` in [#226](https://git.unespace.com/julien/apf_portal/pulls/226); no open question left on either drivers, considered options, or the 4-phase migration sequence. Same shape as [#219](https://git.unespace.com/julien/apf_portal/pulls/219) (ADR-0026 + ADR-0027 acceptance). Once merged, **Phase 1** of the migration (`mirror-and-bootstrap` — repos pushed to GitLab, branch protection / MR templates / deploy keys / Renovate reconfig) is unblocked. ## What lands | File | Change | | --- | --- | | `docs/decisions/0028-migrate-cicd-and-git-hosting-to-gitlab.md` | Frontmatter `status: proposed → accepted`. | | `docs/decisions/0015-cicd-gitea-actions.md` | **Status-update note** added at the top, right under the title — calls out that the platform choice "Gitea Actions" is superseded by ADR-0028, while the rest of ADR-0015's architectural principles (trunk-based + squash, all-gates-blocking, thin YAML, on-prem runners, signed commits, Conventional Commits) carry over unchanged. ADR-0015 stays `accepted`. | | `docs/decisions/README.md` | ADR-0028 row: `proposed → accepted`. | | `CLAUDE.md` | Roll-up bumped to `ADRs 0001 → 0028 accepted` with a one-sentence explanation that ADR-0028 supersedes only ADR-0015's platform choice. **CI/CD architecture bullet rewritten** to reflect the accepted-but-not-yet-implemented state — "Gitea Actions today, migrating to GitLab CE on `vm-gitlab` per ADR-0028 (4-phase rollout in follow-up PRs)". The architectural detail (gates list, thin YAML, signed commits) was preserved; only the platform headline and the act_runner→GitLab Runner line are touched. Also corrected: `ci:scan` (which doesn't exist as a script) → the real script names (`ci:catalogue-drift`, `ci:audit`, `ci:perf`, `ci:gzip-budgets`). | ## Notes for the reviewer - **No new Architecture bullet for ADR-0028 itself.** The decision is a *platform shift* for the existing CI/CD architecture, not a new architectural concern — so it folds into the existing ADR-0015 bullet rather than adding a sibling. - **The annotation pattern on ADR-0015** (status-update blockquote at the top) is the canonical MADR way to handle partial supersession without changing the frontmatter status. The architectural principles are still accepted; only the platform implementation moves. A future reader hitting ADR-0015 first sees the redirect immediately. - **The CLAUDE.md script-list correction** is a side-fix — `ci:scan` is not a real script name; the actual gates are `ci:check`, `ci:catalogue-drift`, `ci:audit`, `ci:commits`, `ci:perf`, `ci:gzip-budgets`. Updated in the same touch since the bullet was being rewritten anyway. - **No code changes**, so no `pnpm ci:check` impact. `pnpm exec prettier --check` clean on the four touched files. ## Test plan - [x] `pnpm exec prettier --check` — clean on the four touched files. - [x] ADR-0015 → ADR-0028 cross-reference resolves (the new blockquote link). - [x] `ADRs 0001 → 0028 accepted` matches reality (`grep '^status: ' docs/decisions/*.md` shows everything below 0029 as `accepted`). - [ ] **Review focus** — the ADR-0015 status-update note phrasing, the CLAUDE.md CI/CD bullet rewrite (especially the "carry over" wording), the roll-up sentence about partial supersession. ## What's next (post-merge) 1. **Phase 1 — `mirror-and-bootstrap`** — `git push --mirror gitlab` for `apf_portal` and the proto vendoring in `apf-ai-service`. GitLab side: groups, projects, branch protection (mirror Gitea's), MR templates, deploy keys, Renovate reconfigured for GitLab. **No `.gitlab-ci.yml` yet** — Gitea pipelines continue to gate. Ops work primarily; the only PR-shaped output is a Renovate config update on the apf-portal repo if its host detection changes. 2. **Phase 2 — `gitlab-ci-pipeline`** — `.gitlab-ci.yml` lands alongside `.gitea/workflows/ci.yml`. Both pipelines run in parallel for ~1 calendar week. GitLab Runner registered on `vm-gitlab`. 3. **Phase 3 — `cutover`** — remotes flip in CLAUDE.md, READMEs, `docs/setup/01-dev-debian-vm-setup.md` §8.3. `.gitea/workflows/` + `infra/ci-runners.compose.yml` deleted, Gitea read-only / archive. 4. **Phase 4 — `cleanup`** — stale references sweep, required signed-commits on `main` enabled. In parallel — once you've finished walking through the dev VM bootstrap — the paused **ADR-0027 PR 1** (Region / Delegation / Structure Prisma schema + inline seed) and **ADR-0026 PR 1** (Person / User / UserScope schema + provisioner) can ship on Gitea; they're decoupled from the migration and don't need to wait for it.
julien added 1 commit 2026-05-26 10:52:55 +02:00
docs(adr-0028): accept CI/CD + git hosting migration to GitLab
CI / scan (pull_request) Successful in 3m2s
CI / commits (pull_request) Successful in 3m12s
CI / check (pull_request) Successful in 3m23s
CI / a11y (pull_request) Successful in 3m10s
Docs site / build (pull_request) Successful in 3m44s
CI / perf (pull_request) Successful in 6m27s
a706e3ddc4
ADR-0028 shipped as proposed in #226. No open questions on drivers,
considered options, or the 4-phase migration sequence - promote to
accepted to unblock Phase 1 (mirror-and-bootstrap).

ADR-0015 gets a status-update blockquote at the top calling out that
the platform choice "Gitea Actions" is superseded by ADR-0028 while
the architectural principles in the rest of ADR-0015 (trunk-based +
squash, all-gates-blocking, thin YAML, on-prem runners, signed
commits, Conventional Commits) carry over unchanged. ADR-0015's
frontmatter status stays accepted - this is the canonical MADR way
to handle partial supersession without rewriting the decision record.

CLAUDE.md CI/CD architecture bullet rewritten to reflect the
accepted-but-not-yet-implemented state. Roll-up bumped to 0001 -> 0028
accepted. Side-fix: the bullet referenced a non-existent `ci:scan`
script; replaced with the real names (ci:catalogue-drift, ci:audit,
ci:perf, ci:gzip-budgets).

No code changes, no ci:check impact.
julien merged commit 670f6303fe into main 2026-05-26 10:54:56 +02:00
julien deleted branch docs/adr-0028-accept 2026-05-26 10:54:58 +02:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: julien/apf_portal#227