Skip to content

Refresh the action versions the workflows call - #111

Merged
indiebrain merged 2 commits into
masterfrom
2026-09-03--refresh-workflow-action-versions
Sep 4, 2026
Merged

Refresh the action versions the workflows call#111
indiebrain merged 2 commits into
masterfrom
2026-09-03--refresh-workflow-action-versions

Conversation

@indiebrain

@indiebrain indiebrain commented Sep 4, 2026

Copy link
Copy Markdown

What

GitHub retires the runtime that older action releases run on, and actionlint reports each call that has aged out. There were four:

File From To
ci.yaml (3 jobs) actions/checkout@v3 actions/checkout@v4
ci.yaml (3 jobs) actions/setup-go@v4 actions/setup-go@v5
helm.yml actions/checkout@v3 actions/checkout@v4
staleissues.yaml actions/stale@v8 actions/stale@v9

With nothing left that trips the rule, make lint-workflows drops the -ignore flag it carried, so an action that ages out from here on is reported on the pull request that would otherwise leave it in place.

Why the next major and not the newest

actions/checkout is at v7, actions/setup-go at v7, and actions/stale at v11. The next major clears the reports with the smallest behavior change, and in two cases it matches what the repository already does:

  • actions/checkout@v4 is the version the publish job in ci.yaml already calls, so this makes the file internally consistent.
  • actions/stale@v9 is the version stale.yml already pins by digest, and that file is managed by powerhome/software, so v9 is the version this organization has settled on.

