diff --git a/.claude/skills/releasing-healthchat/SKILL.md b/.claude/skills/releasing-healthchat/SKILL.md index a7fe7bbd38..66e3a1cabc 100644 --- a/.claude/skills/releasing-healthchat/SKILL.md +++ b/.claude/skills/releasing-healthchat/SKILL.md @@ -53,7 +53,7 @@ separate, manual, and need no code change: | Component | Released by | Deployed by | | --- | --- | --- | | Web (ghcr.io image) | `healthchat-v*` tag push → `:latest` moves | `gh workflow run deploy.yml` on the ansible repo | -| Desktop (update feed) | `healthchat-v*` tag push → feed tarball on the Release | `gh workflow run deploy-healthchat-desktop.yaml` | +| Desktop (update feed) | `healthchat-v*` tag push → staged feed archive on packages.healthchat.ch | `gh workflow run deploy-healthchat-desktop.yaml` | Writing the desktop feed pushes an update to **every installed client**, so it is a deployment, not a publication step — hence the same manual gate as the server side. @@ -137,10 +137,16 @@ Actions UI. Publishing the image does **not** deploy it. Deployment is a separate manual dispatch against the ansible repo — but it needs **no code change anywhere**: the inventory pins `matrix_client_element_container_image` to -`ghcr.io/novaloop-ag/element-web/healthchat-web:latest`, and the ansible role pulls +`ghcr.io/novaloop-ag/healthchat-web/healthchat-web:latest`, and the ansible role pulls with `pull: always`, so it picks up whatever `:latest` now points at and restarts the container only if the digest actually moved. +The image path is derived from the repository name +(`format('{0}/healthchat-web', github.repository)`). Renaming the repository moves +the image to a new package and the old one stops receiving builds, so the inventory +pin must follow. This happened on 2026-07-29 when `element-web` became +`healthchat-web`; 1.7.0 was the first release that hit it. + Wait for the release workflow to go green first (the deploy pulls whatever is in the registry at that moment), then: @@ -170,7 +176,7 @@ gh workflow run deploy.yml \ --repo Novaloop-AG/matrix-docker-ansible-deploy \ --ref release/healthchat \ -f command="install-service client-element" \ - -f extra_args="-e matrix_client_element_container_image=ghcr.io/novaloop-ag/element-web/healthchat-web:1.5.0" + -f extra_args="-e matrix_client_element_container_image=ghcr.io/novaloop-ag/healthchat-web/healthchat-web:1.5.0" ``` Note this is a one-shot override: the *next* plain deploy returns to `:latest`. For a @@ -309,7 +315,7 @@ warning. Prefer fixing the changelog over relying on the fallback. ## After the release - [ ] Workflow run is green in GitHub Actions. -- [ ] `docker pull ghcr.io/novaloop-ag/element-web/healthchat-web:` succeeds. +- [ ] `docker pull ghcr.io/novaloop-ag/healthchat-web/healthchat-web:` succeeds. (Note the image path contains the repo segment — the workflow builds it as `format('{0}/healthchat-web', github.repository)`.) - [ ] GitHub Release exists at @@ -319,8 +325,8 @@ warning. Prefer fixing the changelog over relying on the fallback. `:`: ```bash - docker buildx imagetools inspect ghcr.io/novaloop-ag/element-web/healthchat-web:latest - docker buildx imagetools inspect ghcr.io/novaloop-ag/element-web/healthchat-web: + docker buildx imagetools inspect ghcr.io/novaloop-ag/healthchat-web/healthchat-web:latest + docker buildx imagetools inspect ghcr.io/novaloop-ag/healthchat-web/healthchat-web: ``` For an `-rc`/`-hotfix`/`-dryrun` tag the opposite is expected: `:latest` must diff --git a/CLAUDE.md b/CLAUDE.md index b0f5fc4622..fe764106cc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -133,4 +133,4 @@ Conventions unique to this fork that span multiple files: `pnpm link` is **not** used (it mutates `package.json`/lockfile). Instead, the `postinstall` hook runs `scripts/pnpm-link.ts`, which reads a `.link-config` file of `DEPENDENCY=PATH` lines and replaces those `node_modules` entries with symlinks. To develop against a local SDK, add a line like `matrix-js-sdk=/abs/path/to/matrix-js-sdk` to `.link-config` (not committed) and re-run `pnpm install`. ### Releasing HealthChat -Releases are cut by pushing a `healthchat-v` tag against `release/healthchat`, which triggers `.github/workflows/build-healthchat.yaml` (web) and `build-healthchat-desktop.yaml` (desktop). Release notes come from `HEALTHCHAT_CHANGES.md` (kept separate from upstream `CHANGELOG.md`); the healthchat-workspace plugin ref is pinned in `.healthchat-workspace-version`. The image is published to `ghcr.io/novaloop-ag/element-web/healthchat-web` as `:`, `:`, and `:latest` — where `:latest` moves **only** for a clean `X.Y.Z` tag push, never for `-rc`/`-hotfix` tags or manual dispatch runs. **Deploying is a separate manual step for both halves** and needs no version bump anywhere: the web side is a `gh workflow run deploy.yml` against the ansible repo (whose inventory tracks `:latest`), and the desktop side is `deploy-healthchat-desktop.yaml`, which publishes the update feed to healthchat.ch. Cutting a tag never pushes an update to installed desktop clients — `build-healthchat-desktop.yaml` only attaches a staged `healthchat-desktop-feed-.tar.gz` to the Release. Full runbook: `releasing-healthchat` skill. +Releases are cut by pushing a `healthchat-v` tag against `release/healthchat`, which triggers `.github/workflows/build-healthchat.yaml` (web) and `build-healthchat-desktop.yaml` (desktop). Release notes come from `HEALTHCHAT_CHANGES.md` (kept separate from upstream `CHANGELOG.md`); the healthchat-workspace plugin ref is pinned in `.healthchat-workspace-version`. The image is published to `ghcr.io/novaloop-ag/healthchat-web/healthchat-web` as `:`, `:`, and `:latest` — where `:latest` moves **only** for a clean `X.Y.Z` tag push, never for `-rc`/`-hotfix` tags or manual dispatch runs. **Deploying is a separate manual step for both halves** and needs no version bump anywhere: the web side is a `gh workflow run deploy.yml` against the ansible repo (whose inventory tracks `:latest`), and the desktop side is `deploy-healthchat-desktop.yaml`, which publishes the update feed to packages.healthchat.ch. Cutting a tag never pushes an update to installed desktop clients — `build-healthchat-desktop.yaml` only stages the feed archive at `packages.healthchat.ch/desktop-releases//`. Full runbook: `releasing-healthchat` skill.