Problem
The shared upload-nexus.yml publishes every deb into a single flagos-apt-hosted (one anonymous suite, Codename: flagos-apt-hosted, Architectures: amd64) and every rpm into the root of flagos-yum-hosted. That works while the only content is one package built on one base image, but FEP-0019 Wave 1 (flagos-ai/community#59) is about to publish packages for several distributions into it, and two of them are already incompatible with each other:
| package |
built on |
binary-compatible with |
libtriton-jit 0.1.0-1 (on Nexus today) |
ubuntu 24.04 / CUDA 12.6 / py3.12 |
24.04 only (glibc 2.38, libpython3.12) |
| libtriton_jit#61 output |
ubuntu 22.04 / CUDA 12.8 / py3.12 (FEP DEB matrix) |
22.04 and 24.04 |
| FlagTree deb (#607/#794) |
ubuntu 24.04 |
24.04 only — 22.04 fails on GLIBC_2.38 (FlagTree#798) |
| FlagCX / FlagSparse / FlagAttention rpm |
fedora 43 and openEuler 24.03 (.fc43 / .oe2403) |
one repodata would list both; dnf on openEuler sees fc43 packages with unsatisfiable deps |
python3-flag-* (Architecture: all) |
any |
any deb-based distro |
Native packages carry five ABI dimensions at once (glibc, libstdc++ CXX11 ABI, libpython3.X minor, CUDA major, torch version), so a flat repository cannot stay installable once more than one build target is published. For rpm the problem shows up as a single mixed repodata; for deb as one suite that silently mixes glibc floors.
How the same problem is handled elsewhere
Every vendor that ships packages linking distro libraries splits by distribution release: Docker CE (linux/ubuntu/dists/<codename>, linux/<centos|fedora|rocky>/<ver>/<arch>), NVIDIA CUDA (repos/ubuntu2204, debian13, rhel9, fedora43, kylin10, …), Microsoft (ubuntu/22.04/prod, rhel/9/prod), ROCm, PGDG. Only self-contained /opt stacks (Intel oneAPI, Chrome) use one repo for all.
What I'd like to discuss (needs a Nexus administrator — I only have upload rights)
- apt: one hosted repository per target distribution release, since a Nexus apt-hosted repo has exactly one distribution and apt has no group repos. Something like
flagos-apt-ubuntu2204, flagos-apt-ubuntu2404, flagos-apt-debian13, later openKylin / deepin codenames. Architecture: all Python packages would be uploaded to each of them (one line in sources.list per user, no cross-repo pinning).
- yum: keep one
flagos-yum-hosted but set Repodata Depth so that <distro>/<ver>/<arch>/ (e.g. openeuler/24.03/x86_64, fedora/43/x86_64, rocky/9/x86_64) each get their own repodata.
- How this composes with the existing per-vendor repositories (
flagos-apt-nvidia, flagos-apt-mthreads, flagos-pypi-<vendor>): vendor × distro (flagos-apt-nvidia-ubuntu2204), or vendor as a component inside a per-distro repo, or keep vendor repos for SDK mirrors only and put FlagOS packages under the distro axis. I don't have a strong preference; whichever matches how the vendor repos are meant to be used.
- Once the repositories exist, I'll update
upload-nexus.yml to route by build target — the build workflows already encode it in the artifact name / rpm %{?dist} (e.g. rpm-packages-rocky9-cuda1260, ubuntu2204-cuda1280, .oe2403) — and add a per-caller input for the deb suite. Until then, publishing into the flat repos is fine for Architecture: all packages and for one agreed native target, and wrong for anything else.
Related: artifacts in the component repositories expire after 7 days, so a tag whose upload failed cannot be re-published without rebuilding; worth aligning retention-days or uploading straight from the build job.
cc @tengqm — happy to write up whichever option you prefer and prepare the workflow change; the four repositories that will start publishing are wired in FlagAttention#53, FlagSparse#49, FlagTree#1063, FlagCX#561.
Problem
The shared
upload-nexus.ymlpublishes every deb into a singleflagos-apt-hosted(one anonymous suite,Codename: flagos-apt-hosted,Architectures: amd64) and every rpm into the root offlagos-yum-hosted. That works while the only content is one package built on one base image, but FEP-0019 Wave 1 (flagos-ai/community#59) is about to publish packages for several distributions into it, and two of them are already incompatible with each other:libtriton-jit 0.1.0-1(on Nexus today)GLIBC_2.38(FlagTree#798).fc43/.oe2403)dnfon openEuler sees fc43 packages with unsatisfiable depspython3-flag-*(Architecture: all)Native packages carry five ABI dimensions at once (glibc, libstdc++ CXX11 ABI, libpython3.X minor, CUDA major, torch version), so a flat repository cannot stay installable once more than one build target is published. For rpm the problem shows up as a single mixed
repodata; for deb as one suite that silently mixes glibc floors.How the same problem is handled elsewhere
Every vendor that ships packages linking distro libraries splits by distribution release: Docker CE (
linux/ubuntu/dists/<codename>,linux/<centos|fedora|rocky>/<ver>/<arch>), NVIDIA CUDA (repos/ubuntu2204,debian13,rhel9,fedora43,kylin10, …), Microsoft (ubuntu/22.04/prod,rhel/9/prod), ROCm, PGDG. Only self-contained/optstacks (Intel oneAPI, Chrome) use one repo for all.What I'd like to discuss (needs a Nexus administrator — I only have upload rights)
flagos-apt-ubuntu2204,flagos-apt-ubuntu2404,flagos-apt-debian13, later openKylin / deepin codenames.Architecture: allPython packages would be uploaded to each of them (one line insources.listper user, no cross-repo pinning).flagos-yum-hostedbut set Repodata Depth so that<distro>/<ver>/<arch>/(e.g.openeuler/24.03/x86_64,fedora/43/x86_64,rocky/9/x86_64) each get their ownrepodata.flagos-apt-nvidia,flagos-apt-mthreads,flagos-pypi-<vendor>): vendor × distro (flagos-apt-nvidia-ubuntu2204), or vendor as a component inside a per-distro repo, or keep vendor repos for SDK mirrors only and put FlagOS packages under the distro axis. I don't have a strong preference; whichever matches how the vendor repos are meant to be used.upload-nexus.ymlto route by build target — the build workflows already encode it in the artifact name / rpm%{?dist}(e.g.rpm-packages-rocky9-cuda1260,ubuntu2204-cuda1280,.oe2403) — and add a per-caller input for the deb suite. Until then, publishing into the flat repos is fine forArchitecture: allpackages and for one agreed native target, and wrong for anything else.Related: artifacts in the component repositories expire after 7 days, so a tag whose upload failed cannot be re-published without rebuilding; worth aligning
retention-daysor uploading straight from the build job.cc @tengqm — happy to write up whichever option you prefer and prepare the workflow change; the four repositories that will start publishing are wired in FlagAttention#53, FlagSparse#49, FlagTree#1063, FlagCX#561.