12 KiB
Release Packaging and Local Deployment
This document covers the current local release workflow for aria2-rust-pro.
The scripts under scripts/release/ cover three concrete needs:
- host-runnable
--versionsmoke validation; - deterministic local artifact naming plus SHA-256 generation;
- packaging of the current workspace's Windows or Linux release binary into a ready-to-share archive.
- exporting a locally built Docker image tag into a portable tar archive under
dist\docker\.
As of the Phase 3 Cargo-native workflow push, the primary entrypoints now live
in xtask/. The PowerShell files under scripts/release/ remain as thin
compatibility shims so existing local habits still work, but the canonical
project automation surface is now:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release smoke-version
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release package-local
rtk cargo run --manifest-path .\xtask\Cargo.toml -- docker smoke-local
rtk cargo run --manifest-path .\xtask\Cargo.toml -- docker smoke
These commands do not update progress.md or the compatibility ledger, and
they do not claim cross-host release certification by themselves. They are
local release helpers for the current workspace state.
Files
xtask/: canonical Cargo-native workflow entrypoints for release smoke and local packaging.scripts/release/smoke-version.ps1: thin shim aroundxtask release smoke-version.scripts/release/package-local.ps1: thin shim aroundxtask release package-local.scripts/docker/smoke-local.ps1: thin shim aroundxtask docker smoke-local.scripts/docker/smoke.ps1: thin shim aroundxtask docker smoke.scripts/docker/export-local.ps1: thin shim aroundxtask docker export-local.docs/release/RELEASE-NOTES-TEMPLATE.md: reusable release-page and handoff template for public-facing releases.
Artifact naming
The package script emits archives named like:
aria2-rust-pro-v1.0.0-x86_64-pc-windows-msvc.ziparia2-rust-pro-v1.0.0-x86_64-unknown-linux-gnu.tar.gz
The target triple always stays in the file name so mixed-host staging stays unambiguous.
Output defaults to the workspace-level dist area:
dist\release\v<version>\
Generated files per package run:
- the archive itself (
.zipon Windows targets,.tar.gzotherwise); <archive>.sha256;SHA256SUMS.txt;<artifact>.manifest.json.
Version smoke
From the repo root:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release smoke-version
pwsh ./scripts/release/smoke-version.ps1
Build first, then smoke:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release smoke-version --build
pwsh ./scripts/release/smoke-version.ps1 -Build
Smoke a specific binary:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release smoke-version --binary-path .\target\release\aria2-rust-pro.exe
pwsh ./scripts/release/smoke-version.ps1 -BinaryPath .\target\release\aria2-rust-pro.exe
The command succeeds only when the rendered banner keeps the upstream-compatible
first line aria2 version 1.37.0 and also contains
Rust rewrite package: aria2-rust-pro <workspace-version>.
Versioning and changelog
The workspace version in the root Cargo.toml is the source of truth. Release
tags must use vMAJOR.MINOR.PATCH and match that version. Preview the next
user-facing changelog entry with:
rtk git-cliff --config .\cliff.toml --unreleased
For a release tag, a checked-in docs/release/vX.Y.Z.md remains authoritative.
When it is absent, the release workflow generates the Gitea release body from
cliff.toml and the Conventional Commit history.
On an actual release tag, the release workflow compares each public workspace
crate against the preceding SemVer tag with cargo-semver-checks. The first
release tag has no predecessor and therefore skips that comparison.
Packaging the current host build
Build and package the host release binary:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release package-local --build
pwsh ./scripts/release/package-local.ps1 -Build
Package an already-built host binary without rebuilding:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release package-local
pwsh ./scripts/release/package-local.ps1
Write artifacts to a custom directory:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release package-local --build --output-root .\dist\release
pwsh ./scripts/release/package-local.ps1 -Build -OutputRoot .\dist\release
Packaging Windows and Linux artifacts from the current workspace
Windows host, Windows artifact
On the current Windows workspace, the default path uses:
target\release\aria2-rust-pro.exe- optional
target\release\aria2_rust_pro.pdb
The archive is a .zip containing the binary, optional PDB, root README.md,
and the release packaging guide under docs/release/README.md. Version-specific
release notes such as docs/release/v1.0.0.md are used as Gitea release body
text, not bundled into every archive by default.
Linux host, Linux artifact
On Linux with PowerShell 7 and Cargo available, the same script works:
pwsh ./scripts/release/package-local.ps1 -Build
The Linux archive format is .tar.gz, and the default packaged binary path is
target/release/aria2-rust-pro.
Cross-target handling from one workspace
When the binary already exists under a target-specific Cargo directory, pass the target triple:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release package-local --build --target-triple x86_64-pc-windows-msvc
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release package-local --build --target-triple x86_64-unknown-linux-gnu
pwsh ./scripts/release/package-local.ps1 -Build -TargetTriple x86_64-pc-windows-msvc
pwsh ./scripts/release/package-local.ps1 -Build -TargetTriple x86_64-unknown-linux-gnu
If the workspace cannot execute the packaged binary on the current host, package the prebuilt file directly and skip the runtime smoke:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- release package-local --target-triple x86_64-unknown-linux-gnu --source-binary .\target\x86_64-unknown-linux-gnu\release\aria2-rust-pro --skip-version-smoke
pwsh ./scripts/release/package-local.ps1 `
-TargetTriple x86_64-unknown-linux-gnu `
-SourceBinary .\target\x86_64-unknown-linux-gnu\release\aria2-rust-pro `
-SkipVersionSmoke
That flow supports current-workspace staging for non-host artifacts, but the runtime smoke must still be re-run on a compatible machine before calling the artifact release-ready.
Local deployment checklist
- Unpack the archive to a clean directory.
- Run the binary with
--versionand confirm the expected workspace version. - Compare the archive checksum with either
<archive>.sha256orSHA256SUMS.txt. - For container deployment, keep using the documented
docker/workflow plusxtask docker smoke,xtask docker smoke-local, orxtask docker export-local. The matchingscripts/docker/*.ps1files are compatibility wrappers for those Cargo-native commands. - For direct CLI deployment, provide the same config/session/runtime paths you already use for local compatibility testing.
Exporting a local Docker image tar
When the Docker daemon is available and a local image exists or can be built:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- docker export-local --build
pwsh ./scripts/docker/export-local.ps1 -Build
That command writes a tar archive, checksum files, and a manifest under:
dist\docker\v<version>\
The default tag is aria2-rust-pro:local. To export another tag:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- docker export-local --tag aria2-rust-pro:smoke
pwsh ./scripts/docker/export-local.ps1 -Tag aria2-rust-pro:smoke
Docker smoke checks
After packaging or deployment changes, run the Cargo-native Docker smokes from the repo root:
rtk cargo run --manifest-path .\xtask\Cargo.toml -- docker smoke-local
rtk cargo run --manifest-path .\xtask\Cargo.toml -- docker smoke --tag aria2-rust-pro:smoke
xtask docker smoke-local proves the entrypoint/config-generation path without
a Docker daemon. xtask docker smoke builds the image, starts a container,
checks generated config, and probes live JSON-RPC inside the running container.
The PowerShell scripts are compatibility wrappers around the same commands:
pwsh ./scripts/docker/smoke-local.ps1
pwsh ./scripts/docker/smoke.ps1 -Tag aria2-rust-pro:smoke
The daemon-backed wrapper also forwards -Build, -HostRpcPort,
-RpcSecret, and -SpecialMode to the matching xtask docker smoke options.
Self-hosted Gitea release verification
The self-hosted Gitea release workflow should be validated before cleaning up old runner records in the Gitea UI. Keep runner cleanup as an infrastructure follow-up, not part of the first release recovery step.
Use this order after CI has gone green on main:
- Trigger the release workflow with
workflow_dispatchand leavevalidation_only=true, or run the equivalent release commands on the runner host. Validation mode runs the release gates from the current ref and skips Gitea publishing, so it can test the runner without mutating an existing release. - Confirm the strict gate reaches the daemon-backed Docker smoke and that
xtask docker smokecompletes its JSON-RPC probe. - Confirm
xtask docker export-local --build --tag aria2-rust-pro:releasestages the Docker tar, manifest, andSHA256SUMS.txt. - For an actual tag-publish run, set
validation_only=falseor push a release tag, then confirmscripts/ci/publish-gitea-release.shcan create or update the Gitea release with all staged assets. - Only after the release workflow has passed, remove stale offline runner UI records that no longer correspond to the active runner.
Do not delete the active runner registration while release validation is still in progress. The current production runner identity should be confirmed from the latest passing Gitea Actions run before any old offline entry is removed. Do not move an already published tag just to validate the workflow; use the default no-publish validation mode instead.
Recovered runner evidence:
- release validation run 107 passed on commit
6d4956bwithvalidation_only=true; - push CI run 108 passed on the same commit;
- the release validation spent roughly 720 seconds in fast gates and 784 seconds in strict gates, while checkout, tool bootstrap, release package, and Docker export were short;
- no stale
GITEA-ACTIONScontainers or persisted temporary Gitea tokens should remain after runner-side validation.
Treat those timings as a baseline when optimizing the self-hosted runner. Prefer persistent Cargo registry/git cache or further runner-image prebaking before target-directory caching, because target caches can be polluted by toolchain, feature, and commit differences.
Scope and remaining release limits
These scripts are the active local release helpers:
- they stage host artifacts and Docker image tar exports from the current workspace;
- they do not, by themselves, certify that the current tree has reclosed every reopened modernization phase;
- archived release records are preserved only as historical evidence under
docs/archive/; - Docker image publication/signing still remains an external release-management
concern, while
export-local.ps1andxtask docker export-localstage a portable tar from the local daemon state underdist\docker\v<version>\.