Repository navigation
Per-distribution uploads to prefix.dev and/or anaconda.org; humble off robostack-staging - #120
Open
Tobias-Fischer wants to merge 4 commits into
Open
Tobias-Fischer wants to merge 4 commits into
Tobias-Fischer wants to merge 4 commits into
Conversation
Each distribution's packages now go to its channel on both servers (same channel name): prefix.dev with trusted publishing as before, and anaconda.org with the ANACONDA_API_TOKEN secret that vinca-gha already passes to the build jobs (no longer stripped). rattler-build's anaconda upload has no --skip-existing, so files anaconda.org already has are skipped first, keeping re-runs idempotent. ROBOSTACK_UPLOAD_CHANNEL still sends uploads to one prefix.dev (test) channel only. distro.yaml's upload_target becomes read_from: it now only says where the builds look up what is already published (humble and jazzy keep reading from anaconda.org until their prefix.dev channels hold their packages). humble moves from robostack-staging to robostack-humble, so it no longer needs the hourly staging -> robostack-humble copy in robostack.github.io. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…and jazzy to anaconda.org [skip ci] distro.yaml gets upload_to (prefix and/or anaconda; both by default). As agreed with prefix.dev for now: lyrical and rolling upload to prefix.dev and anaconda.org, humble and jazzy to anaconda.org only (prefix.dev mirrors them). rs check validates the setting, and new distributions inherit it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each robostack-<distro> organization gets its own token: the repository secret ANACONDA_API_TOKEN_<DISTRO>. The generated build workflow of each distribution reads its own secret (instead of vinca-gha's secrets.ANACONDA_API_TOKEN) into ANACONDA_API_TOKEN, which the upload uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There's no access to the robostack-rolling organization on anaconda.org, so rolling keeps uploading to prefix.dev only (as now). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tobias-Fischer
marked this pull request as ready for review
October 20, 2026 10:05
Collaborator
Author
|
This is ready for review :) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Each distribution now uploads to its channel on the servers
upload_toin itsdistro.yamllists, with the same channel name on each. As agreed with prefix.dev for now:upload_toread_fromThis replaces the hourly
robostack-staging→robostack-humblecopy (copy-staging-packages.ymlin robostack.github.io) for humble, and is the step towards retiringrobostack-staging.What changes:
tools/robostack.pyupload():--skip-existing);rattler-build upload anaconda -o <channel>, using each distribution's own token: the repository secretANACONDA_API_TOKEN_<DISTRO>, which its generatedbuild.yamlpasses to the upload asANACONDA_API_TOKEN(vinca-gha'ssecrets.ANACONDA_API_TOKENis rewritten per distribution instead of stripped).--skip-existing, so files anaconda.org already has (checked throughapi.anaconda.org/dist/…) are skipped, which keeps re-runs idempotent.ROBOSTACK_UPLOAD_CHANNEL(test channel) still uploads to that one prefix.dev channel only, andnonestill skips uploads.distro.yaml:upload_tois new (default: both);upload_targetbecomesread_from(prefix|anaconda), which only says where the builds look up what's already published (skip-existing,released_builds, the stale check, the ABI check);channel_name: robostack-staging→robostack-humble.rs checkvalidates both keys, andnew-distrocopies them.test_upload.py(both servers, anaconda.org only, skip-existing on anaconda.org, the test-channel override, a missing token) andtest_generate_gha.py(each distribution's workflow uses its own secret).pixi run rs checkand the tool tests pass. Nothing was uploaded: the upload path hasn't run against the real channels yet, so the first post-merge build is its real test.Set up (done): the anaconda.org organization robostack-lyrical; the repository secrets
ANACONDA_API_TOKEN_HUMBLE,ANACONDA_API_TOKEN_JAZZYandANACONDA_API_TOKEN_LYRICAL(each its organization's token, scopeapi:write); prefix.dev Repository Access for this repository'sbuild.yamlon robostack-lyrical and robostack-rolling. rolling uploads to prefix.dev only, so it needs no anaconda.org token.After merging:
copy-staging-packages.ymlin robostack.github.io.upload_to/read_fromin theirdistro.yaml, once prefix.dev's mirrors of them become regular channels.Merge before the rosdistro syncs, at least before lyrical's (#60): its full rebuild then uploads every lyrical package to the new robostack-lyrical on anaconda.org too. Merged after it, those packages would already be on prefix.dev, the builds would skip them, and anaconda.org would only get later builds. The syncs then get a trivial conflict in
distro.yaml(this PR's channel lines next to their pinning line). CI is held with[skip ci]: this touches shared tooling, so a CI run would build every distribution.🤖 Generated with Claude Code