generated from coulomb/repo-seed
Define runner and GitOps ownership
This commit is contained in:
12
README.md
12
README.md
@@ -15,8 +15,16 @@ Start with:
|
|||||||
5. `workplans/`
|
5. `workplans/`
|
||||||
|
|
||||||
Current implementation status: active forge extraction. Canonical registry
|
Current implementation status: active forge extraction. Canonical registry
|
||||||
operation docs, deploy-capable Gitea files, and operator targets live here now.
|
operation docs, runner ownership contracts, deploy-capable Gitea files, and
|
||||||
No live Helm deploy or Kubernetes apply was run as part of the move.
|
operator targets live here now. No live Helm deploy or Kubernetes apply was run
|
||||||
|
as part of the move.
|
||||||
|
|
||||||
|
Key contracts:
|
||||||
|
|
||||||
|
- `docs/initial-operating-contracts.md`
|
||||||
|
- `docs/ci-runner-actions-gitops-ownership.md`
|
||||||
|
- `docs/gitea-container-registry.md`
|
||||||
|
- `docs/gitea-package-registry.md`
|
||||||
|
|
||||||
Useful entry points:
|
Useful entry points:
|
||||||
|
|
||||||
|
|||||||
6
SCOPE.md
6
SCOPE.md
@@ -32,6 +32,8 @@ The practical contract is:
|
|||||||
Canonical registry operation docs and read-only forge checks now live here.
|
Canonical registry operation docs and read-only forge checks now live here.
|
||||||
Deploy-capable Gitea Helm/SOPS/manifests also live here now; `railiance-apps`
|
Deploy-capable Gitea Helm/SOPS/manifests also live here now; `railiance-apps`
|
||||||
keeps only transitional compatibility wrappers for old operator entry points.
|
keeps only transitional compatibility wrappers for old operator entry points.
|
||||||
|
The runner, Actions, and GitOps ownership contract lives in
|
||||||
|
`docs/ci-runner-actions-gitops-ownership.md`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -174,7 +176,9 @@ Known starting point:
|
|||||||
4. Read active files in `workplans/`.
|
4. Read active files in `workplans/`.
|
||||||
5. For registry operations, read `docs/gitea-container-registry.md` and
|
5. For registry operations, read `docs/gitea-container-registry.md` and
|
||||||
`docs/gitea-package-registry.md`.
|
`docs/gitea-package-registry.md`.
|
||||||
6. For migration context, read
|
6. For runner, Actions, and GitOps ownership, read
|
||||||
|
`docs/ci-runner-actions-gitops-ownership.md`.
|
||||||
|
7. For migration context, read
|
||||||
`/home/worsch/railiance-apps/workplans/RAILIANCE-WP-0006-railiance-forge-extraction.md`.
|
`/home/worsch/railiance-apps/workplans/RAILIANCE-WP-0006-railiance-forge-extraction.md`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
171
docs/ci-runner-actions-gitops-ownership.md
Normal file
171
docs/ci-runner-actions-gitops-ownership.md
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
# CI Runner, Actions, And GitOps Ownership
|
||||||
|
|
||||||
|
Last reviewed: 2026-06-05
|
||||||
|
|
||||||
|
Status: contract v1. This document defines ownership and handoffs only; it
|
||||||
|
does not authorize a live runner deployment, credential change, GitOps controller
|
||||||
|
change, or Gitea-to-Forgejo cutover.
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
Railiance uses forge-hosted automation to build, test, publish, and verify
|
||||||
|
workloads. The automation path crosses several repos, so this contract separates
|
||||||
|
runner substrate, reusable workflow templates, app-specific checks, and GitOps
|
||||||
|
operation.
|
||||||
|
|
||||||
|
The short version:
|
||||||
|
|
||||||
|
- `railiance-forge` owns the runner substrate and forge automation runtime.
|
||||||
|
- `railiance-enablement` owns reusable workflow templates and paved paths.
|
||||||
|
- Source and app repos own their repo-specific workflows and build scripts.
|
||||||
|
- `railiance-apps` owns S5 app-release checks and deployment evidence.
|
||||||
|
- Lower layers own the cluster, platform services, and runtime secret custody
|
||||||
|
that runners consume through approved handoffs.
|
||||||
|
|
||||||
|
## Ownership Matrix
|
||||||
|
|
||||||
|
| Concern | Owner | Contract |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Gitea/Forgejo Actions runner deployment and registration | `railiance-forge` | Defines how runners are installed, registered, upgraded, drained, replaced, and removed. |
|
||||||
|
| Runner labels, placement, and capacity | `railiance-forge` | Publishes stable capability labels and placement rules. Consumers reference labels, not hostnames. |
|
||||||
|
| Runner registration tokens and runtime credentials | `railiance-forge` with secret custody from `railiance-platform` | References secret names and approved delivery paths only; no decrypted values or tokenized URLs in Git. |
|
||||||
|
| Reusable CI/CD and GitOps workflow templates | `railiance-enablement` | Defines generic build, test, publish, scan, promote, and GitOps review patterns that consume forge labels and credentials. |
|
||||||
|
| App-specific workflows and build scripts | Source repo or app repo | Owns language build details, package metadata, image build definitions, and repo-local test behavior. |
|
||||||
|
| S5 app-release dry-run checks | `railiance-apps` | Owns checks for app Helm charts, app values, app runbooks, and deployment guardrails. |
|
||||||
|
| Runner prerequisites for S5 checks | `railiance-forge` plus lower-layer providers | Forge owns runner label and health evidence; cluster/platform own API reachability, CRDs, kubeconfig delivery, and secret custody. |
|
||||||
|
| ArgoCD and GitOps controller operation | `railiance-cluster` for current addon operation, with patterns from `railiance-enablement` | Forge hosts source and executes checks, but does not own the desired state controller. |
|
||||||
|
| Artifact publish evidence | `railiance-forge` | Captures source repo, commit SHA, artifact identity, package/image version, runner identity, and publish result. |
|
||||||
|
| Deployment and smoke evidence | `railiance-apps` | Captures S5 manifest change, server-side dry-run result, deployment result, and app smoke result. |
|
||||||
|
| Gitea-to-Forgejo automation cutover | `railiance-forge` | Preserves semantic runner labels and evidence contracts while moving the automation runtime. |
|
||||||
|
|
||||||
|
## Runner Label Contract
|
||||||
|
|
||||||
|
Runner labels are the public interface between forge-owned substrate and
|
||||||
|
workflow consumers. Labels should describe capability and trust level, not the
|
||||||
|
machine that happens to run the job.
|
||||||
|
|
||||||
|
Recommended label categories:
|
||||||
|
|
||||||
|
- OS/runtime: `linux`, `container-runtime`.
|
||||||
|
- Build capability: `container-build`, `python-build`, `node-build`.
|
||||||
|
- Publication capability: `registry-publish`, `package-publish`.
|
||||||
|
- Cluster access: `cluster-read`, `cluster-dry-run`.
|
||||||
|
- Release posture: `s5-release-check`, `trusted-secrets`.
|
||||||
|
|
||||||
|
Rules:
|
||||||
|
|
||||||
|
- `railiance-forge` is the only repo that defines and changes the label
|
||||||
|
contract.
|
||||||
|
- `railiance-enablement` templates may require labels from this contract.
|
||||||
|
- Source and app workflows may use labels only when the workflow purpose matches
|
||||||
|
the capability.
|
||||||
|
- Labels that imply secrets or cluster access require a named credential path
|
||||||
|
and a human-reviewed purpose.
|
||||||
|
- Workflow files should not hard-code runner hostnames, local paths, or
|
||||||
|
registration-token details.
|
||||||
|
|
||||||
|
## Placement And Secret Access
|
||||||
|
|
||||||
|
Runner placement is a security boundary. Treat a runner with publish credentials
|
||||||
|
or cluster access as a privileged execution environment.
|
||||||
|
|
||||||
|
- Registry/package publish jobs should run only on runners intended for trusted
|
||||||
|
publication.
|
||||||
|
- Server-side manifest dry-run jobs should run only on runners approved for
|
||||||
|
representative cluster API access.
|
||||||
|
- General build jobs should not receive cluster credentials or broad package
|
||||||
|
publication tokens.
|
||||||
|
- Production-like credentials must be scoped by repository, workflow purpose,
|
||||||
|
and runner label wherever the forge supports that granularity.
|
||||||
|
- Runner tokens should rotate when a runner is replaced, when a trust boundary
|
||||||
|
changes, or during a Gitea-to-Forgejo cutover.
|
||||||
|
- Documentation may reference secret names, SOPS files, OpenBao paths, and
|
||||||
|
Kubernetes Secret names, but must not include live secret values.
|
||||||
|
|
||||||
|
## GitOps Boundary
|
||||||
|
|
||||||
|
Forge automation is not the GitOps control plane.
|
||||||
|
|
||||||
|
- `railiance-forge` hosts source, runs automation, and provides run/publish
|
||||||
|
evidence.
|
||||||
|
- `railiance-enablement` defines reusable GitOps workflow patterns, such as
|
||||||
|
review gates, promotion conventions, and rollback evidence shape.
|
||||||
|
- `railiance-apps` owns app deployment declarations and S5 release guardrails.
|
||||||
|
- `railiance-cluster` currently owns ArgoCD addon operation until another
|
||||||
|
reviewed workplan moves that responsibility.
|
||||||
|
- `railiance-platform` owns shared runtime services consumed by GitOps-managed
|
||||||
|
workloads.
|
||||||
|
|
||||||
|
Automation should normally produce evidence and reviewed manifest changes.
|
||||||
|
Direct runner-driven syncs against a live GitOps controller require a separate
|
||||||
|
approval path because they couple CI credentials to deployment authority.
|
||||||
|
|
||||||
|
## S5 Server-Side Dry-Run Split
|
||||||
|
|
||||||
|
The current S5 dry-run surface belongs in `railiance-apps`:
|
||||||
|
|
||||||
|
- `.gitea/workflows/manifest-server-dry-run.yaml`
|
||||||
|
- `make k8s-server-dry-run`
|
||||||
|
- `tools/k8s-server-dry-run.sh`
|
||||||
|
- app Helm charts and app values
|
||||||
|
|
||||||
|
Forge-owned prerequisites:
|
||||||
|
|
||||||
|
- a runner label such as `cluster-dry-run` or `s5-release-check`;
|
||||||
|
- runner health evidence for that label;
|
||||||
|
- documented placement and trust posture for runners with cluster reachability;
|
||||||
|
- evidence that the runner can receive approved kubeconfig material without
|
||||||
|
exposing live values in Git.
|
||||||
|
|
||||||
|
Lower-layer prerequisites:
|
||||||
|
|
||||||
|
- `railiance-cluster` provides a representative API server and installed CRDs.
|
||||||
|
- `railiance-platform` provides approved secret delivery and shared service
|
||||||
|
dependencies required by the manifests.
|
||||||
|
|
||||||
|
If a workflow cannot find a runner with the required label or cannot access the
|
||||||
|
representative cluster, the failure should be reported as a runner/prerequisite
|
||||||
|
gap, not worked around inside the app chart.
|
||||||
|
|
||||||
|
## Gitea To Forgejo Cutover Path
|
||||||
|
|
||||||
|
The cutover from current Gitea Actions to future Forgejo automation must keep
|
||||||
|
the consumer contract stable.
|
||||||
|
|
||||||
|
Minimum path:
|
||||||
|
|
||||||
|
1. Inventory current runners, labels, credentials, repository hooks, and
|
||||||
|
workflows.
|
||||||
|
2. Define the Forgejo runner equivalent in `railiance-forge`.
|
||||||
|
3. Preserve semantic labels used by S4 templates and S5 checks unless a reviewed
|
||||||
|
migration note announces a replacement.
|
||||||
|
4. Prove a non-production workflow can run on the new runner substrate.
|
||||||
|
5. Dual-run critical publish and dry-run checks where feasible.
|
||||||
|
6. Rotate registration tokens and publish credentials during the switchover.
|
||||||
|
7. Update forge evidence docs with the new runner identity and endpoint.
|
||||||
|
8. Retire the old Gitea runner only after downstream workflows no longer depend
|
||||||
|
on it.
|
||||||
|
|
||||||
|
This cutover does not move template ownership into forge and does not move app
|
||||||
|
release checks out of S5.
|
||||||
|
|
||||||
|
## Minimum Evidence Before Enforcement
|
||||||
|
|
||||||
|
Before a workflow template or S5 check treats a runner label as required, forge
|
||||||
|
should provide:
|
||||||
|
|
||||||
|
- runner inventory with labels, placement, and trust level;
|
||||||
|
- credential scope notes by repository/workflow purpose;
|
||||||
|
- a successful sample job for each privileged label;
|
||||||
|
- package or image publish evidence for publication labels;
|
||||||
|
- representative cluster dry-run evidence for cluster-access labels;
|
||||||
|
- a rollback or disable path for a bad runner registration.
|
||||||
|
|
||||||
|
## Open Follow-Ups
|
||||||
|
|
||||||
|
- WP-0006-T08 should turn runner health and artifact evidence into explicit
|
||||||
|
observability requirements.
|
||||||
|
- WP-0006-T09 should declare runner substrate, label contracts, and evidence
|
||||||
|
edges in Railiance Fabric.
|
||||||
|
- `RAILIANCE-WP-0005-T05` should document app-side dry-run behavior once forge
|
||||||
|
runner prerequisites are ready to enforce.
|
||||||
@@ -56,6 +56,8 @@ leaving live deploy and secret custody changes behind separate review gates.
|
|||||||
- Runner secret access must be explicit by label, repository, and workflow
|
- Runner secret access must be explicit by label, repository, and workflow
|
||||||
purpose. Broad package or cluster credentials should not be shared across
|
purpose. Broad package or cluster credentials should not be shared across
|
||||||
unrelated jobs.
|
unrelated jobs.
|
||||||
|
- The detailed runner, Actions, and GitOps boundary contract lives in
|
||||||
|
`docs/ci-runner-actions-gitops-ownership.md`.
|
||||||
|
|
||||||
## Backup And Restore Handoff
|
## Backup And Restore Handoff
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user