Releasing
playbooks/releasingChecked by automation only
Written 2026-10-18 by ktl-librarian (automation). Last checked 2026-10-27 by ktl-librarian (automation).
The full record
- Checks
- 2026-10-27 by
ktl-librarian(automation)
- 2026-10-27 by
- Sources
- Depends on
- Graph
- Open this concept in the knowledge graph
- IRI
https://w3id.org/ktl/registrar/knowledge/playbooks/releasing- Licence
- CC BY 4.0
- Files
- MarkdownJSON-LDSource on GitHubHistory on GitHub
Overview
Section titled “Overview”Nobody picks the version by hand. semantic-release.yml’s release job runs on every push to main, behind the release GitHub Environment. The required reviewers are configured in this repository’s own settings, not by the workflow file. The job runs these steps:
@semantic-release/commit-analyzercomputes the next version from Conventional Commits since the last tag.@semantic-release/execruns.github/scripts/changelog-release.mjsas itsverifyRelease,generateNotes, andpreparehooks. The script refuses the run if this repository’sCHANGELOG.md## [Unreleased]section is empty. Otherwise it uses that section as the release notes, then retitles it to a dated heading with a fresh empty one above.@semantic-release/npm(npmPublish: false) bumpspackage.jsonwithnpm version <ver> --no-git-tag-version. That triggers theversionscript, somanifest.jsonandversions.jsonupdate as a hand-runnpm versionwould update them..npmrc’stag-version-prefix=""applies, so the tag stays bare, because Obsidian matches a release to a plugin version by exact tag equality.@semantic-release/gitcommits those files.- semantic-release’s own core creates and pushes that bare tag.
The tool is installed at exact pinned versions inside the workflow, never added to package.json.
That push then invokes release.yml directly, through a workflow_call trigger beside its original push: tags: trigger. The extra trigger is needed because a tag pushed with the default GITHUB_TOKEN does not itself re-trigger another workflow’s push event (GitHub’s own loop prevention).
release.yml still works on its own for a hand-pushed tag, and keeps:
- its “Verify tag matches manifest version” step;
step-security/harden-runnerin audit mode;persist-credentials: false;- SHA-pinned actions;
permissions: {}, defaulting to a scopedcontents: write,id-token: writeandattestations: writeon the one job that needs them.
The release itself is still opened as a draft carrying main.js, manifest.json, and styles.css with build-provenance attestation, for manual review before publishing. That is a person’s checkpoint, and the Environment approval is a second one in front of it.
A pull_request-triggered plan job in semantic-release.yml previews every pull request into main with --dry-run: no write scope, no commit, no tag. So a malformed commit message or a broken exec script surfaces in review. When the commits would release, the same job refuses an empty ## [Unreleased] section and a pull request title with no releasing type (feat:, fix:, security: or a breaking !), because a squash merge takes its subject from the title.
main is protected, but not by a merge gate. SECURITY.md says main blocks deletion and force-pushes and requires linear history, and nothing more, and the skills repository’s threat model gives the reasons under Repository hardening.