Initial scaffold: generation-rule-only Crossplane Bucket example

Educational RunWhen CodeCollection that discovers Crossplane GCP
Bucket CRDs (storage.gcp.upbound.io/v1beta1) and generates one SLX
per bucket. Ships only generation rules and Jinja templates; the
runtime lives in rw-generic-codecollection/k8s-kubectl-cmd (already
loaded by the airgap runner).

Includes:
- codebundles/gcp-bucket-crossplane-health with generation rule + 3 templates
- docs/01..07 numbered training chapters with screenshot placeholders
- README, .gitignore

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
stewartshea
2026-06-30 21:51:04 -04:00
commit eb8160e659
15 changed files with 1244 additions and 0 deletions
+56
View File
@@ -0,0 +1,56 @@
# simple-private-codecollection
An **educational, generation-rule-only** RunWhen CodeCollection. It ships **no**
Robot Framework code of its own — instead it teaches how a private repository
can define **discovery rules** and **SLX templates** that reuse a generic
runtime already loaded by the RunWhen runner (in this case
[`k8s-kubectl-cmd`](https://github.com/runwhen-contrib/rw-generic-codecollection/tree/main/codebundles/k8s-kubectl-cmd)
from `rw-generic-codecollection`).
## What it demonstrates
- How **workspace-builder** discovers a Kubernetes **Custom Resource** (a
Crossplane `Bucket` from the Upbound GCP provider) via a generation rule.
- How the resulting SLX points its `codeBundle.repoUrl` at a **different**
code collection where the runtime actually lives.
- How to compute a fractional **SLI** (0.01.0) from
`.status.conditions[]` with `jq`, and how to emit a **detailed
TaskSet** with per-condition issues via `RW.DynamicIssues`.
## Layout
```
codebundles/
gcp-bucket-crossplane-health/ # rules + templates only, no *.robot
.runwhen/
generation-rules/gcp-bucket-crossplane-health.yaml
templates/
gcp-bucket-crossplane-health-slx.yaml
gcp-bucket-crossplane-health-sli.yaml
gcp-bucket-crossplane-health-taskset.yaml
docs/
01-overview.md
02-generation-rules-only-pattern.md
03-crossplane-crd-discovery.md
04-generation-rule-walkthrough.md
05-slx-and-templates.md
06-runner-integration.md
07-validate-and-observe.md
images/ # screenshots referenced from the chapters
```
## Start here
Open [`docs/01-overview.md`](docs/01-overview.md) and read the chapters in
order. Each chapter has a short "What you'll do" preamble, an inline diagram
or code snippet, and screenshot placeholders that we fill in as we iterate.
## Target environment
This training example is wired for the RunWhen **airgap** environment (in-cluster
workspace-builder in `runwhen-env-airgap-runner`, Gitea at
`gitea.airgap.shared.runwhen.com`). The generation rule targets real Crossplane
`Bucket` resources already present in that cluster (see
[llm-storage.yaml](https://github.com/runwhen/infra-flux-nonprod-shared/blob/main/infrastructure/crossplane/llm-storage/llm-storage.yaml)
and similar). The pattern applies to any RunWhen environment; only the
`repoUrl` in the templates needs to change.