feat: add prerelease RPM builds from upstream main branch
Some checks failed
deploy-ui / build-and-deploy (push) Has been cancelled

Poll upstream main branch HEAD alongside release tags. When a new commit
is detected, build and publish prerelease RPMs to a separate unstable
repo at rpm.lair.cafe/fedora/$releasever/$basearch/unstable/.

RPM versioning uses the Fedora snapshot convention (e.g.
0.8.1-0.1.20260511git1a2b3c4.fc43) so stable releases automatically
supersede any installed prerelease.

- RPM spec: conditional Release field via mistralrs_prerelease define
- poll-upstream.yml: new check-prerelease job fetches main HEAD + Cargo.toml version
- build-prerelease.yml: new workflow for commit-based builds without --locked
- UI: fetch both stable/unstable manifests, show channel badges, add
  unstable repo setup instructions to home page

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-11 14:21:28 +03:00
parent fff56a626c
commit a79eafd70f
8 changed files with 423 additions and 25 deletions

View File

@@ -11,13 +11,13 @@ function formatBytes(bytes: number): string {
export function PackageDetail() {
const { name } = useParams<{ name: string }>();
const { manifest, loading, error } = usePackages();
const { packages, loading, error } = usePackages();
if (loading) return <Spinner animation="border" />;
if (error) return <Alert variant="danger">Failed to load packages: {error}</Alert>;
if (!manifest) return <Alert variant="info">No package data available.</Alert>;
if (packages.length === 0) return <Alert variant="info">No package data available.</Alert>;
const versions = manifest.packages
const versions = packages
.filter((p) => p.name === name)
.sort((a, b) => b.buildTime - a.buildTime);
@@ -25,6 +25,7 @@ export function PackageDetail() {
return <Alert variant="warning">Package not found: {name}</Alert>;
const latest = versions[0];
const hasUnstable = versions.some((v) => v.channel === "unstable");
return (
<>
@@ -33,6 +34,14 @@ export function PackageDetail() {
<CodeBlock language="bash">{`sudo dnf install ${name}`}</CodeBlock>
{hasUnstable && (
<div className="mt-3">
<CodeBlock language="bash">
{`# install latest unstable version\nsudo dnf --enablerepo=lair-cafe-unstable install ${name}`}
</CodeBlock>
</div>
)}
<h2 className="mt-4 mb-3">
Versions <Badge bg="secondary">{versions.length}</Badge>
</h2>
@@ -41,6 +50,7 @@ export function PackageDetail() {
<thead>
<tr>
<th>Version</th>
<th>Channel</th>
<th>Size</th>
<th>Built</th>
<th>Download</th>
@@ -48,14 +58,19 @@ export function PackageDetail() {
</thead>
<tbody>
{versions.map((pkg) => (
<tr key={`${pkg.version}-${pkg.release}`}>
<tr key={`${pkg.version}-${pkg.release}-${pkg.channel}`}>
<td>
{pkg.version}-{pkg.release}
</td>
<td>
<Badge bg={pkg.channel === "stable" ? "success" : "warning"}>
{pkg.channel}
</Badge>
</td>
<td>{formatBytes(pkg.size)}</td>
<td>{new Date(pkg.buildTime * 1000).toLocaleDateString()}</td>
<td>
<a href={`${manifest.baseUrl}/${pkg.rpmFilename}`}>
<a href={`${pkg.baseUrl}/${pkg.rpmFilename}`}>
{pkg.rpmFilename}
</a>
</td>