docs(claude): add scaffold-service skill
Skill that guides creating a new NowChess microservice (blue/green Rollout + active/preview Services + HPA + image registration across overlays + Kargo automation) and adding/changing configuration, with the kustomize build + kubectl dry-run validation gate. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Executable
+109
@@ -0,0 +1,109 @@
|
||||
---
|
||||
name: scaffold-service
|
||||
description: Scaffold a new NowChess microservice or add/change configuration in this GitOps repo. Use when asked to "add a microservice", "add a new service", "wire a new deployment", "add an env var / ConfigMap", "add a new config", or "register a new image" for the nowchess stack. Knows the base + overlay + image-automation layout and the kustomize/dry-run validation gate.
|
||||
---
|
||||
|
||||
# Scaffold a NowChess service / configuration (GitOps)
|
||||
|
||||
A NowChess microservice is an Argo Rollouts **blue/green Rollout** with an
|
||||
**active + preview Service pair**, an **HPA**, environment via a shared
|
||||
**ConfigMap** + **Secrets**, and an **image** registered (and tag-automated via
|
||||
Kargo) in every region/stage overlay.
|
||||
|
||||
Always read the existing `nowchess-account` service as the reference example
|
||||
before writing — copy its shape, don't invent one.
|
||||
|
||||
Files that define the base stack (`nowchess/base/`):
|
||||
|
||||
| File | Holds |
|
||||
|------|-------|
|
||||
| `nowchess-rollouts.yaml` | one `Rollout` per service |
|
||||
| `nowchess-services.yaml` | `<svc>-active` + `<svc>-preview` Services |
|
||||
| `nowchess-hpa.yaml` | one `HorizontalPodAutoscaler` per service |
|
||||
| `nowchess-env-config.yaml` | shared `nowchess-env-config` ConfigMap |
|
||||
| `kustomization.yaml` | resource list + `rollout-transform.yaml` + openapi schema |
|
||||
|
||||
Overlays: `nowchess/{eu-central-1-prod,eu-central-1-staging,htwg-1-prod}/` —
|
||||
each `kustomization.yaml` sets namespace, patches HPA replicas + ConfigMap, and
|
||||
pins `images:` tags. Image tag bumps are automated by Kargo under
|
||||
`kargo-projects/nowchess/`.
|
||||
|
||||
---
|
||||
|
||||
## Mode A — Add a new microservice `<svc>` (service name `nowchess-<svc>`)
|
||||
|
||||
1. **Pick a unique container port.** Check the ports already used in
|
||||
`nowchess-services.yaml` (8080 core, 8083 account, 8087 bot-platform, …) and
|
||||
choose a free one. Use the same port for container, active and preview.
|
||||
|
||||
2. **Rollout** — append a `Rollout` to `nowchess/base/nowchess-rollouts.yaml`,
|
||||
modelled on `nowchess-account`:
|
||||
- `metadata.name` + `labels.app` + `selector.matchLabels.app` =
|
||||
`nowchess-<svc>`.
|
||||
- `spec.strategy.blueGreen.activeService: nowchess-<svc>-active`,
|
||||
`previewService: nowchess-<svc>-preview` (match the existing blueGreen
|
||||
block).
|
||||
- `image: ghcr.io/now-chess/now-chess-systems/<svc>:latest`,
|
||||
`imagePullPolicy: Always`, `imagePullSecrets: ghcr-pull-secret`.
|
||||
- `envFrom` the `nowchess-env-config` ConfigMap; add only the extra `env`
|
||||
this service needs (reuse the existing secret refs where applicable).
|
||||
- Update the grafana scrape annotation `metrics_portNumber` to the chosen port.
|
||||
|
||||
3. **Services** — append `nowchess-<svc>-active` and `nowchess-<svc>-preview` to
|
||||
`nowchess/base/nowchess-services.yaml` (`selector.app: nowchess-<svc>`, the
|
||||
chosen port). Both are required — blue/green needs the pair.
|
||||
|
||||
4. **HPA** — append a `HorizontalPodAutoscaler` to
|
||||
`nowchess/base/nowchess-hpa.yaml` with
|
||||
`scaleTargetRef: { apiVersion: argoproj.io/v1alpha1, kind: Rollout, name: nowchess-<svc> }`.
|
||||
|
||||
`nowchess-rollouts.yaml`, `-services.yaml`, `-hpa.yaml` are already in the
|
||||
base `kustomization.yaml` `resources:` — **no new resource entry needed** for
|
||||
these. Only add to `resources:` when you create a brand-new file.
|
||||
|
||||
5. **Register the image in every overlay.** In each
|
||||
`nowchess/<overlay>/kustomization.yaml` add to `images:`:
|
||||
```yaml
|
||||
- name: ghcr.io/now-chess/now-chess-systems/<svc>
|
||||
newTag: <current-version>
|
||||
```
|
||||
If staging caps replicas, also add the per-overlay HPA patch
|
||||
(`maxReplicas: 1`) like the sibling services in `eu-central-1-staging`.
|
||||
|
||||
6. **Kargo image automation** — add the new image to the warehouse subscription
|
||||
and promotion steps under `kargo-projects/nowchess/` (mirror an existing
|
||||
service entry in `ncs-warehouse.yaml` and `ncs-promotion-template.yaml`) so
|
||||
tag bumps are automated.
|
||||
|
||||
7. **Secrets / RBAC** — if the service needs DB creds, JWT keys, or coordinator
|
||||
RBAC, add the refs the same way `account`/`coordinator` do. Never commit
|
||||
plaintext secrets — re-seal with `scripts/seal-secrets.sh`.
|
||||
|
||||
## Mode B — Add / change configuration
|
||||
|
||||
- **Shared env var** → add the key to `nowchess/base/nowchess-env-config.yaml`,
|
||||
then override per environment with a ConfigMap patch in each overlay's
|
||||
`kustomization.yaml` (see the `nowchess-env-config` patch in
|
||||
`eu-central-1-staging`).
|
||||
- **New ConfigMap / Secret file** → create the YAML, add it to the relevant
|
||||
`kustomization.yaml` `resources:`, and wire it into the Rollout via `envFrom`
|
||||
/ `valueFrom` (the `rollout-transform.yaml` nameReference rules already remap
|
||||
ConfigMap/Secret names inside Rollouts).
|
||||
- **Region-specific value** → patch it in the overlay only; keep the base
|
||||
generic.
|
||||
|
||||
---
|
||||
|
||||
## Validation gate (always, before reporting done)
|
||||
|
||||
For **every** changed overlay path:
|
||||
|
||||
```bash
|
||||
kustomize build --enable-helm nowchess/<overlay> # renders clean
|
||||
kustomize build --enable-helm nowchess/<overlay> | kubectl apply --dry-run=client -f -
|
||||
```
|
||||
|
||||
Both must succeed for all three overlays (`eu-central-1-prod`,
|
||||
`eu-central-1-staging`, `htwg-1-prod`). Fix and re-run until clean. Then report
|
||||
the files touched and the overlays validated. Do not apply to a live cluster
|
||||
unless explicitly asked — Argo CD syncs from `main`.
|
||||
Reference in New Issue
Block a user