Jumping several majors changes defaults (caching behavior in setup-go, and the stale bot's own defaults, which act on real issues and pull requests on a schedule). That is worth doing deliberately, on its own, rather than riding along with a lint fix.

Verification

actionlint reports nothing across all five workflow files with no rule excluded:

$ make lint-workflows
$ echo $?
0

Every input used at each call site is still valid at the new version. staleissues.yaml keeps its full set (days-before-issue-stale, days-before-issue-close, stale-issue-label, the two messages, days-before-pr-stale, days-before-pr-close, repo-token), and setup-go keeps go-version-file and cache.

@indiebrain
indiebrain requested a review from a team as a code owner September 4, 2026 01:33
Base automatically changed from 2026-09-03--fix-prune-untagged-images-workflow to master September 4, 2026 02:19
GitHub retires the runtime older action releases run on, and actionlint
reports each one that has aged out. Four calls were affected:
`actions/checkout@v3` in three files, `actions/setup-go@v4`, and
`actions/stale@v8`.

Move each to the next major, which clears the reports. `actions/stale@v9`
matches the pin `stale.yml` already carries, and `actions/checkout@v4` is
the version the publish job already calls, so both bring their files in
line with what the repository uses elsewhere. Newer majors exist for all
three; they are larger jumps with their own behavior changes and are
worth taking deliberately rather than alongside a lint fix.

With nothing left that trips the rule, `make lint-workflows` no longer
excludes it, so an action that ages out is reported on the pull request
that would otherwise leave it in place.
@indiebrain
indiebrain force-pushed the 2026-09-03--refresh-workflow-action-versions branch from 84936d8 to 64f0ad3 Compare September 4, 2026 02:20
@indiebrain
indiebrain enabled auto-merge (squash) September 4, 2026 11:32
@indiebrain
indiebrain merged commit b24c40f into master Sep 4, 2026
9 checks passed
@indiebrain
indiebrain deleted the 2026-09-03--refresh-workflow-action-versions branch September 4, 2026 11:34
@indiebrain indiebrain mentioned this pull request Sep 4, 2026
indiebrain added a commit that referenced this pull request Sep 4, 2026
Prepare the repository for release of version v4.6.0. Two files change:
`Makefile` sets the version the tag is cut from, and `CHANGELOG.md`
moves the `Unreleased` entries under a dated heading.

## Read this before upgrading

**A `RedisFailover` that has `auth.secretPath` set restarts once when
the operator is upgraded.** Its pod template gains a record of which
password it was built for, and that record is new. A failover with no
password is unaffected.

The Redis pods go together rather than one at a time, because a
restarted pod cannot replicate with one that has not restarted yet.
Expect a minute or two, a few tens of seconds of it without a master.

**This also reaches anyone tracking `latest`.** `docker/metadata-action`
runs with the default `flavor.latest=auto`, so a `v*` tag build moves
`latest`. Verified on the current release: `latest` and `v4.5.0` share
digest `sha256:013e238e59fe…`, and `latest` was written seven seconds
after `v4.5.0` in the same run and has not moved since. Publishing
v4.6.0 moves `latest` to it.

## This release ships

**Five fixes to behavior against a live cluster:**

- Removing the `haproxy` block from a `RedisFailover` now removes the
Deployment, Service and ConfigMap it created, instead of leaving a proxy
routing traffic from a configuration nothing would update again (#107).
- A Redis node that could not be inspected no longer counts as "not the
master", which could drive recovery into promoting a second master or
replacing a healthy one. A failed demotion no longer reports success
(#106).
- The HAProxy health check authenticates, so `auth.secretPath` is usable
at all. Without it every backend stayed `DOWN` and the master endpoint
had no backend (#98).
- The connected-replicas check authenticates, so the operator stops
killing a healthy master's replica connections on every reconcile under
`requirepass` (#102).
- A password change on a running `RedisFailover` is applied rather than
leaving Redis on the password it started with and the operator locked
out (#104).

**Supply chain and image:**

- Built with Go 1.25.14 with `golang.org/x/net` at v0.58.0, taking the
reachable vulnerability count to zero, and the base images pinned by
digest (#108).
- The image carries a Software Bill of Materials, and provenance moves
to `max` (#109).
- Published to `ghcr.io/powerhome` alongside Docker Hub (#93).

## What this does to the open issues

Referenced, not closed. Closing is left to a person once the claims are
true of a published artifact.

| Issue | State after this release |
| --- | --- |
| #99 (connected-replica check omits password) | Fixed by #102. |
| #101 (v4.5.0 image has fixable vulnerabilities) | Fixed by #108. The
issue reports against `v4.5.0`, which predates the fix, so it is only
true of an artifact once v4.6.0 is published. |
| #100 (no-quorum recovery can promote wrongly) | **Partially**
addressed by #106. `SetOldestAsMaster` still sorts candidates by pod
`CreationTimestamp` (`operator/redisfailover/service/heal.go:115`),
which #100's acceptance criteria rule out directly. No integration
coverage was added either: #106 records that the harness cannot induce
the selective inspection failure the issue's reproduction turns on. Do
not close it. |

## Changelog style

The entries collected for this release had grown to multi-paragraph
bodies running 88 lines. Every release entry from v4.5.0 back is a
single line naming the change and linking its pull request, in blocks of
five to eight lines.

These are reduced to one line each to match. The reasoning lives in the
linked pull requests, and the long form goes into the v4.6.0 GitHub
Release body, which is what line 8 of the changelog already points
readers to. The one thing a reader must not miss, the restart above, is
kept in the file as an upgrade note above the entries.

## A correction to the changelog

The changelog carried `## [v4.5.1] - 2026-08-18`. **No such release
exists**: no `v4.5.1` git tag, and no `v4.5.1` image on Docker Hub or in
the ghcr package. The heading was added by feature pull request #93
rather than by a release commit, and it is dated three days before #93
merged.

The heading is removed. This file lists releases, and a heading for a
version with no tag, no image and no release notes points a reader at
something they cannot go and get. The record that the claim was
retracted belongs in this repository's history, which carries it, rather
than in the file. The change it listed ships here.

## Not included

Workflow and continuous-integration changes (#95, #96, #110, #111, #112,
#113, #114) are left out, along with the `/etc/cni/net.d` setup-minikube
workaround that rode in on #93. They change no published artifact and no
operator behavior, and the GitHub Release auto-notes list every merged
pull request anyway.

## After this merges

Capture the squash commit rather than tagging `HEAD` — this repository
squash-merges, so the commit to tag does not exist until the merge and
is not the branch head:

```
sha=$(gh pr view 115 --json mergeCommit -q .mergeCommit.oid)
git fetch origin --tags
git show $sha:Makefile | head -1          # must read VERSION := v4.6.0
git tag -a v4.6.0 -m "v4.6.0" "$sha"
git push origin v4.6.0
```

Then, once the tag build is green:

```
gh release create v4.6.0 --title v4.6.0 --notes-file <the long-form notes>
```

Order matters: `gh release create` against a tag that does not exist yet
creates one from the default branch, which tags the wrong commit and
fires another build.

If the tag build fails, re-run the failed jobs. Do not delete and
re-push the tag: re-running is idempotent since the bases are
digest-pinned, while a deleted public `v*` tag also drops out of the
image prune workflow's `exclude-tags: 'v*'` protection.

## Verification

- `## Unreleased` is retained and empty, matching how v4.5.0, v4.4.1 and
v4.4.0 were cut.
- The v4.6.0 block is 24 lines against 5 to 8 for its neighbours, with
one `### Added`, one `### Changed`, one `### Fixed`. The previous
`Unreleased` section had two `Added` and two `Fixed` sections
interleaved.
- This will be the first semantic version image published to `ghcr.io`,
so the first real exercise of `exclude-tags: 'v*'` in the prune
workflow. Dry-run that workflow afterwards and confirm `v4.6.0` appears
in no deletion list.
- It is also the first tag build to carry a bill of materials, since
#109 landed after v4.5.0. Worth confirming rather than assuming:
`docker buildx imagetools inspect powerhome/redis-operator:v4.6.0
--format '{{ json .SBOM }}'`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants