fluxcd/agent-skills/flux-controller-minor-releases
Claude Code and agent skill by fluxcd/agent-skills
- community
Checking that the SKILL.md file is still in the repository.
Run the upstream Flux controller minor release procedure for helm-controller, image-automation-controller, image-reflector-controller, kustomize-controller, notification-controller, source-controller, and source-watcher. Use when cutting a new controller minor release (vX.Y.0): creating the release series branch, drafting the minor changelog, tagging, merging the release branch back to main, and adding the backport label.
Install
npx vskill@latest install fluxcd/agent-skills/flux-controller-minor-releasesSKILL.md
Flux Controller Minor Releases
Use this skill for upstream Flux controller minor releases (vX.Y.0) only — the release that opens a new release/vX.Y.x series. Do not use it for flux2, pkg, or other non-controller repos.
Supported controllers:
helm-controllerimage-automation-controllerimage-reflector-controllerkustomize-controllernotification-controllersource-controllersource-watcher
Release order across controllers
A controller is released when its tag-triggered release workflow has finished. Release in this order. Do not start a controller's release before everything it depends on is released and bumped (see "Bumping the API in dependent controllers").
Wave 1 — no Flux controller dependencies, any order:
source-controllernotification-controllerimage-reflector-controller
Wave 2 — only after Wave 1 is released and the bump PRs are merged:
helm-controller— needssource-controllerkustomize-controller— needssource-controllersource-watcher— needssource-controllerimage-automation-controller— needssource-controllerand
image-reflector-controller
Hard rule: a Wave 2 controller's release/vX.Y.x branch (step 1) must be cut from a main that already contains the bump. If it does not, stop and land the bump PR first — a release cut without the bump is out of order.
Important rules
- Strictly follow the documented git commands, one step at a time. Each step
below has a reason. Do not invent substitutions, batch unrelated commands into one shell invocation, or insert extra verification commands between documented steps unless asked. Adapt only the version numbers.
- Never block the conversation on long-running operations. CI checks, the
tag-triggered release workflow, and approval waits must be watched in the background (run_in_background) so the user can keep steering and you get notified on completion. A foreground watch blocks the session.
- Always quote PR/issue links as full URLs (e.g.
https://github.com/fluxcd/source-controller/pull/2082), never the <owner>/<repo>#<number> shorthand — full URLs are clickable from the user's terminal.
- Start background watches on every PR immediately after opening it. Kick off
gh pr checks <num> -R fluxcd/<repo> --watch in the background as soon as the PR is created, and the same for tag-triggered release workflows (gh run watch <id> -R fluxcd/<repo>).
- Also start a background approval watch per PR.
gh pr checks --watchonly
covers CI, not maintainer approval. Poll the review state in the background: `` while :; do state=$(gh pr view <num> -R fluxcd/<repo> --json mergeStateStatus,reviewDecision --jq '.reviewDecision+" "+.mergeStateStatus') case "$state" in "APPROVED CLEAN") echo "$state"; break;; esac sleep 30 done ``
- Every git commit must use
-s(sign-off). Never include Co-Authored-By lines,
your own name, or any AI attribution in commit messages, PR titles, or PR descriptions. This applies to the skill-update PR too.
- Always wait for CI to go green before merging any PR.
- You cannot approve your own PRs. If a PR was opened by the git user driving the
session, ask a maintainer to approve it (or confirm it is already approved) before merging.
- Merge release PRs yourself as soon as CI is green and a maintainer has
approved — act immediately so the next step (tag push, merge to main, label PR) unblocks. Applies only to PRs opened with the user's account this session.
- Review feedback on the release PR is applied by amending, not by adding new
commits. The release PR must stay at exactly two commits (Add changelog entry for vX.Y.0 and Release vX.Y.0). Use git reset --soft HEAD~2 + re-commit, or an interactive rebase, then git push --force-with-lease.
- **After applying a review fix, reply
Fixed, thanks!on the thread and resolve
it.** Reply via gh api repos/<owner>/<repo>/pulls/<n>/comments/<cid>/replies -f body='Fixed, thanks!' and resolve via the GraphQL resolveReviewThread mutation.
- Tags must be annotated and signed (
git tag -s -m ...). Never create release
tags through the GitHub API — that produces lightweight tags which break git tag -v verification.
- PR titles and bodies. Release-prep and label PRs use the commit subject as
the title. The release→main PR uses the GitHub-default humanized branch name Release/vX.Y.x. Every PR body is a single line pointing at the flux2 minor release tracking issue: Part of: https://github.com/fluxcd/flux2/issues/NNNN.
- Do not declare the release done until every step below has run, including
the final backport label PR (step 11). Tagging and merging to main are not the last step. Walk the numbered steps and confirm each one ran before reporting completion.
Preconditions
- Read the upstream procedure at
website/content/en/flux/releases/procedure.md,
section Controllers: minor releases (https://fluxcd.io/flux/releases/procedure/#controllers-minor-releases).
- Identify the flux2 minor-release tracking issue so PR bodies can reference it
(Part of: https://github.com/fluxcd/flux2/issues/NNNN).
- Use
dateto get the release date for the changelog entry. git fetch --all --tags --prunebefore reasoning about branches, tags, or
merged PRs. Do not trust stale local origin/* refs.
- Treat
gitandghcommands as confirmation points if the user wants that.
Release Flow
For the controller being released (target version vX.Y.0):
- Create the release series branch from
mainand push it.mainmust already
contain every API bump this controller needs (see "Release order across controllers").
git switch -c release/vX.Y.x maingit push origin release/vX.Y.x
- Create the release preparation branch from the series branch.
git switch -c release-vX.Y.0 release/vX.Y.x
- Draft the new
CHANGELOG.mdentry (see "How To Build The Changelog Entry").
Then commit it.
git add CHANGELOG.mdgit commit -s -m "Add changelog entry for vX.Y.0"
- Apply the release version bump exactly as documented.
- Update the controller self-API version in the root
go.modtovX.Y.0.
Inspect the actual go.mod; do not assume the self-API path form (source-watcher uses github.com/fluxcd/source-watcher/api/v2).
- Update
config/manager/kustomization.yamlnewTagtovX.Y.0. git add go.mod config/manager/kustomization.yamlgit commit -s -m "Release vX.Y.0"
- Push the release preparation branch.
git push origin release-vX.Y.0
- Open and merge the release PR into the release series branch.
- Base:
release/vX.Y.xHead:release-vX.Y.0 - Title
Release vX.Y.0, bodyPart of: <tracking issue URL>. - Merge when CI is green and a maintainer has approved.
- Refresh the release series branch after the merge.
git switch release/vX.Y.xgit pull origin release/vX.Y.x- Confirm both version refs are
vX.Y.0on the merged commit before tagging.
- Create and push signed tags from the updated release series branch. Push the
api/ tag first — the release tag depends on it.
git tag -s -m "api/vX.Y.0" api/vX.Y.0git push origin api/vX.Y.0git tag -s -m "vX.Y.0" vX.Y.0git push origin vX.Y.0
- Verify the release workflow triggered by the
vX.Y.0tag. Watch it in the
background until it concludes successfully (images published + signed, SBOM, SLSA provenance, GitHub release created).
- Merge the release series branch into
mainvia PR. This merges the whole
branch (changelog + version bump), not a cherry-pick.
- Base:
mainHead:release/vX.Y.x - Leave the title at the GitHub default — the humanized branch name
Release/vX.Y.x. Body Part of: <tracking issue URL>.
- Merge when CI is green and approved.
- Last: open the backport label PR against
main. Do this only after
step 10 has merged.
git switch maingit pull origin maingit switch -c label-X.Y main- Append to
.github/labels.yaml, after the previousbackport:entry:
```yaml
- name: backport:release/vX.Y.x
description: To be backported to release/vX.Y.x color: '#ffd700' ```
git add .github/labels.yamlgit commit -s -m "Add backport:release/vX.Y.x label"git push origin label-X.Y- Open PR (base
main, titleAdd backport:release/vX.Y.x label, body
Part of: <tracking issue URL>) and merge when green.
- Why last: the label branch is cut from
main. If you open it before
step 10 merges, that merge moves main forward and the label PR must then be rebased onto the new main and force-pushed (git rebase main + git push --force-with-lease). Opening it last avoids the rebase entirely.
How To Build The Changelog Entry
A minor changelog entry summarizes what is new in vX.Y.0 relative to the whole vX.(Y-1) line — not every commit since the previous minor. The hard part is selecting exactly the right PRs.
Selecting the PRs (do this rigorously — do not infer from commit messages)
- Establish the candidate set: PRs merged to
mainsince the previous minor
(v(X).(Y-1).0).
- From merge commits:
git log --merges --grep="Merge pull request" v(X).(Y-1).0..release/vX.Y.x and extract the #NNNN.
- Cross-check against
ghso squash/rebase merges are not missed:
gh pr list --base main --state merged --limit 200 --json number,mergedAt,title filtered to merges after the previous minor's release timestamp.
- Verify every candidate PR via `gh pr view <n> -R fluxcd/<repo> --json number,baseRefName,state,mergedAt,title`.
Keep only PRs that are MERGED and have baseRefName == main. Use the PR title from GitHub, never the local merge-commit subject (these drift; e.g. a commit may say one thing while the PR title says another).
- Exclude PRs already shipped in a patch release of the previous minor
(anything > v(X).(Y-1).0 and < vX.Y.0). Read the ## (X).(Y-1).Z patch sections already in CHANGELOG.md and drop any candidate whose change shipped there. Note the patch changelogs cite the cherry-pick PR numbers (against release/v(X).(Y-1).x), which differ from the original main PR numbers — match by change, not by number.
- Exclude release mechanics PRs: changelog cherry-pick/"Add changelog entry"
PRs, the previous release's Release/v(X).(Y-1).x merge-back, and label PRs.
- Collapse routine dependency bumps (fluxcd/pkg, CI actions, k8s/Go bumps whose
content already shipped in a patch) into a single Various dependency updates bullet listing each PR link. Keep genuinely user-facing items as their own bullets. See "Dependency update PRs" below before settling for a generic line.
Writing the entry
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckinginternal/skills/flux-controller-minor-releases/SKILL.md
Popularity
- Repository stars
- 239
- Repository forks
- 13
- 7-day trend score
- 26
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/fluxcd/agent-skills/flux-controller-minor-releases)