- New 'Build RPM package' step mirrors .github/workflows/package.yml
(fpm, same scripts/dependencies/config layout) but packs the locally
built nightly binary, with a date-based version that mirrors the DEB
(0 / 0.nightly.YYYY.MM.DD). Installs fpm only when absent.
- The RPM joins the DEB as a workflow artifact.
- New 'Publish packages to auto-testing assets' step pushes the deb/rpm
pair (plus rustfs-nightly-latest.{deb,rpm} aliases and a BUILD-INFO.md
with ref, sha, run link, sizes and sha256) to the auto-testing repo's
'assets' branch using PF_TESTING_GH_TOKEN. The branch is rewritten as
a single-commit orphan on every build so the repo stays small while
the latest files remain reachable at stable raw URLs. Skips cleanly
when the token is not configured.
The nightly channel was hardwired to the repository's default branch:
scheduled runs built whatever GITHUB_SHA pointed at, and the concurrency
group even had 'main' in its literal name. For the GA cycle the channel
needs to track the release branch instead, and back to main afterwards —
ideally without editing this file twice.
- Scheduled builds now follow the NIGHTLY_BRANCH repository variable,
falling back to main when the variable is unset or empty. Switching
the channel is a variable change, not a code change.
- workflow_dispatch gains a input for ad-hoc builds of any ref;
empty input falls back to the branch the run was dispatched from.
- All three jobs (build, publish, kms-vault-lane) check out
NIGHTLY_BUILD_REF explicitly so every lane builds the same tree.
- The publish step's candidate manifest advertised source_sha with a
hard equality check against GITHUB_SHA. Under a ref override that is
wrong by construction (schedule pins GITHUB_SHA to the default branch
at trigger time), so the manifest now always records the actual
checked-out HEAD.
- Concurrency group is branch-aware so a release-channel build and a
manual main build do not cancel each other.
* ci(nightly): persist the nightly deb on Cloudflare R2
Upload the deb to artifacts/rustfs/packages/nightly/ (dated name plus a
rustfs-nightly-latest.deb alias) through the same R2 channel package.yml
uses, so the nightly package can be downloaded later with a stable URL.
The step is skipped when the R2 secrets are not configured, keeping the
artifact-only mode intact.
* test: add pool expansion / decommission E2E script and workflow
Add the admin-API based pool expansion, rebalance and decommission test
script (scripts/test/rustfs_pool_expand.sh) plus a workflow_dispatch /
nightly workflow that runs it on a self-hosted runner against real nodes.
The workflow accepts a release tag or a direct .deb URL (e.g. nightly/R2
package) via the package_url input.
* ci(pool-test): run the pool expansion test on the smoke-testing runner
The nightly GNU build now also packages the release binary as
rustfs-nightly-<YYYY-MM-DD>.deb (Asia/Shanghai date, matching the schedule
timezone) and uploads it as a workflow artifact. Packaging mirrors
package.yml: DEBIAN control/conffiles and the systemd service from
deploy/build/, built with fakeroot dpkg-deb.
No workflow ever set RUSTFS_KMS_VAULT_TOKEN, so live_vault_backends() returned an empty set in every CI run and behavior_rotation.rs never asserted the working half of rotate/versioning; the #[ignore] live-Vault tests had never executed in CI either. nightly-gnu.yml gains a kms-vault-lane job (vault server -dev with KV2 + Transit, full rustfs-kms suite with the lane on, the dev-Vault ignored tests, and the AppRole live script) plus a separate kms-vault-ha-failover job for the three-node Raft failover script, isolated so an election-timing flake cannot mask the main lane's verdict. GitHub-hosted ubuntu-latest rather than the self-hosted fleet: the HA script needs Docker, and e2e-s3tests.yml's banner records how the heterogeneous sm-standard pods burned the last docker-dependent workflow.
The behavior harness now records every key TestKms::create_key mints and deletes them after each Vault-backed for_each_backend case, on a fresh manager over the same configuration with the immediate-deletion gate enabled for cleanup only. Transit needs the deletion issued twice (first call parks the key in PendingDeletion, the second destroys it); KV2 destroys on the first call. Verified against a real dev Vault: after a full suite run the server holds zero behavior-* keys.
Also fixes test_vault_cancel_key_deletion_persists_state, which was broken by construction — Default::default() never picks up the insecure-dev-defaults env override, so the HTTP dev Vault the test requires was always refused. It now declares development mode on the config, and passes.
Refs rustfs/backlog#1774, rustfs/backlog#1562.