|
286 | 286 | expect(result.stdout).toContain("curl_count=7"); |
287 | 287 | }, 10_000); |
288 | 288 |
|
| 289 | + it("uses refreshed release metadata before pulling during update", () => { |
| 290 | + const script = ` |
| 291 | + set -Eeuo pipefail |
| 292 | + home="$(mktemp -d)" |
| 293 | + trap 'rm -rf "$home"' EXIT |
| 294 | + release_dir="$home/release" |
| 295 | + mkdir -p "$release_dir" "$home/bin" |
| 296 | + cat > "$release_dir/release.json" <<'JSON' |
| 297 | +{"image":"new-image","composeUrl":"docker-compose.image.yml","managerUrl":"subboost-manager"} |
| 298 | +JSON |
| 299 | + printf 'services:\\n app:\\n image: \${SUBBOOST_IMAGE}\\n' > "$release_dir/docker-compose.image.yml" |
| 300 | + printf '#!/usr/bin/env bash\\necho manager\\n' > "$release_dir/subboost-manager" |
| 301 | + cat > "$home/.env" <<ENV |
| 302 | +SUBBOOST_RELEASE_URL=file://$release_dir/release.json |
| 303 | +SUBBOOST_IMAGE=old-image |
| 304 | +POSTGRES_DB=subboost |
| 305 | +POSTGRES_USER=subboost |
| 306 | +POSTGRES_PASSWORD=password |
| 307 | +DATABASE_URL=postgresql://subboost:password@db:5432/subboost?schema=public |
| 308 | +ENCRYPTION_KEY=key |
| 309 | +JWT_SECRET=jwt |
| 310 | +CRON_SECRET=cron |
| 311 | +APP_URL=http://127.0.0.1:31000 |
| 312 | +SUBBOOST_PORT=31000 |
| 313 | +ENV |
| 314 | + : > "$home/docker-compose.yml" |
| 315 | + export SUBBOOST_SCRIPT_SOURCE_ONLY=1 |
| 316 | + export SUBBOOST_HOME="$home" |
| 317 | + export SUBBOOST_BIN="$home/bin/subboost" |
| 318 | + export SUBBOOST_DOCTOR_HEALTH_ATTEMPTS=1 |
| 319 | + export SUBBOOST_DOCTOR_HEALTH_INTERVAL_SECONDS=0 |
| 320 | + source local/scripts/subboost.sh |
| 321 | + sudo_do() { "$@"; } |
| 322 | + install_secret_file() { cp "$1" "$2"; } |
| 323 | + read_env_file() { cat "$ENV_FILE"; } |
| 324 | + docker_log="$home/docker-log" |
| 325 | + : > "$docker_log" |
| 326 | + docker() { |
| 327 | + if [ "$1" = "info" ]; then return 0; fi |
| 328 | + if [ "$1" = "compose" ]; then |
| 329 | + case "$*" in |
| 330 | + "compose version"*) return 0 ;; |
| 331 | + *" config") return 0 ;; |
| 332 | + *" pull") |
| 333 | + printf 'pull_image=%s\\n' "\${SUBBOOST_IMAGE:-}" >> "$docker_log" |
| 334 | + return 0 |
| 335 | + ;; |
| 336 | + *" up -d --remove-orphans") return 0 ;; |
| 337 | + *" up -d --no-deps --force-recreate app") return 0 ;; |
| 338 | + *" ps -q app") printf 'app-id\\n'; return 0 ;; |
| 339 | + *" ps -q db") printf 'db-id\\n'; return 0 ;; |
| 340 | + *" ps -q cron") printf 'cron-id\\n'; return 0 ;; |
| 341 | + esac |
| 342 | + fi |
| 343 | + if [ "$1" = "inspect" ]; then |
| 344 | + case "$*" in |
| 345 | + *".State.Status"*) printf 'running\\n'; return 0 ;; |
| 346 | + *".State.Health"*) printf 'healthy\\n'; return 0 ;; |
| 347 | + esac |
| 348 | + fi |
| 349 | + return 0 |
| 350 | + } |
| 351 | + curl() { return 0; } |
| 352 | + update_cmd |
| 353 | + cat "$docker_log" |
| 354 | + cat "$home/.env" |
| 355 | + `; |
| 356 | + |
| 357 | + const result = runBash(script); |
| 358 | + |
| 359 | + expect(result.status).toBe(0); |
| 360 | + expect(result.stdout).toContain("pull_image=new-image"); |
| 361 | + expect(result.stdout).toContain("SUBBOOST_IMAGE=new-image"); |
| 362 | + expect(result.stdout).toContain("SUBBOOST_COMPOSE_URL=file://"); |
| 363 | + expect(result.stdout).toContain("SUBBOOST_MANAGER_URL=file://"); |
| 364 | + }, 10_000); |
| 365 | + |
289 | 366 | it("updates exact env keys without removing similarly prefixed names", () => { |
290 | 367 | const script = ` |
291 | 368 | set -Eeuo pipefail |
|
0 commit comments