From 71f79c8e02974fa2d29fb141af90880699b94ac8 Mon Sep 17 00:00:00 2001 From: Admin Date: Sat, 28 Mar 2026 21:49:52 +0500 Subject: [PATCH] feat(admin): bake changelog into UI image at CI build time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace runtime Gitea API fetch with fs.readFileSync of releases.json, which CI writes to ui/static/ before the Docker build context is sent. Eliminates prod→homelab network dependency for the changelog page. --- .gitea/workflows/release.yaml | 8 ++++++++ ui/.gitignore | 3 +++ ui/src/routes/admin/changelog/+page.server.ts | 19 +++++++++---------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index 903e626..f95db5e 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -190,6 +190,14 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Fetch releases from Gitea API + run: | + curl -sf \ + -H "Accept: application/json" \ + "http://gitea.kalekber.cc/api/v1/repos/kamil/libnovel/releases?limit=50&page=1" \ + -o ui/static/releases.json + echo "Fetched $(jq length ui/static/releases.json) releases" + - uses: docker/setup-buildx-action@v3 - name: Log in to Docker Hub diff --git a/ui/.gitignore b/ui/.gitignore index 3b462cb..f149927 100644 --- a/ui/.gitignore +++ b/ui/.gitignore @@ -21,3 +21,6 @@ Thumbs.db # Vite vite.config.js.timestamp-* vite.config.ts.timestamp-* + +# Generated by CI at build time — do not commit +/static/releases.json diff --git a/ui/src/routes/admin/changelog/+page.server.ts b/ui/src/routes/admin/changelog/+page.server.ts index a47ad03..eb3d604 100644 --- a/ui/src/routes/admin/changelog/+page.server.ts +++ b/ui/src/routes/admin/changelog/+page.server.ts @@ -1,3 +1,5 @@ +import { readFileSync } from 'fs'; +import { join } from 'path'; import type { PageServerLoad } from './$types'; export interface Release { @@ -10,17 +12,14 @@ export interface Release { draft: boolean; } -export const load: PageServerLoad = async ({ fetch }) => { +export const load: PageServerLoad = async () => { try { - const res = await fetch( - 'https://gitea.kalekber.cc/api/v1/repos/kamil/libnovel/releases?limit=50&page=1', - { headers: { Accept: 'application/json' } } - ); - if (!res.ok) throw new Error(`Gitea API returned ${res.status}`); - const releases: Release[] = await res.json(); - return { - releases: releases.filter((r) => !r.draft) - }; + // releases.json is baked into the image at build time by CI. + // SvelteKit Node adapter copies static/ → build/client/, so the file + // lives at /build/client/releases.json in production. + const raw = readFileSync(join(process.cwd(), 'build', 'client', 'releases.json'), 'utf-8'); + const releases: Release[] = JSON.parse(raw); + return { releases: releases.filter((r) => !r.draft) }; } catch (e) { return { releases: [], error: String(e) }; }