Documents the v<major> + v<major.minor.patch> dual-tag pattern so any future Claude session (or human) can make a release without re-deriving the conventions. Includes a local dry-run recipe and lists known consumers. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
rpm-changelog
Gitea composite action that generates an rpm %changelog entry from
git history and prepends it to a spec file. Designed to run during
release CI so the changelog never drifts out of sync with the code.
Why use this
Hand-maintained rpm %changelog sections drift. The day-of-week gets
stale, the version lags behind tags, and the description stops
matching what actually changed. This action:
- Finds the previous release tag (default pattern
v*). - Collects commits between that tag and
HEADviagit log. - Filters out noise (bump-version bot commits, merge commits — both configurable).
- Writes a fresh
%changelogentry with today's date, the release author, and the new version. - Prepends it to the spec file's existing
%changelogsection.
Because the date is generated at build time, rpmbuild will never
warn about bogus weekdays and the entry always reflects what changed
since the last release.
Requirements
The consumer workflow must check out the repo with full git history:
- uses: actions/checkout@v4
with:
fetch-depth: 0
Without this, git describe can't see prior tags and the entry will
default to "No user-visible changes" on every release.
Inputs
| Input | Required | Default | Description |
|---|---|---|---|
spec |
yes | — | Path to the rpm spec file to update. |
version |
yes | — | Version string for the new entry (without release suffix), e.g. 0.1.10. |
release |
no | 1 |
Release suffix to append after the version. |
author |
no | Gitea Actions <actions@git.lair.cafe> |
Name and email for the entry. |
tag-pattern |
no | v* |
Glob pattern for release tags, used to locate the previous release. |
exclude-patterns |
no | (see below) | Newline-separated grep -E patterns to drop from the generated log. |
Default exclude-patterns:
^- chore: bump version
^- Merge
Usage
jobs:
srpm:
runs-on: fedora
if: startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Determine version
id: version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT"
- name: Stamp version in spec
run: sed -i "s/^Version:.*/Version: ${{ steps.version.outputs.VERSION }}/" mypackage.spec
- name: Update changelog
uses: https://git.lair.cafe/actions/rpm-changelog@v1
with:
spec: mypackage.spec
version: ${{ steps.version.outputs.VERSION }}
- name: Build SRPM
run: rpmbuild -bs mypackage.spec --define "_sourcedir $(pwd)"
Note the fully-qualified URL in uses: — the Gitea instance's
DEFAULT_ACTIONS_URL points at github.com, so internal actions must
be referenced by absolute URL.
Versioning
Pin to a major version tag (@v1) for automatic patch/minor updates.
Pin to an exact tag (@v1.0.2) to freeze.
Behaviour notes
- If no previous tag matching
tag-patternexists (first release), the entry body becomes- No user-visible changes. - If the filter removes every commit (e.g. release contained only
bump-version chores), body is
- No user-visible changes. - The spec file must already contain a
%changelogline — the action will error out rather than mangle an unmarked file. - The date uses UTC (
date -u) so runners in different timezones produce deterministic output.