JFrog publishing was removed entirely in v2.1.4. Every artefact now
publishes to the OSS registry stack: GHCR, crates.io, PyPI, npm,
GitHub Releases, and Cloudflare R2 (downloads.hyperi.io).
If your .hyperi-ci.yaml still has publish.target: internal or
publish.target: both: leave it. The field is read for backward
compatibility and silently routed to OSS. There is no JFrog code path
left to enable. New projects should set target: oss (or omit the
field — oss is the default).
The only remaining toggle for full open-source visibility is making the source repos themselves public on GitHub.
v2 introduces the version-first single-run pipeline and tag-on-publish semantics. The biggest user-visible changes:
| Concept | v1 | v2 |
|---|---|---|
| Push triggers release | Every fix:/feat: push tags a version |
Push is validate-only by default |
| Release trigger | hyperi-ci release vX.Y.Z (separate dispatch) |
hyperi-ci push --publish (single CI run) |
| Tag semantics | Tags accumulate; some published, some not | Tag = "this artefact is in a registry" |
| Build runs per release | 2 (push run + dispatch run) | 1 |
| Version stamping | Post-build (binary lags one release) | Pre-build (binary embeds correct version) |
Default publish.target |
internal (JFrog) |
oss (FOSS); JFrog removed in v2.1.4 |
-
Update
.hyperi-ci.yaml—targetno longer matters (JFrog was removed in v2.1.4 and every value routes to OSS), but you can flip toossfor clarity:publish: target: oss # was: internal or both — both still accepted, both go to OSS
-
Bump
hyperi-cito >= 2.0.0 in any local install:uv tool upgrade hyperi-ci
-
Update reusable workflow ref in your
.github/workflows/ci.yml:uses: hyperi-io/hyperi-ci/.github/workflows/rust-ci.yml@main
If you previously pinned to a specific SHA, switch to
@mainso you pick up future workflow patches automatically. -
Adopt the new release flow:
- Drop
hyperi-ci release vX.Y.Z(still works as a deprecated alias) for routine releases. - Use
hyperi-ci push --publishinstead — it amends your commit with thePublish: truetrailer and triggers a single CI run that tags + publishes. - For forced bumps when commits aren't release-worthy (docs-only,
refactor-only, force-rebuild): use
hyperi-ci push --bump-patchor--bump-minor. Adds a realfix(release):/feat(release):marker commit (with VERSION write) that semantic-release picks up and that won't be filtered by consumerpaths-ignore. Major bumps are deliberately excluded — they require a human-written breaking- change footer. - Use
hyperi-ci publish vX.Y.Z(canonical) for retroactive re-publishes against existing tags.
- Drop
- No code changes. All Python source is unchanged.
- No
.releaserc.yamlchanges. Same semantic-release config. - No
Cargo.toml/pyproject.tomlchanges. Version stamping happens transparently at build time on publish runs. - Existing tags are unchanged. Old "orphan" tags from v1 stay in git history. New tags from your first v2 publish onwards follow the tag-on-publish contract.
- PR → merge to main: a normal merge is now validate-only (no
tag, no publish). Add
Publish: trueto your final commit in the PR (or merge then runhyperi-ci push --publishwith an empty marker commit) to ship. - Release on main with no
fix:/feat:: setup hard-fails — thePublish: truetrailer requires at least one release-worthy commit since the last tag. Add afix:/feat:commit, or remove the trailer. - JFrog removed in v2.1.4: the
internalandbothtarget values are still accepted in.hyperi-ci.yamlbut ignored — every publish goes to the OSS registry stack. No action required for projects already usingtarget: oss.
The migration from the old release-branch model to single-versioning on main with dispatch-triggered publishing. Kept for reference; new projects should follow v2 directly.
- No more release branch. Versions are determined on
mainby semantic-release. - Publishing is triggered manually via
hyperi-ci release <tag>(workflow_dispatch). - Commit messages are now validated (conventional commits enforced).
- Version numbers are real (e.g.
1.5.1), not prerelease (1.5.1-dev.3).
If the project doesn't have one, run:
hyperi-ci initIf it already has one, update it:
- Change
branches:to just- main(removerelease, removeprerelease: dev) - Remove
@semantic-release/githubfrom the plugins list - Add all missing commit types to releaseRules
Use hyperi-ci's own .releaserc.yaml as the reference template.
- Remove
releasefromon.push.branchesif listed explicitly - Keep
workflow_dispatch:(add it if missing) - The reusable workflow handles the new dispatch-triggered publish internally
Check the latest GA tag (not -dev.N):
gh api repos/hyperi-io/<REPO>/tags --jq '.[0:5] | .[].name'Update VERSION to match the latest GA version. Also update the language
manifest if applicable:
- Rust:
Cargo.tomlversion field - Python:
pyproject.tomlversion field - TypeScript:
package.jsonversion field
The GA tags were created on the release branch. Semantic-release on main needs to see them. Force-push the latest GA tag to point at your commit on main:
git tag -f v<LATEST_GA_VERSION> HEAD
git push origin v<LATEST_GA_VERSION> --forceThis tells semantic-release "start counting from here".
git config core.hooksPath .githooksThis activates the conventional-commits validator on every git commit.
Push your migration commits and let CI tag a version:
git push origin mainsemantic-release will create the next tag (e.g. v1.5.2) automatically.
Then publish it:
hyperi-ci publish v1.5.2 # was: hyperi-ci release v1.5.2