Skip to content

feat: release trains with semantic versioning and COPR RPM builds - #163

Merged
grafuls merged 3 commits into
quadsproject:developmentfrom
sadsfae:smtc_rpm_pkg
Sep 29, 2026
Merged

grafuls merged 3 commits into
quadsproject:developmentfrom
sadsfae:smtc_rpm_pkg

Conversation

@sadsfae

@sadsfae sadsfae commented Sep 25, 2026

Copy link
Copy Markdown
Contributor

Implements #162.

What this adds

  • Two release trains via python-semantic-release 10.6.2:
    • main -> stable vX.Y.Z releases + COPR quadsdev/qiip (RPM qiip)
    • development -> vX.Y.Z-dev.N prereleases + COPR quadsdev/qiip-dev (RPM qiip-dev, Conflicts: qiip)
    • Only feat:/fix:/perf: commits bump; chore:/docs: and markdown-only changes never release. First release v0.1.0. PSR maintains CHANGELOG.md.
  • .github/workflows/release.yml: code-change gate, semantic job (tag + GitHub release), COPR submit job on merge only, fork-guarded.
  • rpm/: noarch spec template + Makefile (version from pyproject, sanitized for RPM) + RPM systemd unit. Ships the gateway, node engine bundles (/usr/share/qiip), config examples (/etc/qiip/conf), nginx bundle (Requires: nginx >= 1.25.1, nginx.conf + gen-cert.sh), writable data at /var/lib/qiip.
  • copr-deps/: six pinned system RPMs (structlog, huggingface-hub, fastapi, etcd3gw, uvicorn, click) published once to quadsdev/qiip-deps via a manual-dispatch workflow; users never build anything. hf-xet deliberately filtered (no Fedora provider; QIIP is download-only).
  • Docs/badges: README RPM installation section (Python 3.14 note), COPR + release + dev release badges, docs/releases.md, nginx/nginx.md bundled paths, UPGRADING.md migration.

Why Fedora 43/44 only

Verified against Fedora/EPEL/AL10 repo metadata: EL10/Alma10 are missing several deps (structlog, etcd3gw, httpx-sse, huggingface-hub) and ship fastapi/pydantic/uvicorn/pydantic-settings below our floors; Fedora 45's default python3 is 3.15.0~rc2 (outside requires-python <3.15). requires-python is now >=3.12,<3.15 (suite passes on 3.14); uvicorn[standard] reduced to uvicorn (no extra usage).

Testing

  • Full suite: 2865 passed on the branch (1 local-env failure: local uv 0.12.9 vs pinned 0.12.17).
  • Suite green on Python 3.14 with the exact Fedora 43 dependency versions plus the five pinned deps.
  • qiip and qiip-dev: SRPM + binary RPM built in a Fedora 43 container; correct file list, auto python3.14dist(...) requires, Conflicts: qiip.
  • All six copr-deps RPMs build end-to-end.

COPR-side prerequisites (documented in README)

Create quadsdev/qiip-dev and quadsdev/qiip-deps, keep the COPR_API_TOKEN secret, build the deps once, chroots fedora-43/44 only with the qiip-deps repo enabled.

Add two release trains driven by python-semantic-release: stable vX.Y.Z
releases on main and vX.Y.Z-dev.N prereleases on development, each with a
GitHub release and an automated COPR RPM build (quadsdev/qiip and
quadsdev/qiip-dev). Code commits only; docs and markdown-only changes never
release. RPM packaging in rpm/ bundles nginx, the node engine bundles,
config examples, and a systemd unit; the quadsdev/qiip-deps project carries
the six pinned system RPMs QIIP needs beyond Fedora 43/44. README gains
COPR, release, and dev release badges plus installation docs; see
docs/releases.md.

    fixes: quadsproject#162

@ttlogan ttlogan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid release-train setup. The code-change gate, PSR config, and the Makefile pulling version from pyproject all hold together, and the two COPR trains with the Conflicts dance are clean.

One thing: the COPR dependencies workflow calls 'copr build' at the submit step but never installs copr-cli, so that job will fail with command not found on its first run. release.yml's tooling step does add copr-cli; the copr-deps one should too.

Comment thread .github/workflows/copr-deps.yml Outdated
The submit step calls 'copr build' but the tooling step never
installed copr-cli, so the job would fail on first run. Match the
tooling in release.yml.

    fixes: quadsproject#162

@ttlogan ttlogan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The copr-cli finding is resolved: the tooling install line in copr-deps.yml now includes copr-cli, matching release.yml, so the submit step's 'copr build' will find it. Confirmed the line in fb8196b. Looks good.

@grafuls grafuls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid release-train setup — the code-change gate, PSR config, and Makefile version handling all hold together. One note on the RPM-detection in nginx.md (inline).

Comment thread nginx/nginx.md Outdated
rpm -q qiip only matches the stable package, so a qiip-dev install
fell through to curl from main even though qiip-dev ships the same
/usr/share/qiip/nginx files. Test for the bundled files instead, and
use the packaged gen-cert.sh in the RPM rotation snippet.

@ttlogan ttlogan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified head 4b59012 against the code. One thing the earlier reviews didn't cover: the systemd unit's env wiring. INFERENCE_PROXY_AUTH__DB_PATH and INFERENCE_PROXY_PROVISIONING__LOG_DB_PATH both resolve through the nested-delimiter settings loader (env_prefix + __), and /var/lib/qiip matches the unit's DB paths, so an RPM install lands the sqlite files where the service actually reads them. Combined with the spec %files entries resolving to real buildroot paths and the git-archive prefix matching %autosetup, the packaging holds together. Both prior findings (copr-cli, nginx.md bundled-file detection) are fixed in this head.

@grafuls
grafuls merged commit e979511 into quadsproject:development Sep 29, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants