RigForge follows Semantic Versioning. The current version is
tracked in VERSION and the history in CHANGELOG.md.
- MAJOR — incompatible
config.json/ CLI / behavior changes. - MINOR — new, backwards-compatible functionality.
- PATCH — backwards-compatible fixes.
From 1.0.0 on, the config.json and CLI surface is stable, so a breaking change bumps MAJOR. (Pre-1.0
0.x releases could break the interface between minor versions while it settled.)
Work lands on develop (the integration branch); a release is the point where develop is
promoted to main and tagged. The steps below build the release commit on develop, merge it to
main, and tag from main.
-
Ensure
developis green:make test(andmake test-e2eif Docker is available). -
Full real-hardware e2e (the release gate). CI exercises everything it can (lint, the dependency-free suite, the Docker
/etce2e, the coverage gate), but it can't compile XMRig, reserve HugePages, write MSRs, set the governor, or actually hash. So on a real Linux rig, run the genuine deploy end to end and assert each step:sudo bash tests/e2e-real.sh provision # real deps + XMRig build + tuning + kernel tuning + service sudo reboot # HugePages (1G + GRUB cmdline) take effect on boot; reconnect sudo bash tests/e2e-real.sh verify # doctor (HugePages/MSR/governor/service) + bench (real H/s) + a short tune + a live auto-tune pass sudo bash tests/e2e-real.sh teardown # uninstall + assert a clean revert
Each phase must report
E2E-REAL (<phase>): PASS. This is what proves a release bundle actually builds, tunes, and hashes on real hardware, which the suites can't since they all stub XMRig.- Put a real, reachable pool in
config.jsonfirst. Without one,setupwrites an unroutable placeholder andverifyfails the connect + share-submission round-trip. That round-trip is mandatory, since proving the rig really mines is the whole point of the gate. Pointpools[0].urlat a real low-difficulty pool you control (e.g. the stack's test pool). For a deliberate offline smoke run with no pool on hand, setE2E_ALLOW_OFFLINE_POOL=1to downgrade it to an explicit skip. - Quick subset:
make smoke(bench-only) is the fast version when you just need to confirm a built worker still hashes; the fulle2e-realflow above supersedes it for a real release. - Kept out of CI on purpose (a real build + HugePages + mining are flaky by nature and against Actions' ToS); it's a manual pre-tag gate the releaser runs.
- Put a real, reachable pool in
-
In
CHANGELOG.md, move the## [Unreleased]entries under a new## [X.Y.Z] - YYYY-MM-DDheading, then leave a fresh empty## [Unreleased]above it. -
Bump
VERSIONtoX.Y.Z. -
Commit the two together on
develop:git commit -am "release: vX.Y.Z" git push origin develop -
Promote
developtomain:git checkout main && git merge --ff-only develop && git push origin main
-
Tag and push from
main(annotated tag, matchingVERSION):git tag -a vX.Y.Z -m "RigForge vX.Y.Z" git push origin main --follow-tags
Pushing the tag triggers the release pipeline
(.github/workflows/release.yml), which:
- verifies the tag matches
VERSION(the build fails otherwise), - packages the deploy bundle (
rigforge.sh,util/,systemd/,config.json.template,config.advanced.example.json,README.md,docs/,images/,LICENSE,VERSION) asrigforge-vX.Y.Z.zipand.tar.gz(tests/,.github/, and other dev files are excluded), - generates
SHA256SUMSfor the artifacts, - pulls that version's section from
CHANGELOG.mdas the release notes, - creates the GitHub Release as a draft — review the generated notes and bundles, then click
Publish (pre-1.0
0.xtags are marked pre-release;1.0.0+ are full releases).
To verify a downloaded bundle: sha256sum -c SHA256SUMS.
The release is created as a draft so a human reviews it before it goes public, a deliberate gate for a tool that installs a root miner. Drop
--draftfromrelease.ymlto auto-publish on tag instead.
- Keep
VERSIONand the latestCHANGELOG.mdheading in lock-step; the test suite checksVERSIONis valid SemVer. VERSIONis also surfaced at runtime:rigforge.sh version(or--version/-v) reads it, so a release tag, the changelog heading, and what the script reports all stay in agreement.