Skip to content

Commit a04715a

Browse files
committed
fix(helm): track the app release in appVersion, and enforce it
appVersion sat at v0.8.18 while the app shipped through v0.8.24 -- six releases. Because the image tags default to Chart.AppVersion, a default `helm install` deployed the older Sim, and regenerating images.yaml here moved eleven lines, so the mirror inventory an air-gapped operator works from named the wrong images too. Publishing is what makes this serious. Cloning main got you whatever was there; a published chart version is immutable, so every stale appVersion would be frozen and installable forever. It was bumped by hand and nothing checked it, which is why it drifted. The publish job now refuses to publish when appVersion does not match the latest GitHub release, comparing against the release API rather than a hardcoded value so the check cannot go stale itself. Confirmed it fires on exactly the drift that existed (v0.8.18 vs v0.8.24) and passes now that it is fixed. Bumps appVersion to v0.8.24, regenerates images.yaml, and takes the chart to 1.9.5.
1 parent cde982d commit a04715a

8 files changed

Lines changed: 65 additions & 40 deletions

File tree

.github/workflows/helm.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,31 @@ jobs:
249249
echo "repository=ghcr.io/${GITHUB_REPOSITORY_OWNER}/charts/${name}"
250250
} >> "$GITHUB_OUTPUT"
251251
252+
# `appVersion` is what the image tags default to, so a stale one publishes
253+
# a chart that silently installs an old Sim -- and because published chart
254+
# versions are immutable, every stale value is frozen forever. It sat six
255+
# releases behind before this check existed, bumped only by hand.
256+
#
257+
# Compares against the latest GitHub release rather than a hardcoded value
258+
# so it cannot go stale itself. Prereleases and drafts are excluded: the
259+
# `/releases/latest` endpoint already returns neither.
260+
- name: appVersion tracks the latest app release
261+
env:
262+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
263+
run: |
264+
set -euo pipefail
265+
app_version=$(helm show chart helm/sim | awk '/^appVersion:/ {print $2}' | tr -d '"')
266+
latest=$(gh api "repos/${GITHUB_REPOSITORY}/releases/latest" --jq .tag_name)
267+
if [ -z "$latest" ]; then
268+
echo "::error::Could not resolve the latest release; refusing to publish unverified."
269+
exit 1
270+
fi
271+
if [ "$app_version" != "$latest" ]; then
272+
echo "::error::Chart.yaml appVersion is ${app_version} but the latest release is ${latest}. Bump appVersion (and the chart version) so the chart does not publish an install pinned to an older Sim."
273+
exit 1
274+
fi
275+
echo "appVersion ${app_version} matches the latest release."
276+
252277
# Chart versions are immutable once published: whoever pinned a version
253278
# must keep resolving the same bytes forever. The PR gate above already
254279
# forces a version bump on every chart change, so a version that is

apps/docs/content/docs/platform/self-hosting/environment-variables.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ Setting the variable to an empty string does **not** remove it: the chart reads
311311
Null the variable in every layer that sets it. If it appears in both `app.env` and `app.envDefaults`, nulling only the `app.env` entry lets the `envDefaults` value apply again and the limit stays in force. With External Secrets, also drop the key from `externalSecrets.remoteRefs.app`, which keeps syncing it independently. Confirm what the pod will actually receive before rolling out:
312312

313313
```bash
314-
helm template sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 -f values.yaml | grep -A1 FREE_TABLE # expect no output
314+
helm template sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.5 -f values.yaml | grep -A1 FREE_TABLE # expect no output
315315
```
316316

317317
`null` deletion has no effect under `helm upgrade --reuse-values` — pass your full values with `-f`, or use `--reset-then-reuse-values` (Helm 3.14+). If you deploy with Argo CD, put the `null` in `valueFiles` or the `values` string rather than `valuesObject`, which strips nulls. On Docker Compose, delete the line from your `.env` file.

apps/docs/content/docs/platform/self-hosting/kubernetes.mdx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ POSTGRES_PASSWORD=$(openssl rand -hex 24)
4040

4141
# Install
4242
helm install sim oci://ghcr.io/simstudioai/charts/sim \
43-
--version 1.9.4 \
43+
--version 1.9.5 \
4444
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
4545
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
4646
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
@@ -70,7 +70,7 @@ For clusters or GitOps configs that consume `helm repo add` rather than OCI:
7070
helm repo add sim https://charts.sim.ai
7171
helm repo update
7272

