Repository navigation
Unify bindings release - #1952
Merged
Merged
Conversation
Collaborator
Coverage Report for CI Build 38438516368Coverage remained the same at 87.494%Details
Uncovered ChangesNo uncovered changes found. Coverage RegressionsNo coverage regressions found. Coverage Stats
💛 - Coveralls |
spacebear21
force-pushed
the
unify-bindings-release
branch
from
October 8, 2026 16:37
a63b6dd to
ad9fb34
Compare
The published native wrapper could use a different Rust revision from its generated bindings. Stage a package pinned to the generating checkout without development Cargo overlays or local lockfiles.
The Python, JavaScript, C#, and Dart packages each carried their own version sequence, so releasing all bindings took four tags and four approvals. Move every package to the payjoin-ffi version so one tag can name them all. 0.25.0 is above every existing sequence, so no registry sees a version go backwards. Keep the resolved dependency graphs unchanged. Let the Dart publish dry run proceed over pub's reminder that versions were skipped, since the jump is deliberate.
Each binding had its own tag, workflow, approval, and GitHub release, so shipping all four meant four signed tags and four approvals, and nothing checked that they wrapped the same payjoin-ffi commit. Push one signed payjoin-ffi-<version>+payjoin-<core> tag instead. A new workflow verifies the tag and that every manifest carries the tagged version, runs each language's existing build and smoke checks through workflow_call, then publishes each registry from its own job. The four publish jobs wait on every build so they reach the release environment together and one approval covers them; a registry failure is retried with "Re-run failed jobs" against the same tested artifacts, which is why there is no separate recovery path. One GitHub release carries every package and a single SHA256SUMS, with the canonical payjoin-ffi changelog section as its body. Keep the publish jobs in the triggered workflow rather than the language workflows because PyPI's trusted publisher rejects reusable workflows. Replace the per-language release-version readers with bindings-version.sh, which tag.sh and CI both run, and teach the invariants and changelog helpers the bracketed headings the binding changelogs use so payjoin-ffi passes the same checks as the crates. tag.sh also refuses to tag bindings whose wrapped core is not on crates.io, since Dart consumers build against it.
spacebear21
force-pushed
the
unify-bindings-release
branch
from
October 13, 2026 17:25
ad9fb34 to
00d9588
Compare
spacebear21
marked this pull request as ready for review
October 13, 2026 17:33
3 of 5 tasks
benalleng
approved these changes
Oct 14, 2026
benalleng
left a comment
Collaborator
There was a problem hiding this comment.
uTACK 00d9588
Nice that we can just use a single payjoin-ffi-<version>+payjoin-<core> tag to release them all at once.
Read through the scripts and actions to the best of my ability but I really think we need to YOLO a release at some point to actually test.
Collaborator
|
Should we try to get the registry configuration locked down before merge? |
benalleng
reviewed
Oct 14, 2026
|
|
||
| publish-javascript: | ||
| name: Publish to npmjs.com | ||
| needs: [verify-tag, python, javascript, csharp, dart, kotlin] |
Collaborator
There was a problem hiding this comment.
I think this is a duplicate wait for verify-tag I don't know if this actually does anything to make it different from the other workflows though since they block on verify-tag above
2 tasks done
1 of 3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release the Python, JavaScript, C#, and Dart bindings together from one signed
payjoin-ffi-<version>+payjoin-<core>tag, with one approval and one GitHubrelease, instead of four tags, four workflows, and four approvals.
Why
Each binding carried its own version sequence and its own tag-triggered publish
path. Shipping a core bump meant tagging four times, approving four times, and
nothing checked that the four packages wrapped the same
payjoin-fficommit.What changes
Three commits, each passing CI on its own:
prepare-publish.shnow stagesthe pub.dev package in a separate directory with the native crate pinned to
the generating checkout, excluding the development Cargo overlay and
lockfile. The staged package is what gets dry-run checked and published, so
the
revinnative/Cargo.tomlno longer has to be edited by hand.payjoin-ffiversion. 0.25.0 is above every existing sequence (Python andJavaScript 0.3.0, C# 0.2.0, Dart 0.3.0), so no registry sees a version go
backwards. No API changes.
payjoin-ffi/CHANGELOG.mdbecomes the canonicalchangelog; the language changelogs keep a short entry linking to it.
bindings-release.ymlverifies the signed tag, checks every manifest carriesthe tagged version (
contrib/release/bindings-version.sh, also run bytag.sh), runs the existing language workflows throughworkflow_call, thenpublishes each registry from its own job. The four publish jobs wait on every
build so they reach the
releaseenvironment together and one approvalcovers all of them. A failed registry is retried with "Re-run failed jobs"
against the same tested artifacts. One GitHub release holds every package and
a single
SHA256SUMS, with the FFI changelog section as its body.The per-language publish jobs, tag triggers,
release-version.shreaders, therelease-assets.ymlandverify-tag-hygiene.ymlwrappers, and theverify-tag-versionaction are removed. Net diff deletes more than it adds.a single
SHA256SUMS, with the FFI changelog section as its body.The per-language publish jobs, tag triggers,
release-version.shreaders, therelease-assets.ymlandverify-tag-hygiene.ymlwrappers, and theverify-tag-versionaction are removed. Net diff deletes more than it adds.Design notes
workflows because PyPI's trusted publisher rejects reusable workflows.
the crates, and both
tag.shand the CI verify job refuse to release bindingswhose wrapped
payjoinis not yet on crates.io, since Dart consumers buildagainst it.
-rc.Nonly. Python spells themrcN; npm publishes them tothe
nextdist-tag.payjoin-fficrate is not published to crates.io; the tag publishes onlythe language packages.
Before the first tag
Registry configuration moves with the workflow and needs a one-time update
(documented in
payjoin-ffi/RELEASING.md): PyPI, npm, and NuGet trustedpublishers to
bindings-release.ymlwith environmentrelease; pub.dev tagpattern to
payjoin-ffi-{{version}}; andpayjoin-ffi-*allowed in the tagrules.
Testing
shellcheck, shfmt, actionlint, prettier, and codespell pass on each commit. The
version checker, invariants checker, changelog extractor, and
tag.shdispatchwere exercised locally against the tree. The workflow itself can only be proven
by the first tag push; the single-approval behaviour relies on GitHub approving
per environment per run, and is worth watching on that first release.
This description and the branch were written with AI assistance (Claude Code)
and reviewed by me.
Reviewer: @benalleng or @chavic
Pull Request Checklist
Please confirm the following before requesting review: