Skip to content

ci: manual, decoupled tagging and npm publishing with append-only changelog - #110

Merged
Arthurk12 merged 3 commits into
bigbluebutton:developfrom
Arthurk12:ci/manual-release
Oct 15, 2026
Merged

Arthurk12 merged 3 commits into
bigbluebutton:developfrom
Arthurk12:ci/manual-release

Conversation

@Arthurk12

@Arthurk12 Arthurk12 commented Oct 15, 2026 •

Copy link
Copy Markdown
Member

What does this PR do?

  • Tag & Release (tag_and_release.yml):
    • Passes CHANGELOG.md as input-file, so the action generates only the new release and prepends it to the existing file instead of regenerating it from history.
    • Adds a generate_changelog input (off by default). When off, the action still bumps the version, commits, tags and runs the lockfile pre-commit hook, but writes no changelog (output-file: 'false').
    • Adds a release_type input (auto / patch / minor / major). Explicit types are forced through npm version + skip-bump; auto keeps inferring the bump from the commits.
    • Rejects auto while the version is 0.x.
    • Bumps softprops/action-gh-release from v1 to v3. The v1 runtime is too old for GitHub Actions to run; v3 only moves it to Node 24, and the inputs used here are unchanged.
  • Publish to NPM (publish.yml):
    • Removes the push: tags trigger; publishing is workflow_dispatch only.
    • Fails unless the run is started from a tag that matches the package.json version.

Closes Issue(s)

Closes none

Motivation

  • conventional-changelog-action keeps only the last 5 releases in CHANGELOG.md by default (release-count). Raising it means regenerating an ever-growing history on every release, and in both cases any entry edited by hand, or a hand-written changelog for the 0.x phase, gets overwritten. With input-file set, release-count is ignored and only the new release is generated (releaseCount is hardcoded to 1 in the action's generateFileChangelog).
  • During initial development (0.x) no changelog is wanted, but tags and npm releases should still go through CI to keep them consistent and free of manual mistakes. From 1.0.0 on, releases are run with generate_changelog enabled and the file is created on the first run.
  • The conventionalcommits preset bumps breaking changes to major even on 0.x, so an inferred bump with a single ! commit in the range would ship 1.0.0 by accident. While on 0.x the bump type must be chosen explicitly; after 1.0.0, auto works with no further changes.
  • Tagging and publishing should be independent, deliberate steps: pushing a tag should not publish to npm.

More

  • How to release:
    1. Run Tag & Release with release_type = patch/minor/major (required while on 0.x) and generate_changelog as needed.
    2. Run Publish to NPM choosing the new tag (e.g. v0.10.0) in "Use workflow from".
  • The Tag & Release workflow still calls sync-develop at the end. That is the main → develop back-merge PR, not publishing, so it was left unchanged.
  • Not run on GitHub Actions yet; actionlint 1.7.12 passes on both workflows.

The release workflow lets conventional-changelog-action regenerate
CHANGELOG.md from git history on every release. With its default
release-count of 5, releases older than the last five are dropped from
the file, and any entry edited by hand is overwritten. Raising
release-count only trades this for regenerating an ever-growing history
on each release, and still discards manual edits, such as a
hand-written changelog for the 0.x initial development phase.

Pass the changelog as input-file. The action then generates only the
new release and prepends it to the existing content, leaving older
entries untouched. Create an empty file when it is missing, since the
action reads input-file unconditionally; it is left without a title
because anything already in the file ends up below the prepended
release.
The release workflow always writes CHANGELOG.md and always infers the
version bump from the commits. During initial development (0.x) no
changelog is wanted, yet tags and releases should still go through the
workflow instead of being made by hand. Inference is also unsafe there:
the conventionalcommits preset bumps breaking changes to major even on
0.x, so a single `!` commit in the range would ship 1.0.0.

Add a generate_changelog input, off by default, that sets the action's
output-file to 'false' when disabled; the action still bumps, commits,
tags and runs the lockfile pre-commit hook, it just writes no file.
Add a release_type input that forces patch, minor or major through
`npm version` plus skip-bump, and reject 'auto' while the version is
0.x. Once 1.0.0 is out, 'auto' works without further changes.

Also bump softprops/action-gh-release from v1 to v3, since the v1
runtime is too old for GitHub Actions to run and the "Create GitHub
Release" step can't work as is. v3 only moves the runtime to Node 24;
the tag_name, body and generate_release_notes inputs used here are
unchanged.

A separate tag-and-push path built on `npm version` alone was
considered and discarded: it would skip the lockfile pre-commit hook
and duplicate what the action already does.
The publish workflow runs on every pushed v* tag, so pushing a tag
publishes to npm right away, without a deliberate decision to release
that version. Tagging and publishing should be independent steps, each
triggered by hand.

Drop the tag push trigger and keep workflow_dispatch only. Since a
manual run can now be started from any ref, fail unless it runs from a
tag matching the version in package.json, so a branch or a mismatched
tag is never published.
@Arthurk12
Arthurk12 merged commit a091a33 into bigbluebutton:develop Oct 15, 2026
2 checks passed
@Arthurk12
Arthurk12 deleted the ci/manual-release branch October 15, 2026 17:49
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.

1 participant