73-
helm install sim sim/sim --version 1.9.4 --namespace simstudio --create-namespace \
73+
helm install sim sim/sim --version 1.9.5 --namespace simstudio --create-namespace \
7474
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
7575
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
7676
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
@@ -87,11 +87,11 @@ apply to the OCI artifact only.
8787
Every published version is signed with Sigstore keyless signing and carries a SLSA build-provenance attestation. Both live in the registry alongside the chart, so they survive a mirror into an internal registry.
8888

8989
```bash
90-
cosign verify oci://ghcr.io/simstudioai/charts/sim:1.9.4 \
90+
cosign verify oci://ghcr.io/simstudioai/charts/sim:1.9.5 \
9191
--certificate-identity-regexp '^https://github.com/simstudioai/sim/' \
9292
--certificate-oidc-issuer https://token.actions.githubusercontent.com
9393

94-
gh attestation verify oci://ghcr.io/simstudioai/charts/sim:1.9.4 --repo simstudioai/sim
94+
gh attestation verify oci://ghcr.io/simstudioai/charts/sim:1.9.5 --repo simstudioai/sim
9595
```
9696

9797
Signing is Sigstore-only — there is no GPG `.prov` file, so `helm install --verify` does not apply.
@@ -112,7 +112,7 @@ SIM_RELEASE=v0.8.24
112112
curl -fsSLO "https://raw.githubusercontent.com/simstudioai/sim/$SIM_RELEASE/helm/sim/examples/values-aws.yaml"
113113

114114
helm upgrade --install sim oci://ghcr.io/simstudioai/charts/sim \
115-
--version 1.9.4 \
115+
--version 1.9.5 \
116116
--values values-aws.yaml \
117117
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
118118
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
@@ -233,7 +233,7 @@ kubectl port-forward deployment/sim-app 3000:3000 -n simstudio
233233
kubectl logs -l app.kubernetes.io/component=app -n simstudio --tail=100
234234
235235
# Upgrade (always pin the target chart version)
236-
helm upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --namespace simstudio
236+
helm upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.5 --namespace simstudio
237237
238238
# Uninstall
239239
helm uninstall sim --namespace simstudio

apps/docs/content/docs/platform/self-hosting/reference-architectures.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ resource "helm_release" "sim" {
152152
# release with new migrations.
153153
repository = "oci://ghcr.io/simstudioai/charts"
154154
chart = "sim"
155-
version = "1.9.4"
155+
version = "1.9.5"
156156
157157
# Or the classic repository, if your tooling does not speak OCI:
158158
# repository = "https://charts.sim.ai"

apps/docs/content/docs/platform/self-hosting/upgrades.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,15 @@ Migration surprises are usually data-shaped rather than schema-shaped, so a stag
157157

158158
```bash
159159
helm upgrade sim oci://ghcr.io/simstudioai/charts/sim \
160-
--version 1.9.4 \
160+
--version 1.9.5 \
161161
--namespace simstudio \
162162
--values my-values.yaml
163163
```
164164

165165
Preview first if the chart version changed:
166166

167167
```bash
168-
helm diff upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 -n simstudio --values my-values.yaml
168+
helm diff upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.5 -n simstudio --values my-values.yaml
169169
```
170170

171171
Then watch the rollout:

helm/sim/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ apiVersion: v2
22
name: sim
33
description: A Helm chart for Sim - the open-source AI workspace where teams build, deploy, and manage AI agents
44
type: application
5-
version: 1.9.4
6-
appVersion: "v0.8.18"
5+
version: 1.9.5
6+
appVersion: "v0.8.24"
77
kubeVersion: ">=1.25.0-0"
88
home: https://sim.ai
99
icon: https://raw.githubusercontent.com/simstudioai/sim/main/apps/sim/public/logo/primary/primary.svg

helm/sim/README.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -d '/+=')
2323

2424
# Install from the registry
2525
helm install sim oci://ghcr.io/simstudioai/charts/sim \
26-
--version 1.9.4 \
26+
--version 1.9.5 \
2727
--namespace sim --create-namespace \
2828
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
2929
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
@@ -107,10 +107,10 @@ immutable once published.
107107

