Release a Binary Ninja plugin from GitHub Actions.
Copy examples/release.yml to
.github/workflows/release.yml, then run Actions → Release → Run workflow.
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: Vector35/plugin_actions@v1
with:
version: ${{ inputs.version }}
description: ${{ inputs.description }}
dry-run: ${{ inputs.dry-run }}Leave version blank to increment its last component (1.3.5 → 1.3.6,
1.3 → 1.4). Leave description blank for generated release notes.
Try it safely:
gh workflow run release.yml -f dry-run=trueThe action:
- Checks out the default branch with all tags.
- Validates and normalizes
plugin.json. - Commits and pushes only that file.
- Tags the commit and creates the latest GitHub release.
If publication stops after the version commit, rerunning resumes it while that
commit remains HEAD. Recovery checks its author, message, and one-file diff.
Existing tags must point to that commit.
The action preserves version width and canonicalizes accepted legacy forms:
| Input | Output |
|---|---|
1.3.5 |
1.3.6 |
1.32 |
1.33 |
7 |
8.0 |
v1.4 |
1.4 |
1.3-2 |
1.3.2 |
It also repairs BOMs, trailing commas, legacy plugin nesting, camelCase
minimumBinaryNinjaVersion, and a missing pluginmetadataversion. A missing
minimum Binary Ninja version becomes the build number of the newest stable entry in
changelog.js. Invalid or unreachable
metadata fails before any commit.
Every existing tag is checked for version reuse.
| Input | Default | Meaning |
|---|---|---|
version |
blank | Explicit version; blank increments the current one. |
description |
blank | Release notes; blank generates them. |
plugin-json |
plugin.json |
Manifest path from the repository root. |
token |
${{ github.token }} |
Push and release token. |
checkout |
true |
Let this action check out the repository. |
dry-run |
false |
Validate without committing or publishing. |
Outputs: version, previous, tag, and url (url is blank on dry runs).
Use a full checkout of the default branch:
- uses: actions/checkout@v7
with:
ref: ${{ github.event.repository.default_branch }}
fetch-depth: 0
submodules: recursive
- uses: Vector35/plugin_actions@v1
with:
checkout: falseProtected default branches must allow github-actions[bot] to push. Keep the
example workflow's concurrency guard to prevent release races.
@v1 follows compatible fixes. Use @v1.0.1 or a commit SHA for an exact pin.
python3 -m unittest discover -s tests -v
python3 scripts/prepare_release.py --checkMIT. See LICENSE.