Skip to content

Commit cec8726

Browse files
committed
feat: add staging (pre-release) channel to download page
Surface beta/RC builds from the bucket's staging/ prefix on the Download page instead of requiring users to dig through the package browser, using the same fetch/sort/URL logic already wired for the stable and dev channels. Assisted-by: Claude Code:claude-sonnet-5
1 parent b5bc288 commit cec8726

3 files changed

Lines changed: 20 additions & 2 deletions

File tree

docs/administrator-manual/installation/download.mdx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ title: Download
33
sidebar_position: 2
44
---
55

6-
import {StableReleases, DevReleases, ImageVerifyCommand} from '@site/src/components/DownloadTable';
6+
import {StableReleases, StagingReleases, DevReleases, ImageVerifyCommand} from '@site/src/components/DownloadTable';
77

88
# Download {#download-section}
99

@@ -29,6 +29,12 @@ The tables below list the available releases along with their respective downloa
2929

3030
<StableReleases />
3131

32+
## Staging releases
33+
34+
Staging releases are pre-release builds shipped ahead of a stable release, such as beta and release candidate (RC) images. They are more stable than development builds but are not yet recommended for production use.
35+
36+
<StagingReleases />
37+
3238
## Development releases
3339

3440
<DevReleases />

src/components/DownloadTable/index.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ export function StableReleases(): ReactNode {
4141
return <ReleaseTable rows={data?.stable ?? []} />;
4242
}
4343

44+
export function StagingReleases(): ReactNode {
45+
const {data, loading, error} = useVersionData();
46+
if (loading) return <p>Loading releases…</p>;
47+
if (error) return <p>Could not load releases: {error}</p>;
48+
return <ReleaseTable rows={data?.staging ?? []} />;
49+
}
50+
4451
export function DevReleases(): ReactNode {
4552
const {data, loading, error} = useVersionData();
4653
if (loading) return <p>Loading releases…</p>;
@@ -57,6 +64,7 @@ const FALLBACK: VersionData = {
5764
imageNoGz: 'nethsecurity-<version>-x86-64-generic-squashfs-combined-efi.img',
5865
downloadUrl: '#',
5966
stable: [],
67+
staging: [],
6068
dev: [],
6169
};
6270

src/hooks/useVersionData.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export type VersionData = {
1717
imageNoGz: string;
1818
downloadUrl: string;
1919
stable: Release[];
20+
staging: Release[];
2021
dev: Release[];
2122
};
2223

@@ -140,18 +141,20 @@ export function useVersionData(): UseVersionDataResult {
140141

141142
async function load() {
142143
try {
143-
const [versionText, stableFolders, devFolders] = await Promise.all([
144+
const [versionText, stableFolders, stagingFolders, devFolders] = await Promise.all([
144145
// Degrade gracefully if latest_release has CORS issues.
145146
fetch(`${BASE_URL}/stable/latest_release`)
146147
.then((r) => (r.ok ? r.text() : ''))
147148
.catch(() => ''),
148149
collectReleases('stable'),
150+
collectReleases('staging'),
149151
collectReleases('dev'),
150152
]);
151153

152154
if (cancelled) return;
153155

154156
const stable = buildRows('stable', stableFolders);
157+
const staging = buildRows('staging', stagingFolders);
155158
const dev = buildRows('dev', devFolders);
156159
const version = versionText.trim() || (stable[0]?.version ?? '');
157160
const image = version ? imageName(version) : '';
@@ -162,6 +165,7 @@ export function useVersionData(): UseVersionDataResult {
162165
imageNoGz: image.replace(/\.gz$/, ''),
163166
downloadUrl: version ? makeImageUrl('stable', version) : '',
164167
stable,
168+
staging,
165169
dev,
166170
};
167171
_cache = result;

0 commit comments

Comments
 (0)