108108
```bash
109109
# List the published versions
110-
helm show chart oci://ghcr.io/simstudioai/charts/sim --version 1.9.4
110+
helm show chart oci://ghcr.io/simstudioai/charts/sim --version 1.9.5
111111

112112
helm install sim oci://ghcr.io/simstudioai/charts/sim \
113-
--version 1.9.4 \
113+
--version 1.9.5 \
114114
--namespace sim --create-namespace \
115115
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
116116
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
@@ -127,8 +127,8 @@ To mirror the chart into an internal registry — the usual requirement for an
127127
air-gapped or internal-only cluster:
128128

129129
```bash
130-
helm pull oci://ghcr.io/simstudioai/charts/sim --version 1.9.4
131-
helm push sim-1.9.4.tgz oci://registry.internal.example.com/charts
130+
helm pull oci://ghcr.io/simstudioai/charts/sim --version 1.9.5
131+
helm push sim-1.9.5.tgz oci://registry.internal.example.com/charts
132132
```
133133

134134
The container images the chart references are listed in
@@ -144,7 +144,7 @@ helm repo add sim https://charts.sim.ai
144144
helm repo update
145145

146146
helm install sim sim/sim \
147-
--version 1.9.4 \
147+
--version 1.9.5 \
148148
--namespace sim --create-namespace \
149149
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
150150
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
@@ -177,18 +177,18 @@ otherwise identical.
177177

178178
```bash
179179
helm install sim oci://ghcr.io/simstudioai/charts/sim \
180-
--version 1.9.4 \
180+
--version 1.9.5 \
181181
--namespace sim --create-namespace \
182182
--values my-values.yaml
183183
```
184184

185-
Run `helm template oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --values my-values.yaml | less` first to
185+
Run `helm template oci://ghcr.io/simstudioai/charts/sim --version 1.9.5 --values my-values.yaml | less` first to
186186
see what will be applied.
187187

188188
### Validate the install
189189

190190
```bash
191-
helm install sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --dry-run --debug \
191+
helm install sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.5 --dry-run --debug \
192192
--values my-values.yaml \
193193
--set app.env.BETTER_AUTH_SECRET=$(openssl rand -hex 16) \
194194
--set app.env.ENCRYPTION_KEY=$(openssl rand -hex 16) \
@@ -207,12 +207,12 @@ the registry next to the chart so they survive a mirror.
207207

208208
```bash
209209
# The signature: proves this chart was signed by a GitHub Actions run in this repo
210-
cosign verify oci://ghcr.io/simstudioai/charts/sim:1.9.4 \
210+
cosign verify oci://ghcr.io/simstudioai/charts/sim:1.9.5 \
211211
--certificate-identity-regexp '^https://github.com/simstudioai/sim/' \
212212
--certificate-oidc-issuer https://token.actions.githubusercontent.com
213213

214214
# The provenance: proves which workflow, commit, and runner produced it
215-
gh attestation verify oci://ghcr.io/simstudioai/charts/sim:1.9.4 --repo simstudioai/sim
215+
gh attestation verify oci://ghcr.io/simstudioai/charts/sim:1.9.5 --repo simstudioai/sim
216216
```
217217

218218
There is no GPG `.prov` file — signing is Sigstore-only, so there is no
@@ -224,7 +224,7 @@ GPG provenance format and will not work; use `cosign verify` above.
224224
## Upgrading
225225

226226
```bash
227-
helm upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --namespace sim --values my-values.yaml
227+
helm upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.5 --namespace sim --values my-values.yaml
228228
```
229229

230230
---
@@ -276,7 +276,7 @@ SIM_RELEASE=v0.8.24
276276
curl -fsSLO "https://raw.githubusercontent.com/simstudioai/sim/$SIM_RELEASE/helm/sim/examples/values-production.yaml"
277277

278278
helm install sim oci://ghcr.io/simstudioai/charts/sim \
279-
--version 1.9.4 \
279+
--version 1.9.5 \
280280
--namespace sim --create-namespace \
281281
--values values-production.yaml \
282282
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
@@ -293,7 +293,7 @@ This chart is intentionally configurable. Rather than maintain a hand-curated pa
293293

294294
```bash
295295
# Print all values with comments and defaults
296-
helm show values oci://ghcr.io/simstudioai/charts/sim --version 1.9.4
296+
helm show values oci://ghcr.io/simstudioai/charts/sim --version 1.9.5
297297
```
298298

299299
The JSON Schema that `helm install` validates your values against ships inside
@@ -353,7 +353,7 @@ The chart supports three ways to provide secrets, in increasing order of product
353353
### 1. Inline `--set` (dev / dry-run only)
354354

355355
```bash
356-
helm install sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --set app.env.BETTER_AUTH_SECRET=...
356+
helm install sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.5 --set app.env.BETTER_AUTH_SECRET=...
357357
```
358358

359359
Discouraged for production — values land in `helm get values` output.
@@ -484,7 +484,7 @@ With the chart-managed Secret (the default), nulling a key the application canno
484484
The common case is a free-tier cap inherited from a chart release older than the one that stopped presetting them, which shipped `FREE_TABLES_LIMIT: "3"` and `FREE_TABLE_ROWS_LIMIT: "1000"` under `app.envDefaults`. With billing disabled, Sim reads an unset limit as unlimited, so nulling these lifts the cap. Verify before rolling out:
485485

486486
```bash
487-
helm template sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 -f values.yaml | grep -A1 FREE_TABLE # expect no output
487+
helm template sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.5 -f values.yaml | grep -A1 FREE_TABLE # expect no output
488488
```
489489

490490
---
@@ -552,7 +552,7 @@ Without a cluster-reachable `INTERNAL_API_BASE_URL` (it falls back to `NEXT_PUBL
552552
You ran `helm install` without setting required secrets. Generate them and pass with `--set`:
553553

554554
```bash
555-
helm install sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 \
555+
helm install sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.5 \
556556
--set app.env.BETTER_AUTH_SECRET=$(openssl rand -hex 32) \
557557
--set app.env.ENCRYPTION_KEY=$(openssl rand -hex 32) \
558558
--set app.env.INTERNAL_API_SECRET=$(openssl rand -hex 32) \

helm/sim/images.yaml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,22 @@
2222
# render it twice. That override also CHANGES where the chart pulls from, to
2323
# `<your-registry>/nvidia/k8s-device-plugin` — mirror the device plugin there
2424
# instead of to the `mirror` path listed below, or the pull fails.
25-
appVersion: v0.8.18
25+
appVersion: v0.8.24
2626
images:
2727
- source: busybox:1.36
2828
mirror: busybox:1.36
2929
- source: curlimages/curl:8.5.0
3030
mirror: curlimages/curl:8.5.0
31-
- source: ghcr.io/simstudioai/copilot:v0.8.18
32-
mirror: simstudioai/copilot:v0.8.18
33-
- source: ghcr.io/simstudioai/migrations:v0.8.18
34-
mirror: simstudioai/migrations:v0.8.18
35-
- source: ghcr.io/simstudioai/pii:v0.8.18
36-
mirror: simstudioai/pii:v0.8.18
37-
- source: ghcr.io/simstudioai/realtime:v0.8.18
38-
mirror: simstudioai/realtime:v0.8.18
39-
- source: ghcr.io/simstudioai/simstudio:v0.8.18
40-
mirror: simstudioai/simstudio:v0.8.18
31+
- source: ghcr.io/simstudioai/copilot:v0.8.24
32+
mirror: simstudioai/copilot:v0.8.24
33+
- source: ghcr.io/simstudioai/migrations:v0.8.24
34+
mirror: simstudioai/migrations:v0.8.24
35+
- source: ghcr.io/simstudioai/pii:v0.8.24
36+
mirror: simstudioai/pii:v0.8.24
37+
- source: ghcr.io/simstudioai/realtime:v0.8.24
38+
mirror: simstudioai/realtime:v0.8.24
39+
- source: ghcr.io/simstudioai/simstudio:v0.8.24
40+
mirror: simstudioai/simstudio:v0.8.24
4141
- source: nvcr.io/nvidia/k8s-device-plugin:v0.18.2
4242
mirror: nvcr.io/nvidia/k8s-device-plugin:v0.18.2
4343
- source: ollama/ollama:0.23.2

0 commit comments

Comments
 (0)