bug(release): the Gitea twin's secrets-inherit-check reads .forgejo/workflows and matches only .forgejo spellings, so a Gitea adopter is never graded #1535
Labels
No labels
bump
major
bump
minor
bump
patch
kind
bug
kind
chore
kind
docs
kind
epic
kind
feature
loop/paused
mirror-drift
priority
critical
priority
high
priority
low
priority
medium
size
L
size
M
size
S
size
XL
status
blocked
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
frankenbit/release-toolkit#1535
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The Gitea twin of the release workflow runs
rt secrets-inherit-checkwith no directory argument. The verb then reads.forgejo/workflows, which a Gitea adopter does not have, so the step exits 2 on every Gitea cut and never grades the caller. Even pointed at.gitea/workflows, the check passes a caller that lackssecrets: inherit, because itsuses:pattern knows only the.forgejo/spelling.Measured
At origin/main
8086700:Why the twin did not catch it.
internal/giteatwin/giteatwin.go:44-45,107rewrites the YAML literal.forgejo/workflows/to.gitea/workflows/. The default directory lives in Go, not in the YAML, so the generator has nothing to rewrite. The step (050133a, #1258, 2026-09-06) landed three days after the generator (c31d531, #1092, 2026-09-03).Probes. I built
rtfrom origin/main8086700and ran it natively on Windows and as linux/amd64 ingolang:1.25. Each tree holds one callerrelease.ymlwith a job thatuses:the release reusable and has nosecrets: inherit..gitea/workflows/release.yml,uses: https://gitea.com/FrankenBit/release-toolkit/.gitea/workflows/reusable-release.yml@v0.63.1(the form indocs/integration.md:146)rt secrets-inherit-check, as the twin runs itError: read .forgejo/workflows: open .forgejo/workflows: no such file or directoryrt secrets-inherit-check .gitea/workflowsPASS — every caller of a secrets-needing release-toolkit reusable under .gitea/workflows passes secrets: inherit(false pass)frankenbit/release-toolkit/.gitea/workflows/reusable-release.yml@v0.63.1rt secrets-inherit-check .gitea/workflows.forgejo/workflows/release.yml,uses: frankenbit/release-toolkit/.forgejo/workflows/reusable-release.yml@v0.63.1rt secrets-inherit-check::warning::… job "release" calls reusable-release.yml without secrets: inherit …docs/integration.md:117,uses: https://gitea.com/FrankenBit/release-toolkit/.forgejo/workflows/reusable-release.yml@v0.63.1rt secrets-inherit-checkThe last row is the same regex at check.go:53, which is anchored on the short
frankenbit/…form and is case-sensitive. The guide recommends the absolute form for "the normal case" of an adopter whose instance does not carry the toolkit.What a Gitea adopter would see. On every release run, the step "check the caller's secrets: inherit wiring" prints the could-not-grade line above and exits 2. Because of
continue-on-error: truethe job goes on. The::warning::that #1258 exists to deliver never appears, whether or not the caller passessecrets: inherit:secrets: inheritis never told. By the warning's own text (#809), a pipeline onGITHUB_TOKENalone pushes with a token that cannot trigger downstream CI. That text was written for Forgejo; I did not measure Gitea's anti-recursion behaviour.I did not measure how Gitea renders a failed step under
continue-on-error.Who is affected today: nobody (latent). I read the five adopters' trees over the API on 2026-10-03:
.forgejo/workflows..gitea/workflows, but it holds onlydeploy.yml. Itsrelease.ymlis under.forgejo/workflows.Where Gitea reads workflows. Gitea's quickstart puts workflows "in the directory .gitea/workflows/ of the repository" (https://docs.gitea.com/usage/actions/quickstart, read 2026-10-03). The toolkit's own Gitea guidance (
docs/integration.md§②) and the twin set assume the same.Not covered by #1530. That consolidation keeps
reusable-release.ymland lists retiring the Gitea twins as out of scope.Why it matters
Gitea is a supported forge: the twin set,
gitea-twin-checkanddocs/integration.md§② exist for it. #1258 made a missingsecrets: inheritvisible because the failure it causes is silent. Every release looks like one that passed, but verification never ran. On Gitea that visibility is gone, and in its place is an error line that blames nothing in particular.Decision (for the implementer)
rt secrets-inherit-check .forgejo/workflows/. Right when the twin generator should carry it. The generator rewrites exactly that literal, so the twin would read.gitea/workflows/with no Go change for the directory. The verb accepts the trailing slash: on the control tree,rt secrets-inherit-check .forgejo/workflows/gave rc=1 with the warning..forgejo/workflows, then.gitea/workflows. Right if the verb is also run by hand on Gitea. It needs a rule for a tree that has both, as tmux-tell does.uses:pattern at check.go:53 needs the.gitea/spelling. Without it, (a) and (b) only turn an rc=2 into a false PASS.Acceptance criteria
.gitea/workflows/and nosecrets: inherit, the.giteatwin's step exits 1 with the::warning::. Withsecrets: inheritpresent it passes. Both the short and the absolute.gitea/spellings are graded.usesReusable(check.go:53) recognises the.gitea/workflows/spelling and the absolutehttps://<host>/<owner>/release-toolkit/…form, with the owner matched case-insensitively. Alternatively, auses:that namesrelease-toolkit/…/reusable-*.ymlin a form the pattern cannot pin is reported as could-not-grade, never as PASS..giteatwin's step, not a copy of it: run as written against a Gitea-shaped tree, it grades the caller.rt gitea-twin --checkpasses after regeneration.Out of scope
.forgejo/workflows(consumer-wrappersatcmd/rt/consumer_wrappers.go:19, andcheck-self-bootstrap's--workflows-dir). Neither is invoked from a.gitea/twin on origin/main, so neither reaches a Gitea adopter.continue-on-error, a disclosure, as #1258 decided..github/workflows/. Whether this forge would run one is not established (AGENTS.md section 14).Anchor
Found 2026-10-03 while reviewing PR #1531 / issue #1529, in the research on GitHub portability. The adopter-tree reads and the probes above were made the same day.