Skip to content

Commit 151f3ff

Browse files
durandomclaude
andcommitted
feat: add rhdh-release skill for release management (v0.5.0)
14-command CLI (scripts/release.py) for deterministic release data gathering — dates, status, teams, freeze announcements, blockers, CVEs, release notes. Agent calls CLI first, then adds judgment. - 13 JQL templates, 4 Slack announcement templates, 13 workflows - Zero cross-skill symlinks — gog CLI for Google Sheets/Docs - Team name normalization for Jira↔Sheets matching - 54 unit tests + structural checks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent c415a59 commit 151f3ff

47 files changed

Lines changed: 4981 additions & 229 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude-plugin/marketplace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
},
66
"metadata": {
77
"description": "Orchestrator skill for RHDH plugin development - onboard, update, and maintain plugins in the Extensions Catalog",
8-
"version": "0.3.1"
8+
"version": "0.5.0"
99
},
1010
"plugins": [
1111
{
1212
"name": "rhdh",
1313
"source": "./",
1414
"description": "Skills for RHDH plugin lifecycle management",
15-
"version": "0.3.1",
15+
"version": "0.5.0",
1616
"strict": true
1717
}
1818
]

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "rhdh",
33
"description": "All-in-one toolkit for Red Hat Developer Hub (RHDH). Covers plugin development, overlay management, environment setup, version compatibility, CI/CD, and RHDH ecosystem navigation.",
4-
"version": "0.3.1",
4+
"version": "0.5.0",
55
"author": {
66
"name": "RHDH Store Manager"
77
},

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ htmlcov/
2727
.DS_Store
2828
Thumbs.db
2929

