From 1d7fa6c4bfb5417c50747d04fb88ea4b89dfb62b Mon Sep 17 00:00:00 2001 From: rcourtman Date: Mon, 6 Jul 2026 16:50:59 +0100 Subject: [PATCH] Prepare v6.0.4 release --- VERSION | 2 +- deploy/helm/pulse/Chart.yaml | 8 ++--- deploy/helm/pulse/README.md | 2 +- docker-compose.yml | 2 +- docs/RELEASE_NOTES.md | 2 ++ docs/UPGRADE_v6.md | 2 ++ .../subsystems/deployment-installability.md | 23 +++++++------ docs/releases/RELEASE_NOTES_v6.0.4.md | 34 +++++++++++++++++++ docs/releases/V6_CHANGELOG_v6.0.4.md | 29 ++++++++++++++++ scripts/install-docker.sh | 2 +- .../installtests/build_release_assets_test.go | 3 +- .../installtests/install_docker_sh_test.go | 14 ++++++++ 12 files changed, 103 insertions(+), 20 deletions(-) create mode 100644 docs/releases/RELEASE_NOTES_v6.0.4.md create mode 100644 docs/releases/V6_CHANGELOG_v6.0.4.md diff --git a/VERSION b/VERSION index 037d97b2c..1aa5e414f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.0.4-rc.2 +6.0.4 diff --git a/deploy/helm/pulse/Chart.yaml b/deploy/helm/pulse/Chart.yaml index 0c08a5a84..c1c0f0758 100644 --- a/deploy/helm/pulse/Chart.yaml +++ b/deploy/helm/pulse/Chart.yaml @@ -2,9 +2,9 @@ apiVersion: v2 name: pulse description: Helm chart for deploying the Pulse hub and optional Docker monitoring agent. type: application -version: 6.0.4-rc.2 -appVersion: "6.0.4-rc.2" -icon: https://raw.githubusercontent.com/rcourtman/Pulse/v6.0.4-rc.2/docs/images/pulse-logo.svg +version: 6.0.4 +appVersion: "6.0.4" +icon: https://raw.githubusercontent.com/rcourtman/Pulse/v6.0.4/docs/images/pulse-logo.svg keywords: - monitoring - proxmox @@ -32,7 +32,7 @@ annotations: description: Smoke tests with kind cluster deployment artifacthub.io/links: | - name: Documentation - url: https://github.com/rcourtman/Pulse/blob/v6.0.4-rc.2/docs/KUBERNETES.md + url: https://github.com/rcourtman/Pulse/blob/v6.0.4/docs/KUBERNETES.md - name: Support url: https://github.com/rcourtman/Pulse/discussions artifacthub.io/maintainers: | diff --git a/deploy/helm/pulse/README.md b/deploy/helm/pulse/README.md index 4f49feb5c..add24ae67 100644 --- a/deploy/helm/pulse/README.md +++ b/deploy/helm/pulse/README.md @@ -1,6 +1,6 @@ # pulse -![Version: 6.0.4-rc.2](https://img.shields.io/badge/Version-6.0.4--rc.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 6.0.4-rc.2](https://img.shields.io/badge/AppVersion-6.0.4--rc.2-informational?style=flat-square) +![Version: 6.0.4](https://img.shields.io/badge/Version-6.0.4-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 6.0.4](https://img.shields.io/badge/AppVersion-6.0.4-informational?style=flat-square) Helm chart for deploying the Pulse hub and optional Docker monitoring agent. diff --git a/docker-compose.yml b/docker-compose.yml index 35bd3c26b..67f7d9e14 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.8' services: pulse: - image: ${PULSE_IMAGE:-rcourtman/pulse:6.0.4-rc.2} + image: ${PULSE_IMAGE:-rcourtman/pulse:6.0.4} container_name: pulse restart: unless-stopped logging: diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index ed8bcfbbc..7724ecf03 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -7,6 +7,8 @@ For historical v4 notes that previously lived in this repo, see: `docs/releases/RELEASE_NOTES_v4.md` For the current stable v6 patch packet, see: +- `docs/releases/RELEASE_NOTES_v6.0.4.md` +- `docs/releases/V6_CHANGELOG_v6.0.4.md` - `docs/releases/RELEASE_NOTES_v6.0.3.md` - `docs/releases/V6_CHANGELOG_v6.0.3.md` - `docs/releases/RELEASE_NOTES_v6.0.2.md` diff --git a/docs/UPGRADE_v6.md b/docs/UPGRADE_v6.md index 6afde744d..e8dfcd415 100644 --- a/docs/UPGRADE_v6.md +++ b/docs/UPGRADE_v6.md @@ -4,6 +4,8 @@ This guide covers practical upgrade steps for existing Pulse installs moving to For the current stable v6 packet and rollout references, see: +- `docs/releases/RELEASE_NOTES_v6.0.4.md` +- `docs/releases/V6_CHANGELOG_v6.0.4.md` - `docs/releases/RELEASE_NOTES_v6.0.3.md` - `docs/releases/V6_CHANGELOG_v6.0.3.md` - `docs/releases/RELEASE_NOTES_v6.md` diff --git a/docs/release-control/v6/internal/subsystems/deployment-installability.md b/docs/release-control/v6/internal/subsystems/deployment-installability.md index 4cd8a2c9c..67a1c07cd 100644 --- a/docs/release-control/v6/internal/subsystems/deployment-installability.md +++ b/docs/release-control/v6/internal/subsystems/deployment-installability.md @@ -807,13 +807,15 @@ TLS floor in the dynamic config. ## Current State -The active support prerelease `v6.0.4-rc.2` cut sets the repo-root `VERSION`, +The active stable `v6.0.4` cut sets the repo-root `VERSION`, repo-root `docker-compose.yml` image default, `scripts/install-docker.sh` -fallback, and Helm chart release metadata to the same `6.0.4-rc.2` release -version. This support prerelease uses the private Pro support image path with a -stable rollback reference `v6.0.3`, no `latest` movement, no stable semver tag -movement, no R2 manifest promotion, no broker download metadata promotion, and -no public `rcourtman/pulse` image publication. The initial GA promotion +fallback, and Helm chart release metadata to the same `6.0.4` release version. +This patch release uses the stable hotfix path with `rollback_version=v6.0.3`, +`hotfix_exception=true`, a release-owner reason, and no fabricated same-version +RC tag. It advances the v6.0.3 stable line with customer-support fixes for +audit log timestamp compatibility, remembered-login persistence, platform and +agent metric normalization, PBS/recovery memory retention, OIDC provider +persistence, and Docker/Proxmox platform metadata. The initial GA promotion metadata remains `promoted_from_tag=v6.0.0-rc.7`, `rollback_version=v5.1.35`, `ga_date=2026-07-04`, and `v5_eos_date=2026-10-02` for the first stable @@ -866,11 +868,10 @@ compose image default, standalone installer fallback constant, and packaged Helm metadata. A draft release workflow failure caused by stale image or chart pins is a release-packet blocker until the defaults, tests, and evidence record are refreshed from the new branch head. -For the active support prerelease `v6.0.4-rc.2` cut, the repo-root compose -default and `scripts/install-docker.sh` fallback must both pin `6.0.4-rc.2` -until the next governed stable cut moves them forward. The stable promotion -guard remains in force by rejecting leftover `-rc.` defaults when the governed -`VERSION` is a stable release. +For the active stable `v6.0.4` cut, the repo-root compose default and +`scripts/install-docker.sh` fallback must both pin `6.0.4`. The stable +promotion guard remains in force by rejecting leftover `-rc.` defaults when +the governed `VERSION` is a stable release. The RC7 packet refresh records `fc10de9b5477613316473267b72b05b6b2b7aaff` as the current validation-risk commit. That head includes the earlier Docker-default correction plus the follow-on capacity-forecast and Patrol diff --git a/docs/releases/RELEASE_NOTES_v6.0.4.md b/docs/releases/RELEASE_NOTES_v6.0.4.md new file mode 100644 index 000000000..7f762678d --- /dev/null +++ b/docs/releases/RELEASE_NOTES_v6.0.4.md @@ -0,0 +1,34 @@ +# Pulse v6.0.4 Release Notes + +`v6.0.4` is a stable patch release for the Pulse v6 line. It follows +`v6.0.3` and bundles support fixes for audit log compatibility, remembered +login state, agent update recovery, platform metrics, Docker metadata, and +PBS/recovery memory reporting. + +## Fixes + +- Fixed Audit Log reads when older SQLite rows contain Go wall-clock timestamp + strings with monotonic suffixes such as `m=+0.009025344`. These rows no + longer make `/api/audit` return `query_failed`. +- Fixed the login form so the "remember me" choice persists the username + correctly across reloads. +- Fixed v5-to-v6 agent update recovery for additional legacy and local-network + URL cases, including local DNS names that intentionally use HTTP. +- Fixed Proxmox, Docker, host-agent, and unified-resource metric normalization + so CPU percentages and live charts use the same canonical percent contract. +- Fixed PBS/recovery memory retention so backup and recovery rows keep memory + usage details instead of dropping them during read-state processing. +- Fixed Docker container metadata identity and empty Docker facet handling so + platform tabs and drawers keep the right container URLs and admission state. +- Fixed OIDC provider detail persistence so saved provider metadata survives + provider edit flows. +- Refreshed Docker, Helm, and installer release metadata for the stable patch + line. + +## Upgrade Notes + +Use the normal v6 install or update flow for `v6.0.4`. The rollback target for +this patch release is `v6.0.3`. + +Paid Pulse Pro, Relay, and eligible legacy customers should continue to use the +private download page and private runtime image for paid runtime features. diff --git a/docs/releases/V6_CHANGELOG_v6.0.4.md b/docs/releases/V6_CHANGELOG_v6.0.4.md new file mode 100644 index 000000000..d80887c44 --- /dev/null +++ b/docs/releases/V6_CHANGELOG_v6.0.4.md @@ -0,0 +1,29 @@ +# Pulse v6.0.4 + +_This changelog describes the stable `v6.0.4` patch release compared with +`v6.0.3`._ + +## Fixed + +- Audit Log now tolerates legacy SQLite timestamp rows that include Go + monotonic clock suffixes. +- Remembered-login state now persists the saved username when the checkbox is + enabled. +- Legacy agent update recovery now handles additional recovered state and local + HTTP URL cases. +- Platform CPU metrics, Proxmox live charts, Docker app-container percentages, + and unified-resource metric adapters now use the same canonical percent + contract. +- PBS and recovery backup rows now retain memory usage details through + read-state conversion. +- Docker container metadata now keeps canonical container URL identity, and + empty Docker facet tabs no longer enter the UI admission path incorrectly. +- OIDC provider detail edits now persist provider metadata. +- Docker, Helm, and installer release metadata now track the active stable + patch version. + +## Release Metadata + +- Version: `v6.0.4` +- Rollback target: `v6.0.3` +- Promotion path: stable patch hotfix from `main` diff --git a/scripts/install-docker.sh b/scripts/install-docker.sh index b3f1c7a86..79f8d8c6d 100755 --- a/scripts/install-docker.sh +++ b/scripts/install-docker.sh @@ -6,7 +6,7 @@ set -euo pipefail SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" DOCKER_IMAGE_REPO="${DOCKER_IMAGE_REPO:-rcourtman/pulse}" -CANONICAL_DEFAULT_PULSE_VERSION="6.0.4-rc.2" +CANONICAL_DEFAULT_PULSE_VERSION="6.0.4" resolve_default_pulse_version() { if [ -n "${PULSE_IMAGE_VERSION:-}" ]; then diff --git a/scripts/installtests/build_release_assets_test.go b/scripts/installtests/build_release_assets_test.go index 09eff6b4f..a4d9adfa9 100644 --- a/scripts/installtests/build_release_assets_test.go +++ b/scripts/installtests/build_release_assets_test.go @@ -253,6 +253,7 @@ func TestCurrentStablePatchReleasePacketTracksInstallMetadata(t *testing.T) { if !ok { t.Skip("current release is not a stable patch release") } + releaseBranch := requiredReleaseBranchForVersion(t, version) releaseNotesPath := repoFile("docs", "releases", "RELEASE_NOTES_v"+version+".md") changelogPath := repoFile("docs", "releases", "V6_CHANGELOG_v"+version+".md") @@ -265,7 +266,7 @@ func TestCurrentStablePatchReleasePacketTracksInstallMetadata(t *testing.T) { assertFileContainsAll(t, changelogPath, "Version: `v"+version+"`", "Rollback target: `v"+previous+"`", - "Promotion path: stable patch hotfix from `pulse/v6-release`", + "Promotion path: stable patch hotfix from `"+releaseBranch+"`", ) assertFileContainsAll(t, repoFile("docs", "RELEASE_NOTES.md"), "docs/releases/RELEASE_NOTES_v"+version+".md", diff --git a/scripts/installtests/install_docker_sh_test.go b/scripts/installtests/install_docker_sh_test.go index fc8860f66..a04cc7086 100644 --- a/scripts/installtests/install_docker_sh_test.go +++ b/scripts/installtests/install_docker_sh_test.go @@ -23,6 +23,20 @@ func currentReleaseVersion(t *testing.T) string { return version } +func requiredReleaseBranchForVersion(t *testing.T, version string) string { + t.Helper() + cmd := exec.Command("python3", repoFile("scripts", "release_control", "control_plane.py"), "--branch-for-version", version) + output, err := cmd.Output() + if err != nil { + t.Fatalf("resolve release branch for %s: %v", version, err) + } + branch := strings.TrimSpace(string(output)) + if branch == "" { + t.Fatalf("release branch for %s is empty", version) + } + return branch +} + func isPrereleaseVersion(version string) bool { return strings.Contains(version, "-") }