Skip to main content

reqsign-release

Release Apache Reqsign through the Apache RC, vote, dist, tag, crates.io, and announcement flow.

Source facts

Repository
apache/reqsign
Last source activity
October 5, 2026 at 04:24
Detected SKILL.md language
English
Stars
177
Forks
77

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
2 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
reqsign-release
description
Release Apache Reqsign through the Apache RC, vote, dist, tag, crates.io, and announcement flow.
# Apache Reqsign Release Skill Use this skill when preparing or executing an Apache Reqsign release. ## Hard Rules - Do not push the formal `vX.Y.Z` tag before the Apache vote passes. - The voted release candidate tag is `vX.Y.Z-rc.N`; it must be a signed tag. - The formal `vX.Y.Z` tag must point to the exact same commit as the voted RC tag, even if `main` has advanced after the vote started. - Every crate in the current publish plan must exist with the exact `apache/reqsign`, `release.yml`, `release` Trusted Publisher and `trustpub_only` enabled before creating the RC tag. - The repo release workflow publishes only formal `vX.Y.Z` tags. It uses short-lived GitHub OIDC credentials and never a long-lived crates.io token. - Source release artifacts live under Apache dist: - RC: `https://dist.apache.org/repos/dist/dev/reqsign/reqsign-X.Y.Z/` - Final: `https://dist.apache.org/repos/dist/release/reqsign/reqsign-X.Y.Z/` - If a wrong formal tag is pushed early, immediately cancel the Release workflow, delete the remote tag, and verify crates.io did not publish anything. ## Release Preparation 1. Sync live state. ```bash git fetch origin main --tags git status --short --branch git tag --list 'vX.Y.Z*' --sort=version:refname git ls-remote --tags origin 'refs/tags/vX.Y.Z*' svn ls https://dist.apache.org/repos/dist/dev/reqsign/reqsign-X.Y.Z/ || true svn ls https://dist.apache.org/repos/dist/release/reqsign/reqsign-X.Y.Z/ || true ``` 2. Prepare version bump on a PR. Typical version policy: - `reqsign`: patch bump, for example `0.20.0 -> 0.20.1`. - Crate with new public capability: minor bump, for example `reqsign-aliyun-oss 3.0.0 -> 3.1.0`. - Other workspace crates published in the same workspace release: patch bump. - Keep root `[workspace.dependencies]` version requirements aligned with each crate manifest. 3. Validate the publish plan and packages. ```bash python3 -m unittest discover \ -s .github/scripts/release_rust \ -p "test_*.py" python3 .github/scripts/release_rust/plan.py cargo publish --workspace --dry-run --allow-dirty ``` 4. Merge the version bump PR into `main`. Do not create the RC tag from an unmerged side branch unless the release manager explicitly accepts that the voted commit will not be on `main`. ## Bootstrap Rust Crates Wait until the intended crate-name set is present on the `apache/reqsign` `main` branch. The release manager chooses the exact reservation time, normally about three days before the planned release. At that time, check out the current `main` commit and run: ```bash release/scripts/bootstrap-rust-crates.sh ``` This command performs the transition to a bootstrapped publish plan. Run it without asking for a second confirmation after a PMC release manager explicitly chooses the reservation time. Do not run it for release status checks or dry-run planning. Publishing a `0.0.0` package is externally visible and irreversible, but it is a namespace reservation rather than an ASF software release. The helper: - Requires a clean checkout at the current `apache/reqsign` `main`. - Verifies that the `rust-bootstrap` environment has required reviewers. - Dispatches the input-free `bootstrap_rust_crates.yml` workflow. - Resolves the exact run, verifies its `headSha`, and waits for completion. - Blocks while the protected environment awaits PMC approval. - Verifies publicly that every crate in the checked publish plan exists and has `trustpub_only` enabled. The protected job authenticates ownership and audits the complete publish plan before any write. Established crates must already have exactly one Trusted Publisher with: - Repository owner: `apache` - Repository name: `reqsign` - Workflow filename: `release.yml` - Environment: `release` The job never changes an established crate. Migrate those crates through crates.io before using the bootstrap workflow and enable `trustpub_only` on each. For a missing name, the workflow publishes a dependency-free `0.0.0` placeholder, creates the expected Trusted Publisher, enables `trustpub_only`, and reconciles partial placeholders on rerun. ASF Infrastructure provisions the `release` and `rust-bootstrap` environments from `.asf.yaml`. A PMC release manager must add `CARGO_REGISTRY_BOOTSTRAP_TOKEN` to the `rust-bootstrap` environment. The token must have only the `publish-new` and `trusted-publishing` endpoint scopes, with crate scopes restricted to reqsign package names. Never expose it to the normal release workflow. Run the helper again if the publish plan gains another crate after a successful bootstrap. ## Create RC Tag Create the RC tag from the merged version-bump commit on `main`. Before tagging, confirm that the bootstrap workflow succeeded for the current publish plan and that no later commit added another crate. ```bash git fetch origin main --tags git switch --detach origin/main git tag -s vX.Y.Z-rc.N -m "vX.Y.Z-rc.N" git tag -v vX.Y.Z-rc.N git push origin vX.Y.Z-rc.N ``` The RC tag should not trigger the formal publish workflow. ## Build Source Artifact Create the Apache source artifact from the RC tag. ```bash rm -rf /tmp/reqsign-release-X.Y.Z mkdir -p /tmp/reqsign-release-X.Y.Z/dist git archive \ --format=tar.gz \ --prefix=apache-reqsign-X.Y.Z/ \ -o /tmp/reqsign-release-X.Y.Z/dist/apache-reqsign-X.Y.Z.tar.gz \ vX.Y.Z-rc.N cd /tmp/reqsign-release-X.Y.Z/dist gpg --armor --detach-sign apache-reqsign-X.Y.Z.tar.gz shasum -a 512 apache-reqsign-X.Y.Z.tar.gz > apache-reqsign-X.Y.Z.tar.gz.sha512 gpg --verify apache-reqsign-X.Y.Z.tar.gz.asc apache-reqsign-X.Y.Z.tar.gz shasum -a 512 -c apache-reqsign-X.Y.Z.tar.gz.sha512 tar -tzf apache-reqsign-X.Y.Z.tar.gz | rg '(^|/)LICENSE$|(^|/)NOTICE$|(^|/)Cargo.toml$' ``` Confirm the signing key is present in Apache Reqsign KEYS: ```bash svn cat https://dist.apache.org/repos/dist/release/reqsign/KEYS | rg 'xuanwo@apache.org|Xuanwo|KEY_FINGERPRINT' ``` ## Upload RC Artifacts Upload to Apache dev dist. ```bash rm -rf /tmp/reqsign-dist-dev-X.Y.Z svn co --depth=empty https://dist.apache.org/repos/dist/dev/reqsign /tmp/reqsign-dist-dev-X.Y.Z cd /tmp/reqsign-dist-dev-X.Y.Z mkdir reqsign-X.Y.Z cp /tmp/reqsign-release-X.Y.Z/dist/* reqsign-X.Y.Z/ svn add reqsign-X.Y.Z svn status svn commit --force-interactive -m "Prepare reqsign X.Y.Z release candidate" ``` Verify the remote copy: ```bash svn ls https://dist.apache.org/repos/dist/dev/reqsign/reqsign-X.Y.Z/ rm -rf /tmp/reqsign-verify-X.Y.Z svn co https://dist.apache.org/repos/dist/dev/reqsign/reqsign-X.Y.Z /tmp/reqsign-verify-X.Y.Z cd /tmp/reqsign-verify-X.Y.Z shasum -a 512 -c apache-reqsign-X.Y.Z.tar.gz.sha512 gpg --verify apache-reqsign-X.Y.Z.tar.gz.asc apache-reqsign-X.Y.Z.tar.gz ``` ## Start Vote Create a GitHub Discussion in `apache/reqsign` General. Confirm that the vote is forwarded to `dev@reqsign.apache.org` and that the mailing-list thread is linked from the Discussion before counting the voting period. Title: ```text [VOTE] Release Apache Reqsign X.Y.Z - Vote Round 1 ``` Body: ```text Hello, Apache Reqsign Community, This is a call for a vote to release Apache Reqsign version X.Y.Z. The release candidate: https://dist.apache.org/repos/dist/dev/reqsign/reqsign-X.Y.Z/ Keys to verify the release candidate: https://downloads.apache.org/reqsign/KEYS Git tag for the release candidate: https://github.com/apache/reqsign/releases/tag/vX.Y.Z-rc.N The tag points to commit: COMMIT_SHA Please download, verify, and test. The VOTE will be open for at least 72 hours and until the necessary number of votes are reached. - [ ] +1 approve - [ ] +0 no opinion - [ ] -1 disapprove with the reason Checklist for reference: - [ ] Download links are valid. - [ ] Checksums and signatures are valid. - [ ] LICENSE/NOTICE files exist. - [ ] No unexpected binary files. - [ ] All source files have ASF headers. - [ ] Can compile from source. Thanks, NAME ``` ## After Vote Passes 1. Verify vote state. Confirm at least three binding `+1` votes from Reqsign PMC members and no blocking `-1` votes. 2. Publish vote result. Create a GitHub Discussion in General. Title: ```text [RESULT][VOTE] Release Apache Reqsign X.Y.Z - Vote Round 1 ``` Body: ```text Hello, Apache Reqsign Community, The vote to release Apache Reqsign X.Y.Z has passed. The vote PASSED with N +1 binding votes, no +0 or -1 votes. Binding votes: - VOTER_1 - VOTER_2 - VOTER_3 Vote thread: VOTE_THREAD_URL Thanks, NAME ``` 3. Push the formal signed tag. Use the exact voted RC commit. ```bash git checkout vX.Y.Z-rc.N test "$(git rev-parse vX.Y.Z-rc.N^{})" = "COMMIT_SHA" git tag -s vX.Y.Z -m "vX.Y.Z" git tag -v vX.Y.Z git push origin vX.Y.Z ``` 4. Move ASF artifacts from dev to release. ```bash svn mv --force-interactive \ https://dist.apache.org/repos/dist/dev/reqsign/reqsign-X.Y.Z \ https://dist.apache.org/repos/dist/release/reqsign/reqsign-X.Y.Z \ -m "Release reqsign X.Y.Z" ``` 5. Monitor the GitHub Release workflow. ```bash gh run list --repo apache/reqsign --workflow Release --limit 5 gh run view RUN_ID --repo apache/reqsign --json status,conclusion,url,jobs ``` The workflow validates the complete workspace package set, then publishes crates in dependency order. Every package attempt receives a new OIDC-derived crates.io token that is revoked immediately afterward. Reruns skip versions already published by an earlier partial run. 6. Verify crates.io versions. ```bash for c in \ reqsign reqsign-core reqsign-aliyun-oss reqsign-aws-core reqsign-aws-v4 \ reqsign-aws-v4a reqsign-azure-storage \ reqsign-command-execute-tokio reqsign-file-read-tokio reqsign-google \ reqsign-http-send-reqwest reqsign-huaweicloud-obs reqsign-oracle \ reqsign-tencent-cos reqsign-volcengine-tos do cargo info "$c" --registry crates-io | sed -n '1,4p' done ``` 7. Create a GitHub Release. Use the formal tag and include source artifact links, notable changes, and crate versions. ## Recovery Notes - If `main` advances after the vote starts, formal `vX.Y.Z` still points to the RC commit, not latest `origin/main`. - If SVN authentication fails, retry with `--force-interactive`; run `svn cleanup` if a killed commit leaves the working copy locked. - If crates.io publishing fails after some packages succeed, rerun the exact formal-tag workflow. Do not create another tag or use a long-lived token; the publisher resumes after matching already-published versions. - If the bootstrap workflow fails, inspect the authenticated preflight first. It deliberately refuses to modify established crates or continue with unexpected repository or Trusted Publisher metadata.
View on GitHub