30+
# OAuth credentials
31+
client_secret*.json
32+
3033
# uv
3134
.python-version
3235

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,29 @@ Update Konflux task digests and apply `MIGRATION.md` pipeline changes in [rhdh-p
3838
npx skills add redhat-developer/rhdh-skill --skill konflux-tekton-updates
3939
```
4040

41+
### Platform Lifecycle
42+
43+
Check version support status for platforms and integrations used by RHDH.
44+
45+
- **[lifecycle](./skills/lifecycle/SKILL.md)** — Check version lifecycle and support status for OCP, AKS, EKS, GKE, RHDH releases, RHBK, Quay, PostgreSQL, and any Red Hat product via the Product Life Cycles API.
46+
47+
### CI / Prow
48+
49+
Manage Prow CI job configurations and trigger nightly E2E tests.
50+
51+
- **[prow](./skills/prow/SKILL.md)** — Manage Prow CI job configurations for RHDH in the openshift/release repository. List, generate, add, and remove OCP test entries and cluster pools. List K8s platform test entries (AKS, EKS, GKE). Analyze coverage gaps. Commission new release branches and decommission end-of-life ones.
52+
- **[prow-trigger-nightly](./skills/prow-trigger-nightly/SKILL.md)** — Trigger RHDH nightly ProwJobs on demand via the OpenShift CI Gangway REST API. Supports both rhdh and rhdh-plugin-export-overlays repos with Gangway overrides for catalog index image, chart version, and Playwright version.
53+
54+
### Base image
55+
56+
Bump UBI / RHEC base image tags and refresh `@sha256` digests in **rhdh** and **rhdh-operator** (see [rhdh-repos](./skills/rhdh/references/rhdh-repos.md)).
57+
58+
- **[update-base-image](./skills/update-base-image/SKILL.md)** — Analyze and update Containerfile / Dockerfile using [rhdh-downstream](./skills/rhdh/references/rhdh-repos.md#rhdh-downstream) scripts (`build/scripts/`). Bundled `analyze-base-images.sh`; run `updateBaseImages.sh` per repo. Requires `skopeo login registry.redhat.io`.
59+
60+
```bash
61+
npx skills add redhat-developer/rhdh-skill --skill update-base-image
62+
```
63+
4164
### Local Testing
4265

4366
Test plugins in a local RHDH instance before deploying.

docs/adr/0002-stdlib-only-python-clis.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,9 @@ Both CLIs (`rhdh` and `rhdh-local`) use only Python 3.9+ standard library — ze
99
- **`uv`** as the dev tool runner (`uv run pytest`) — not shipped with the CLIs, but used for development and testing
1010

1111
New scripts and CLI commands in this project should follow these same patterns.
12+
13+
## Exceptions
14+
15+
Prow skill scripts (under `skills/prow/scripts/`) use `ruamel.yaml` for round-trip YAML processing — preserving comments, key ordering, and quoting style that the stdlib `yaml` module cannot handle. These scripts declare the dependency via PEP 723 inline script metadata (`# /// script` blocks), and `uv run --script` auto-installs it in an ephemeral virtual environment. No user-facing install step is required.
16+
17+
The stdlib-only rule still applies to the main CLIs and any script not run via `uv run --script`.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "rhdh-skill"
3-
version = "0.3.1"
3+
version = "0.5.0"
44
description = "Claude Code skill for RHDH plugin development"
55
readme = "README.md"
66
license = "Apache-2.0"

skills/prow-trigger-nightly/SKILL.md

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ description: >-
1414
Trigger RHDH nightly ProwJobs via the OpenShift CI Gangway REST API.
1515

1616
Supports two repositories:
17+
1718
- **rhdh** — the main RHDH application (`periodic-ci-redhat-developer-rhdh-*-nightly`)
1819
- **rhdh-plugin-export-overlays** — plugin export overlays (`periodic-ci-redhat-developer-rhdh-plugin-export-overlays-*-nightly`)
1920

@@ -56,6 +57,7 @@ Then ask the user to describe which job and branch they want in natural language
5657
Map the user's description to the matching full job name from the fetched list. If no branch is mentioned, default to `main`:
5758

5859
**RHDH repo jobs:**
60+
5961
- "ocp helm" / "openshift helm" -> `e2e-ocp-helm-nightly` (not upgrade, not versioned)
6062
- "operator" / "ocp operator" -> `e2e-ocp-operator-nightly` (not auth-providers)
6163
- "helm upgrade" / "upgrade test" -> `e2e-ocp-helm-upgrade-nightly`
@@ -72,6 +74,7 @@ Map the user's description to the matching full job name from the fetched list.
7274
- Multiple: "all AKS jobs", "all Operator jobs on main" -> offer to trigger them in sequence
7375

7476
**Overlay repo jobs:**
77+
7578
- "overlay nightly" / "overlay helm" / "overlays nightly" -> `periodic-ci-redhat-developer-rhdh-plugin-export-overlays-main-e2e-ocp-helm-nightly`
7679

7780
### Shared Cluster Constraint (GKE / OSD-GCP only)
@@ -80,21 +83,34 @@ GKE and OSD-GCP each share a single cluster — never run two jobs on the same p
8083

8184
## Step 2: Options
8285

83-
**Important:** Overlay repo jobs only support fork overrides (`--org`, `--repo`, `--branch`). Image overrides (`--image-registry`, `--image-repo`, `--tag`) and `--send-alerts` are NOT supported — the script will error if these are passed for an overlay job. If the user doesn't need fork overrides, skip this step and go directly to Step 3.
86+
### Overlay repo jobs
87+
88+
Overlay jobs support fork overrides (`--org`, `--repo`, `--branch`), catalog index override (`--catalog-index-image`), and Playwright version override (`--playwright-version`).
89+
90+
Image overrides (`--image-registry`, `--image-repo`, `--tag`), `--chart-version`, and `--send-alerts` are NOT supported — the script will error if these are passed for an overlay job.
91+
92+
If the user doesn't need any overrides, skip this step and go directly to Step 3.
8493

85-
For RHDH repo jobs, present all options together. The user picks by number — multiple selections allowed (e.g. "2, 5"):
94+
### RHDH repo jobs
95+
96+
Present all options together. The user picks by number — multiple selections allowed (e.g. "2, 5"):
8697

8798
**Image override:**
99+
88100
1. **Default image** — no image flags, use whatever the job is configured with
89101
2. **Custom tag only** — override just the tag, keep default registry and repo
90102
3. **Custom repo + tag** — override image repository and tag, keep default registry (`quay.io`)
91103
4. **Fully custom image** — override registry, repo, and tag
92104

105+
**Catalog & chart override:**
106+
5. **Catalog index image** — override the plugin catalog index image (`--catalog-index-image`)
107+
6. **Chart version** — override the Helm chart version (`--chart-version`)
108+
93109
**Additional options:**
94-
5. **Fork override** — run against a fork instead of `redhat-developer/rhdh`
95-
6. **Send Slack alerts** — notify via `--send-alerts`
110+
7. **Fork override** — run against a fork instead of `redhat-developer/rhdh`
111+
8. **Send Slack alerts** — notify via `--send-alerts`
96112

97-
Constraint: `--image-repo` requires `--tag`, but `--tag` works on its own.
113+
Constraint: `--image-repo` requires `--tag`, but `--tag` works on its own. `--playwright-version` is overlay-only and will error for RHDH jobs.
98114

99115
### Follow-up based on selections
100116

@@ -111,11 +127,17 @@ uv run scripts/trigger_nightly_job.py --list-tags
111127
Use `--image-repo <REPO>` to query a different image repository (default: `rhdh/rhdh-hub-rhel9`). Present the numbered results with a final option to enter a custom tag (e.g. `next`, `latest`). For option 3, also ask for the image repository.
112128

113129
**If 4 selected (non-quay registry)** — ask for all three values (tag fetching not available):
130+
114131
- Registry (e.g. `brew.registry.redhat.io`)
115132
- Image repo (e.g. `rhdh/rhdh-hub-rhel9`)
116133
- Tag (e.g. `1.9`)
117134

118-
**If 5 selected** — ask for:
135+
**If 5 selected** — ask for catalog index image (e.g. `quay.io/rhdh/plugin-catalog-index:1.9-60` for RC, `registry.access.redhat.com/rhdh/plugin-catalog-index:1.9.4` for GA).
136+
137+
**If 6 selected** — ask for chart version (e.g. `1.9-227-CI`).
138+
139+
**If 7 selected** — ask for:
140+
119141
- GitHub org (`--org`): e.g. `my-github-user`
120142
- Repo name (`--repo`): e.g. `rhdh`
121143
- Branch (`--branch`): e.g. `my-feature-branch`
@@ -130,6 +152,9 @@ uv run scripts/trigger_nightly_job.py \
130152
[--image-registry <REGISTRY>] \
131153
[--image-repo <REPO>] \
132154
[--tag <TAG>] \
155+
[--catalog-index-image <IMAGE>] \
156+
[--chart-version <VERSION>] \
157+
[--playwright-version <VERSION>] \
133158
[--org <ORG>] \
134159
[--repo <REPO>] \
135160
[--branch <BRANCH>] \
@@ -142,14 +167,33 @@ uv run scripts/trigger_nightly_job.py \
142167

143168
After execution, show the API response. If a job URL or ID is returned, display it prominently. On error, help diagnose (common issues: expired token, invalid job name).
144169

170+
### RC Verification Example
171+
172+
```bash
173+
uv run scripts/trigger_nightly_job.py \
174+
--job periodic-ci-redhat-developer-rhdh-main-e2e-ocp-helm-nightly \
175+
--image-repo rhdh/rhdh-hub-rhel9 --tag 1.9-227 \
176+
--catalog-index-image quay.io/rhdh/plugin-catalog-index:1.9 \
177+
--chart-version 1.9-227-CI
178+
```
179+
180+
### GA Verification Example
181+
182+
```bash
183+
uv run scripts/trigger_nightly_job.py \
184+
--job periodic-ci-redhat-developer-rhdh-main-e2e-ocp-helm-nightly \
185+
--image-registry registry.redhat.io --image-repo rhdh/rhdh-hub-rhel9 --tag 1.9.4 \
186+
--catalog-index-image registry.access.redhat.com/rhdh/plugin-catalog-index:1.9.4
187+
```
188+
145189
## Reference
146190

147-
- Script flags: `-j/--job`, `-l/--list`, `-T/--list-tags`, `--tag-filter`, `-I/--image-registry`, `-q/--image-repo`, `-t/--tag`, `-o/--org`, `-r/--repo`, `-b/--branch`, `-S/--send-alerts`, `-n/--dry-run`, `--json`
191+
- Script flags: `-j/--job`, `-l/--list`, `-T/--list-tags`, `--tag-filter`, `-I/--image-registry`, `-q/--image-repo`, `-t/--tag`, `--catalog-index-image`, `--chart-version`, `--playwright-version`, `-o/--org`, `-r/--repo`, `-b/--branch`, `-S/--send-alerts`, `-n/--dry-run`, `--json`
148192
- Dedicated kubeconfig at `~/.config/openshift-ci/kubeconfig` — won't interfere with your current cluster context
149193
- If auth is needed, the script opens a browser for SSO login
150-
- RHDH jobs list: https://prow.ci.openshift.org/configured-jobs/redhat-developer/rhdh
151-
- Overlay jobs list: https://prow.ci.openshift.org/configured-jobs/redhat-developer/rhdh-plugin-export-overlays
152-
- Image tags: https://quay.io/repository/rhdh/rhdh-hub-rhel9?tab=tags
194+
- RHDH jobs list: <https://prow.ci.openshift.org/configured-jobs/redhat-developer/rhdh>
195+
- Overlay jobs list: <https://prow.ci.openshift.org/configured-jobs/redhat-developer/rhdh-plugin-export-overlays>
196+
- Image tags: <https://quay.io/repository/rhdh/rhdh-hub-rhel9?tab=tags>
153197

154198
## Related Skills
155199

skills/prow-trigger-nightly/scripts/trigger_nightly_job.py

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -353,15 +353,17 @@ def build_payload(args: argparse.Namespace) -> dict:
353353
is_overlay = args.job.startswith(OVERLAY_JOB_PREFIX)
354354

355355
if is_overlay:
356-
# Overlay jobs support fork overrides only (org, repo, branch).
357-
# Image overrides and alerts are not supported.
356+
# Overlay jobs support fork overrides, catalog index, and playwright version.
357+
# Image overrides, chart version, and alerts are not supported.
358358
unsupported: list[str] = []
359359
if args.image_repo:
360360
unsupported.append("--image-repo")
361361
if args.image_registry:
362362
unsupported.append("--image-registry")
363363
if args.tag:
364364
unsupported.append("--tag")
365+
if args.chart_version:
366+
unsupported.append("--chart-version")
365367
if args.send_alerts:
366368
unsupported.append("--send-alerts")
367369
if unsupported:
@@ -377,7 +379,16 @@ def build_payload(args: argparse.Namespace) -> dict:
377379
envs["MULTISTAGE_PARAM_OVERRIDE_GITHUB_REPOSITORY_NAME"] = args.repo
378380
if args.branch:
379381
envs["MULTISTAGE_PARAM_OVERRIDE_RELEASE_BRANCH_NAME"] = args.branch
382+
if args.catalog_index_image:
383+
envs["MULTISTAGE_PARAM_OVERRIDE_CATALOG_INDEX_IMAGE"] = args.catalog_index_image
384+
if args.playwright_version:
385+
envs["MULTISTAGE_PARAM_OVERRIDE_PLAYWRIGHT_VERSION"] = args.playwright_version
380386
else:
387+
# RHDH repo jobs do not support playwright version.
388+
if args.playwright_version:
389+
log_error("--playwright-version is only supported for overlay jobs.")
390+
sys.exit(1)
391+
381392
# RHDH repo jobs support full overrides.
382393
if args.image_repo:
383394
envs["MULTISTAGE_PARAM_OVERRIDE_IMAGE_REPO"] = args.image_repo
@@ -391,6 +402,10 @@ def build_payload(args: argparse.Namespace) -> dict:
391402
envs["MULTISTAGE_PARAM_OVERRIDE_GITHUB_REPOSITORY_NAME"] = args.repo
392403
if args.branch:
393404
envs["MULTISTAGE_PARAM_OVERRIDE_RELEASE_BRANCH_NAME"] = args.branch
405+
if args.catalog_index_image:
406+
envs["MULTISTAGE_PARAM_OVERRIDE_CATALOG_INDEX_IMAGE"] = args.catalog_index_image
407+
if args.chart_version:
408+
envs["MULTISTAGE_PARAM_OVERRIDE_CHART_VERSION"] = args.chart_version
394409

395410
skip_alert = "false" if args.send_alerts else "true"
396411
envs["MULTISTAGE_PARAM_OVERRIDE_SKIP_SEND_ALERT"] = skip_alert
@@ -531,56 +546,77 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
531546
help="Filter tags by version prefix (e.g. '1.10'). Used with --list-tags.",
532547
)
533548

534-
overrides = parser.add_argument_group("RHDH job overrides (not supported for overlay jobs)")
535-
overrides.add_argument(
549+
shared = parser.add_argument_group("Shared overrides (both rhdh and overlay jobs)")
550+
shared.add_argument(
551+
"-o",
552+
"--org",
553+
dest="org",
554+
default="",
555+
help="Override the GitHub org (default: redhat-developer).",
556+
)
557+
shared.add_argument(
558+
"-r",
559+
"--repo",
560+
dest="repo",
561+
default="",
562+
help="Override the GitHub repo name (default: rhdh).",
563+
)
564+
shared.add_argument(
565+
"-b",
566+
"--branch",
567+
dest="branch",
568+
default="",
569+
help="Override the branch name.",
570+
)
571+
shared.add_argument(
572+
"--catalog-index-image",
573+
dest="catalog_index_image",
574+
default="",
575+
help="Override the catalog index image (e.g. quay.io/rhdh/plugin-catalog-index:1.9-60).",
576+
)
577+
578+
rhdh_only = parser.add_argument_group("RHDH-only overrides (not supported for overlay jobs)")
579+
rhdh_only.add_argument(
536580
"-I",
537581
"--image-registry",
538582
dest="image_registry",
539583
default="",
540584
help="Override the image registry (default: quay.io).",
541585
)
542-
overrides.add_argument(
586+
rhdh_only.add_argument(
543587
"-q",
544588
"--image-repo",
545589
dest="image_repo",
546590
default="",
547591
help="Override the image repository (e.g. rhdh/rhdh-hub-rhel9). Requires --tag.",
548592
)
549-
overrides.add_argument(
593+
rhdh_only.add_argument(
550594
"-t",
551595
"--tag",
552596
dest="tag",
553597
default="",
554598
help="Override the image tag (e.g. 1.9-123).",
555599
)
556-
overrides.add_argument(
557-
"-o",
558-
"--org",
559-
dest="org",
560-
default="",
561-
help="Override the GitHub org (default: redhat-developer).",
562-
)
563-
overrides.add_argument(
564-
"-r",
565-
"--repo",
566-
dest="repo",
567-
default="",
568-
help="Override the GitHub repo name (default: rhdh).",
569-
)
570-
overrides.add_argument(
571-
"-b",
572-
"--branch",
573-
dest="branch",
600+
rhdh_only.add_argument(
601+
"--chart-version",
602+
dest="chart_version",
574603
default="",
575-
help="Override the branch name.",
604+
help="Override the Helm chart version (e.g. 1.9-227-CI).",
576605
)
577-
578-
parser.add_argument(
606+
rhdh_only.add_argument(
579607
"-S",
580608
"--send-alerts",
581609
action="store_true",
582610
help="Send Slack alerts (default: alerts are skipped).",
583611
)
612+
613+
overlay_only = parser.add_argument_group("Overlay-only overrides (not supported for rhdh jobs)")
614+
overlay_only.add_argument(
615+
"--playwright-version",
616+
dest="playwright_version",
617+
default="",
618+
help="Override the Playwright version (overlay jobs only).",
619+
)
584620
parser.add_argument(
585621
"-n",
586622
"--dry-run",

skills/prow/SKILL.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ description: >-
44
Manage Prow CI job configurations for RHDH in the openshift/release
55
repository. List, generate, add, and remove OCP test entries and cluster
66
pools. List K8s platform test entries (AKS, EKS, GKE). Analyze OCP
7-
version coverage gaps. Decommission end-of-life release branches. Use
8-
when working with RHDH CI config, Prow jobs, cluster pools, or
9-
openshift/release CI management.
7+
version coverage gaps. Commission new release branches and decommission
8+
end-of-life ones. Use when working with RHDH CI config, Prow jobs,
9+
cluster pools, or openshift/release CI management.
1010
---
1111
# RHDH Prow CI Management
1212

@@ -32,6 +32,7 @@ What CI management task do you need?
3232
| "cluster pool", "ClusterPool", "Hive pool" | `workflows/ocp-pools.md` |
3333
| "coverage", "gap analysis", "what OCP versions are missing" | `workflows/ocp-coverage.md` |
3434
| "AKS test", "EKS test", "GKE test", "K8s platform jobs" | `workflows/k8s-jobs.md` |
35+
| "commission", "new release branch", "create release branch CI", "onboard release", "add release branch" | `workflows/commission-release.md` |
3536
| "decommission", "EOL release", "remove release branch", "clean up old release" | `workflows/decommission-release.md` |
3637

3738
After reading the workflow, follow it exactly.

0 commit comments

Comments
 (0)