Skip to content

Commit fbb697d

Browse files
authored
Merge pull request #39 from SubBoost/ryan/dev
Fix selfhost update release source
2 parents a2773dd + e3b1623 commit fbb697d

5 files changed

Lines changed: 100 additions & 5 deletions

File tree

.github/workflows/dev-release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ jobs:
210210
--image-tag "${IMAGE_NAME}:dev" \
211211
--base-url "${dev_base_url}" \
212212
--installer-release-url "${dev_base_url}/release.json" \
213+
--installer-update-release-url "${dev_base_url}/release.json" \
213214
--installer-compose-url "${dev_base_url}/docker-compose.image.yml" \
214215
--installer-manager-url "${dev_base_url}/subboost-manager" \
215216
--installer-image "${IMAGE_NAME}:dev"

local/scripts/install.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ set -Eeuo pipefail
44
DEFAULT_HOME="/opt/subboost"
55
DEFAULT_BIN="/usr/local/bin/subboost"
66
DEFAULT_RELEASE_URL="https://github.com/SubBoost/subboost/releases/latest/download/release.json"
7+
DEFAULT_UPDATE_RELEASE_URL="https://github.com/SubBoost/subboost/releases/latest/download/release.json"
78
DEFAULT_COMPOSE_URL="https://github.com/SubBoost/subboost/releases/latest/download/docker-compose.image.yml"
89
DEFAULT_MANAGER_URL="https://github.com/SubBoost/subboost/releases/latest/download/subboost-manager"
910
DEFAULT_IMAGE="ghcr.io/subboost/subboost:latest"
1011

1112
SUBBOOST_HOME="${SUBBOOST_HOME:-$DEFAULT_HOME}"
1213
SUBBOOST_BIN="${SUBBOOST_BIN:-$DEFAULT_BIN}"
1314
SUBBOOST_RELEASE_URL="${SUBBOOST_RELEASE_URL:-$DEFAULT_RELEASE_URL}"
15+
SUBBOOST_UPDATE_RELEASE_URL="${SUBBOOST_UPDATE_RELEASE_URL:-$DEFAULT_UPDATE_RELEASE_URL}"
1416
SUBBOOST_ASSUME_YES="${SUBBOOST_ASSUME_YES:-0}"
1517
SUBBOOST_DRY_RUN="${SUBBOOST_DRY_RUN:-0}"
1618

@@ -563,6 +565,7 @@ main() {
563565
say "[dry-run] image=$image"
564566
say "[dry-run] composeUrl=$compose_url"
565567
say "[dry-run] managerUrl=$manager_url"
568+
say "[dry-run] updateReleaseUrl=$SUBBOOST_UPDATE_RELEASE_URL"
566569
exit 0
567570
fi
568571

@@ -576,7 +579,7 @@ main() {
576579
if [ -f "$ENV_FILE" ]; then existing_env="1"; fi
577580

578581
set_env_value SUBBOOST_IMAGE "$image"
579-
set_env_value SUBBOOST_RELEASE_URL "$SUBBOOST_RELEASE_URL"
582+
set_env_value SUBBOOST_RELEASE_URL "$SUBBOOST_UPDATE_RELEASE_URL"
580583
set_env_value SUBBOOST_COMPOSE_URL "$compose_url"
581584
set_env_value SUBBOOST_MANAGER_URL "$manager_url"
582585
ensure_env_value POSTGRES_DB "subboost"

local/scripts/selfhost-shell.test.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,83 @@ ENV
286286
expect(result.stdout).toContain("curl_count=7");
287287
}, 10_000);
288288

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+
289366
it("updates exact env keys without removing similarly prefixed names", () => {
290367
const script = `
291368
set -Eeuo pipefail

local/scripts/subboost.sh

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ write_env_value() {
131131
install_secret_file "$tmp" "$ENV_FILE"
132132
}
133133

134+
write_runtime_env_value() {
135+
local key="$1"
136+
local value="$2"
137+
write_env_value "$key" "$value"
138+
export "$key=$value"
139+
}
140+
134141
install_file_from_url() {
135142
local url="$1"
136143
local destination="$2"
@@ -278,14 +285,14 @@ update_cmd() {
278285
image="$(json_get image "$release_file" || true)"
279286
compose_url="$(resolve_url "$release_url" "$(json_get composeUrl "$release_file" || true)")"
280287
manager_url="$(resolve_url "$release_url" "$(json_get managerUrl "$release_file" || true)")"
281-
if [ -n "$image" ]; then write_env_value SUBBOOST_IMAGE "$image"; fi
288+
if [ -n "$image" ]; then write_runtime_env_value SUBBOOST_IMAGE "$image"; fi
282289
if [ -n "$compose_url" ]; then
283290
install_file_from_url "$compose_url" "$COMPOSE_FILE" 644
284-
write_env_value SUBBOOST_COMPOSE_URL "$compose_url"
291+
write_runtime_env_value SUBBOOST_COMPOSE_URL "$compose_url"
285292
fi
286293
if [ -n "$manager_url" ]; then
287294
install_file_from_url "$manager_url" "${SUBBOOST_BIN:-/usr/local/bin/subboost}" 755
288-
write_env_value SUBBOOST_MANAGER_URL "$manager_url"
295+
write_runtime_env_value SUBBOOST_MANAGER_URL "$manager_url"
289296
fi
290297
else
291298
say "Release manifest unavailable; updating current image and compose only."

scripts/selfhost-release-assets.cjs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ const INSTALLER_DEFAULTS = [
1414
name: "DEFAULT_RELEASE_URL",
1515
value: "https://github.com/SubBoost/subboost/releases/latest/download/release.json",
1616
},
17+
{
18+
arg: "--installer-update-release-url",
19+
env: "SUBBOOST_INSTALLER_UPDATE_RELEASE_URL",
20+
key: "installerUpdateReleaseUrl",
21+
name: "DEFAULT_UPDATE_RELEASE_URL",
22+
value: "https://github.com/SubBoost/subboost/releases/latest/download/release.json",
23+
},
1724
{
1825
arg: "--installer-compose-url",
1926
env: "SUBBOOST_INSTALLER_COMPOSE_URL",
@@ -40,7 +47,7 @@ const INSTALLER_DEFAULTS = [
4047
function usage() {
4148
return [
4249
"Usage:",
43-
" node scripts/selfhost-release-assets.cjs [--output <dir>] [--image <image>] [--image-tag <image>] [--base-url <url>] [--tag <vX.Y.Z>] [--build-sha <sha>] [--installer-release-url <url>] [--installer-compose-url <url>] [--installer-manager-url <url>] [--installer-image <image>] [--dry-run]",
50+
" node scripts/selfhost-release-assets.cjs [--output <dir>] [--image <image>] [--image-tag <image>] [--base-url <url>] [--tag <vX.Y.Z>] [--build-sha <sha>] [--installer-release-url <url>] [--installer-update-release-url <url>] [--installer-compose-url <url>] [--installer-manager-url <url>] [--installer-image <image>] [--dry-run]",
4451
"",
4552
"Creates release.json, install.sh, docker-compose.image.yml, and subboost-manager for GitHub Release assets.",
4653
].join("\n");

0 commit comments

Comments
 (0)