Skip to content

ci(release): detect whether the latest release checksums are signed (#1327) - #1472

Merged
ajianaz merged 2 commits into
developfrom
ci/reminder-1-detect
Oct 15, 2026
Merged

ajianaz merged 2 commits into
developfrom
ci/reminder-1-detect

Conversation

@ajianaz

@ajianaz ajianaz commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator

What

Part 1 of 4 of the release-signature reminder (the earlier single PR #1463 was too large for the Cora reviewer and is being replaced by this series). This part is detection only.

scripts/release-signature-reminder.sh:

  • validates every argument (--dry-run is the only one) and the environment (GH_REPO/GITHUB_REPOSITORY, REMINDER_AFTER_HOURS including leading-zero values, gh and jq present)
  • reads the latest published release and validates the tag against ^v[0-9]+\.[0-9]+\.[0-9]+$ before it goes anywhere
  • ignores drafts, pre-releases, and releases with no checksums-sha256.txt.bundle (those cannot be signed by scripts/sign-release.sh)
  • decides whether the release has checksums-sha256.txt.minisig and prints <tag> is signed or <tag> is unsigned
  • has a mutate() helper for the later parts: --dry-run prints instead of running, and real calls get </dev/null

It does not touch issues yet, and it changes nothing on GitHub.

scripts/tests/release-signature-reminder.test.sh: 20 checks with a stub gh.

Why

Since #1462, uteke upgrade fails closed for a release without a .minisig, and the owner signs offline after each release. The reminder keeps that manual step from being forgotten. The series is small on purpose: each part stays within what the Cora CI reviewer can finish (it times out at 300 s on large diffs).

Series: 1 detect (this PR), 2 issue lifecycle, 3 close reminders for superseded releases, 4 workflow and docs. The workflow that actually runs the script comes last, so nothing is scheduled until the whole logic is in.

Testing

  • bash scripts/tests/release-signature-reminder.test.sh: 20 checks pass. They cover a bad-tag table (v1.2.3; rm -rf, v1.2.3-rc.1, ...), pre-release, draft, no bundle, signed, unsigned, unknown and repeated arguments, and the hours validation (08, non-numeric).
  • bash scripts/tests/sign-release.test.sh: passes. bash -n is clean on both scripts.
  • Dry run against the real repository: it reads the real releases/latest payload and reports v0.21.0 as unsigned. Nothing is mutated.
  • No workflow is added in this part, so nothing runs in CI beyond the normal checks.

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

🔍 Cora AI Code Review

✅ No issues found. Code looks good!


Review powered by cora-code · BYOK · MIT

command -v jq >/dev/null 2>&1 || { echo "error: jq is required" >&2; exit 2; }

# Run a mutating gh command, or only print it under --dry-run.
mutate() {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants