Build separate packages for each GPU generation instead of a single
cuda13 package:
- mistralrs-ampere (sm_86, RTX 3060)
- mistralrs-ada (sm_89, RTX 4090)
- mistralrs-blackwell (sm_120, RTX 5090)
All use the same CUDA 13.0 toolkit and features (cuda, cudnn, flash-attn,
nccl), varying only the compute capability target.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The fedora-43 base image now includes nodejs and npm, so the nvm runner
label and Node.js setup step are no longer needed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
The rpm-changelog action's repo-url input uses mktemp which fails on
runners with restricted /tmp permissions. Clone the upstream repo
directly in the workflow and use source-dir instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Drop Obsoletes/Provides for the old package name and update readme
and UI to use mistralrs-cuda13 consistently.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rename the RPM package from mistralrs-server-<flavour> to
mistralrs-<flavour> and the installed binary from mistralrs-server
to mistralrs, matching the upstream CLI binary name.
Adds Obsoletes/Provides for the old package name so dnf will cleanly
replace it on upgrade.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Build the mistralrs binary (CLI) instead of the deprecated
mistralrs-server. The RPM still installs as /usr/bin/mistralrs-server
for backwards compatibility. The systemd unit now invokes
`mistralrs-server serve` to use the CLI's serve subcommand.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add %pre scriptlet to ensure the mistralrs user and group exist
before the package files are installed. The systemd unit runs the
service as this user.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Drop the flavour-suffixed binary name, flavour-specific systemd unit
names, and update-alternatives machinery. Install a plain
mistralrs-server binary, a single mistralrs@.service template, and
a default.conf.example. Flavour coexistence was over-engineered for
the target audience.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Install the binary as /usr/bin/mistralrs-server-<flavour> using the
standard %{_bindir} macro. The update-alternatives system manages
the /usr/bin/mistralrs-server symlink as before. Removes the
non-standard /opt/mistralrs/<flavour>/bin/ directory structure.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Let the action use its default author rather than misattributing
upstream commits to the package maintainer.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set the rpm-changelog action author to the actual maintainer instead
of the default "Gitea Actions". Remove the static changelog entry
from the spec since the action generates entries automatically.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The binary's ELF headers cause rpm to auto-require exact soname
versions of CUDA libraries from the build host, forcing downgrades
on systems with newer compatible versions. Filter these out with
__requires_exclude so consumers can use any compatible CUDA install.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dnf config-manager cannot read from /dev/stdin as a repo file source.
Write the repo file directly with tee instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
createrepo_c on Fedora 43 uses zstd compression by default. Detect
the file extension and use zstdcat for .zst files, gzip for .gz.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The custom types block replaced all default MIME types, causing
index.html to be served as application/octet-stream. Include the
system mime.types and only add the custom .rpm type on top.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nginx config is managed by script/setup/nginx.sh, not CI. The
gitea_ci user doesn't have permissions to write to /etc/nginx.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
--archive includes -pogDt which tries to set permissions, ownership,
and timestamps on the root-owned web root directory. Only --recursive
and --links are needed for deploying static files.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The gitea_ci user cannot set timestamps on /var/www/rpm/ which is
owned by root. Directory timestamps are irrelevant for static files.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Installs nvm, Node.js LTS, and creates a stable symlink at
~/.nvm/default_bin for the systemd PATH so actions/checkout@v4
can find node without sourcing .bashrc.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Gitea Actions runs steps in a non-interactive shell that does not
source .bashrc. Use the explicit NVM_DIR path to load nvm.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Vite + React + SWC + TypeScript SPA with react-router and
react-bootstrap
- Dark/light/system theme with Bootstrap 5.3 data-bs-theme
- Home page with repo setup instructions and copyable code blocks
- Package list and detail pages driven by packages.json
- Python script to generate packages.json from repodata XML
- Nginx config updated for SPA fallback, asset caching, removed
autoindex
- New deploy-ui workflow triggered on ui/ or nginx config changes,
requires runners with nvm label
- packages.json generation added to publish job after createrepo_c
- Runner setup docs for nvm and sequoia-sq added to readme
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use actions/rpm-changelog@v1 with repo-url to collect commits from
the upstream mistral.rs repo between release tags and prepend a
changelog entry to the spec file before building the RPM.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The linker needs LIBRARY_PATH to find -lcudnn at link time.
LD_LIBRARY_PATH only affects runtime library loading.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The RPM file existing on the server is not sufficient — the repo
metadata must also reference it. After checking the file exists,
verify repomd.xml is present and dnf repoquery can find the package
in the index. This catches the case where sync succeeded but
createrepo_c failed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Set RPM_REPO_HOST=oolon.kosherinata.internal as a plain env var
instead of treating the hostname as a secret via RSYNC_TARGET
- Add explicit SSH connectivity test step using StrictHostKeyChecking=accept-new
- Remove ssh-keyscan in favour of accept-new which provides meaningful errors
- Remove RSYNC_TARGET secret dependency
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the monolithic publish-repo.sh with discrete workflow steps:
Sign RPMs, Set up SSH, Sync RPMs to repo, Update repo metadata.
Each step now has its own name in the CI UI, making failures
immediately identifiable. Removed 2>/dev/null from ssh-keyscan
which was silently hiding DNS resolution failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Disable set -e around rpm --addsign to prevent silent exits and
capture the actual exit code and error output.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
RPM 6 on Fedora 43 uses sequoia (sq) for signing instead of gpg.
Replace %_gpg_name with %_openpgp_sign_id and drop the gpg-agent
loopback config. Add a pre-flight check for sequoia-sq.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fedora 43 uses rpm-sequoia which does not expand %{__plaintext_filename}
or %{__signature_filename} from %__gpg_sign_cmd. Remove the override
and let rpm-sequoia read the gpg key directly. The key trust and
gpg-agent loopback config are already in place.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fedora 43 defaults to rpm-sequoia for signing which ignores the
imported gpg key. Set %__gpg_sign_cmd explicitly to force gpg-based
signing with loopback pinentry. Remove diagnostics.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Test gpg signing directly, dump macro expansion, and use rpmsign
with --verbose to get more detail.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GPG refuses to sign with a key that has unknown trust. Set the
imported key to ultimate trust after import.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dump rpmmacros, gpg keys, and file permissions before signing to
debug the silent failure.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Direct stdout/stderr capture may miss gpg subprocess output. Write
to a temp file and cat it on failure.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Capture stderr from rpm --addsign so the actual gpg error is visible
when signing fails.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The rpm keyring import needs root access which CI doesn't have.
Client-side verification on install is sufficient.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ensures package, publish, and poll-upstream jobs are picked up by
Fedora 43 runners specifically.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Import the GPG public key into rpm's keyring so rpm --checksig can
verify signatures. Also use --undefine dist before --define to ensure
the CLI value overrides the system macro on the build host.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The custom %__gpg_sign_cmd macro with %{__plaintext_filename} is not
supported on modern rpm. Instead, configure gpg-agent for loopback
pinentry and let rpm use its default sign command.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The heredoc with column-0 lines inside a YAML block scalar may
confuse Gitea's workflow parser. Move rpmmacros content to
rpm/rpmmacros as a template with sed substitution.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Gitea may not support matrix expressions in job-level concurrency
groups. The workflow-level concurrency group already prevents
parallel runs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>